Paramiko - ssh 到控制台服务器,必须点击 return 脚本才能继续
Paramiko - ssh to console server, having to hit return for script to continue
仅使用我的第一个 paramiko 脚本,我们就有了一个 opengear 控制台服务器,所以我正在尝试自动设置我们插入的任何设备。
open gear 侦听端口上的 ssh 连接,例如端口 1 中的设备将是 3001。我正在连接到端口 8 上的设备,它可以工作并且我的脚本 运行s,但是对于出于某种原因,在收到 "Interactive SSH session established" 消息后,我需要在会话上点击 return 以使其成为 运行 (所以我有一个 ssh 会话,脚本也有,它是共享的) .
它只是在那里等待,直到我点击 return,我已经尝试发送 return,如您所见,但它们不起作用,只有手动 return 有效,这很奇怪,因为从技术上讲它们是同一回事?
import paramiko
import time
def disable_paging(remote_conn):
'''Disable paging on a Cisco router'''
remote_conn.send("terminal length 0\n")
time.sleep(1)
# Clear the buffer on the screen
output = remote_conn.recv(1000)
return output
if __name__ == '__main__':
# VARIABLES THAT NEED CHANGED
ip = '192.168.1.10'
username = 'root'
password = 'XXXXXX'
port = 3008
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
# initiate SSH connection
remote_conn_pre.connect(ip, username=username, password=password,port=port, look_for_keys=False, allow_agent=False)
print "SSH connection established to %s" % ip
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
print "Interactive SSH session established"
time.sleep(1)
remote_conn.send("\n")
# Strip the initial router prompt
#output = remote_conn.recv(1000)
# See what we have
#print output
# Turn off paging
#disable_paging(remote_conn)
# clear any config sessions
is_global = remote_conn.recv(1024)
if ")#" in is_global:
remote_conn.send("end\n")
time.sleep(2)
# if not in enable mode go to enable mode
is_enable = remote_conn.recv(1024)
if ">" in is_enable:
remote_conn.send("enable\n")
time.sleep(1)
remote_conn.send("conf t\n")
remote_conn.send("int g0/0/1\n")
remote_conn.send("ip address 192.168.1.21 255.255.255.0\n")
remote_conn.send("no shut\n")
remote_conn.send("end\n")
# Wait for the command to complete
time.sleep(2)
remote_conn.send("ping 192.168.1.1\n")
time.sleep(1)
output = remote_conn.recv(5000)
print output
先发送一些命令"ls -ltr\n"然后调用sleep
remote_conn.send("ls -ltr\n")
time.sleep(1)
在调试器中尝试 运行 您的命令,找出哪一行正在等待输入。如果只是 \n,您也可以尝试发送 \r 或 \r\n。记住回车键真的是^M
您也可以尝试打开详细日志记录。
import logging
# ...
logging.getLogger("paramiko").setLevel(logging.DEBUG)
我试过了,看到了
is_global = remote_conn.recv(1024)
挂起,
您确定“192.168.1.10”发送了要接收的内容吗?
尝试设置超时
remote_conn.settimeout(3)
例如3秒,在这行之后做:
remote_conn = remote_conn_pre.invoke_shell()
这样 recv func 不会挂起并在超时到期时继续
适合我
我找到了另一个模块 (netmiko),它完全符合我的要求并进行了所有这些检查。当别人已经做得更好时,我就放弃了尝试自己做。
使用Netmiko! :)
仅使用我的第一个 paramiko 脚本,我们就有了一个 opengear 控制台服务器,所以我正在尝试自动设置我们插入的任何设备。
open gear 侦听端口上的 ssh 连接,例如端口 1 中的设备将是 3001。我正在连接到端口 8 上的设备,它可以工作并且我的脚本 运行s,但是对于出于某种原因,在收到 "Interactive SSH session established" 消息后,我需要在会话上点击 return 以使其成为 运行 (所以我有一个 ssh 会话,脚本也有,它是共享的) .
它只是在那里等待,直到我点击 return,我已经尝试发送 return,如您所见,但它们不起作用,只有手动 return 有效,这很奇怪,因为从技术上讲它们是同一回事?
import paramiko
import time
def disable_paging(remote_conn):
'''Disable paging on a Cisco router'''
remote_conn.send("terminal length 0\n")
time.sleep(1)
# Clear the buffer on the screen
output = remote_conn.recv(1000)
return output
if __name__ == '__main__':
# VARIABLES THAT NEED CHANGED
ip = '192.168.1.10'
username = 'root'
password = 'XXXXXX'
port = 3008
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in your environment)
remote_conn_pre.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
# initiate SSH connection
remote_conn_pre.connect(ip, username=username, password=password,port=port, look_for_keys=False, allow_agent=False)
print "SSH connection established to %s" % ip
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
print "Interactive SSH session established"
time.sleep(1)
remote_conn.send("\n")
# Strip the initial router prompt
#output = remote_conn.recv(1000)
# See what we have
#print output
# Turn off paging
#disable_paging(remote_conn)
# clear any config sessions
is_global = remote_conn.recv(1024)
if ")#" in is_global:
remote_conn.send("end\n")
time.sleep(2)
# if not in enable mode go to enable mode
is_enable = remote_conn.recv(1024)
if ">" in is_enable:
remote_conn.send("enable\n")
time.sleep(1)
remote_conn.send("conf t\n")
remote_conn.send("int g0/0/1\n")
remote_conn.send("ip address 192.168.1.21 255.255.255.0\n")
remote_conn.send("no shut\n")
remote_conn.send("end\n")
# Wait for the command to complete
time.sleep(2)
remote_conn.send("ping 192.168.1.1\n")
time.sleep(1)
output = remote_conn.recv(5000)
print output
先发送一些命令"ls -ltr\n"然后调用sleep
remote_conn.send("ls -ltr\n")
time.sleep(1)
在调试器中尝试 运行 您的命令,找出哪一行正在等待输入。如果只是 \n,您也可以尝试发送 \r 或 \r\n。记住回车键真的是^M
您也可以尝试打开详细日志记录。
import logging
# ...
logging.getLogger("paramiko").setLevel(logging.DEBUG)
我试过了,看到了
is_global = remote_conn.recv(1024)
挂起, 您确定“192.168.1.10”发送了要接收的内容吗? 尝试设置超时
remote_conn.settimeout(3)
例如3秒,在这行之后做:
remote_conn = remote_conn_pre.invoke_shell()
这样 recv func 不会挂起并在超时到期时继续
适合我
我找到了另一个模块 (netmiko),它完全符合我的要求并进行了所有这些检查。当别人已经做得更好时,我就放弃了尝试自己做。
使用Netmiko! :)