pxssh 错误“无法与原始提示同步”

use*_*660 5 python-3.x

我在使用 pxssh 进入远程服务器运行 unix 命令(如 uptime )时收到以下错误

Traceback (most recent call last):
Run Code Online (Sandbox Code Playgroud)

文件“./ssh_pxssh.py”,第33行,在login_remote(主机名,用户名,密码)中 文件“./ssh_pxssh.py”,第12行,在login_remote中,如果不是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')
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

每次运行脚本时都不会出现该错误。相反,它是间歇性的。我运行脚本时,十次中有七次出现这种情况。

LM.*_*sez 1

当 pxssh 尝试在非常慢的连接上登录时,我遇到了同样的问题。pexpect lib 显然被远程 motd 提示符愚弄了。

该远程 motd 提示符包含一个 uname -svr 提示符,该提示符本身包含一个 # 字符。显然,pexpect 将其视为提示。从那时起,该库不再与 ssh 会话保持一致。

以下解决方法对我有用:只需删除 /var/run/motd.dynamic (debian) 或 /var/run/motd (ubuntu) 中的 # 字符。

另一个解决方案是要求 ssh 在登录时不提示 motd。但这对我不起作用:我添加了以下内容: /etc/ssh/sshd_config 中没有 PrintMotd => 不起作用

另一种解决方法:在主目录中创建一个文件:~ 目录中的 .hushlogin