使用pxssh进入远程服务器运行unix命令(如正常运行时间)时,我遇到了以下错误
Traceback (most recent call last):
文件“./ssh_pxssh.py”,第33行,in login_remote(主机名,用户名,密码) 在login_remote中输入第12行的文件“./ssh_pxssh.py” 如果不是s.login(主机名,用户名,密码): 文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/pexpect/pxssh.py”,第278行,登录
**raise ExceptionPxssh ('could not synchronize with original prompt')
pexpect.pxssh.ExceptionPxssh:无法与原始提示同步**
第33行是我在main中调用此函数的地方。
我正在使用的功能是:
def login_remote(hostname, username, password):
s = pxssh.pxssh()
s.force_password = True
if not s.login(hostname, username, password, auto_prompt_reset=False):
print("ssh to host :"+ host + " failed")
print(str(s))
else:
print("SSH to remote host " + hostname + " successfull")
s.sendline('uptime')
s.prompt()
print(s.before)
s.logout()
每次运行脚本时都不会出现错误。相反,它是间歇性的。我运行脚本的次数达到了7次。
答案 0 :(得分:1)
我已经通过在登录函数中添加 sync_multiplier 参数解决了该问题。
formDetails
请注意, sync_multiplier 是执行成功同步的通信超时参数。它会尝试读取提示至少 sync_multiplier 秒。 此方法最坏的情况是 sync_multiplier * 3秒。
我个人设置了sync_multiplier = 2,但这取决于我所使用的系统上的通信速度。
答案 1 :(得分:0)
当pxssh尝试以非常慢的连接登录时,我遇到了同样的问题。 pexpect lib显然被远程motd提示所欺骗。
这个远程motd提示符包含一个uname -svr提示符,其中包含一个#字符。 显然,pexpect看起来像是一个提示。从那时起,lib与ssh会话不再一致。
以下解决方法对我有用: 只需删除/var/run/motd.dynamic(debian)中的#char,或者删除/ var / run / motd(ubuntu)。
另一个解决方案是让ssh在登录时不提示motd。但这不适合我: 我添加了以下内容: PrintMotd没有 在/ etc / ssh / sshd_config中 =>不工作
另一种解决方法: 在主目录中创建一个文件: 〜目录中的.hushlogin