我在使用 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)
每次运行脚本时都不会出现该错误。相反,它是间歇性的。我运行脚本时,十次中有七次出现这种情况。
当 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