3 回答
TA贡献1798条经验 获得超3个赞
在SSHClient.exec_command默认情况下不分配会话的伪终端。结果是(可能)获得了一组不同的启动脚本(特别是对于非交互式会话,.bash_profile则没有获得)。基于缺少/存在TERM环境变量,在脚本中采用和/或采用不同的分支。
要使用来模拟默认的Paramiko行为ssh,请使用-T开关:
ssh -T myuser@host
见ssh男人:
-T 禁用伪tty分配。
相反,要ssh使用Paramiko 模拟默认行为,请将的get_pty参数设置exec_command为True:
def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False):
尽管不要通过在Paramiko中分配伪终端来解决此问题,但最好将启动脚本设置为PATH对所有会话都设置相同。
为此,请参见使用Python Paramiko exec_command执行某些Unix命令会失败,并显示“ <command> not found”。
TA贡献1853条经验 获得超9个赞
使用Channel对象而不是SSHClient对象解决了我的问题。
chan=ssh.invoke_shell()
chan.send('echo $PATH\n')
print (chan.recv(1024))
有关更多详细信息,请参见文档
TA贡献1828条经验 获得超4个赞
尽管这确实有帮助,但答案无法解释原因。Channel
与vs. 无关SSHClient
。在SSHClient
使用Channel
内部。不同之处在于您的原始代码使用“ exec”通道,默认情况下不分配伪终端。新代码使用“外壳”通道时,默认情况下会分配一个伪终端。使用shell执行命令不是一个好习惯。同样,将帐户配置为PATH
对交互式和非交互式终端使用不同的帐户通常是一个不好的做法。
添加回答
举报