猿问

使用Paramiko时环境变量的差异

我正在通过终端(在Mac上)连接到SSH并运行Paramiko Python脚本,由于某种原因,会话的行为似乎有所不同。


该PATH环境变量,在这两种情况下的不同


这是我运行的代码:


import paramiko

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('host', username='myuser',password='mypass')

stdin, stdout, stderr =ssh.exec_command('echo $PATH')

print (stdout.readlines())

知道为什么环境变量不同吗?


我该如何解决?


蓝山帝景
浏览 1514回答 3
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”。

暮色呼如

使用Channel对象而不是SSHClient对象解决了我的问题。chan=ssh.invoke_shell()chan.send('echo $PATH\n')print (chan.recv(1024))有关更多详细信息,请参见文档

明月笑刀无情

尽管这确实有帮助,但答案无法解释原因。Channel与vs.&nbsp;无关SSHClient。在SSHClient使用Channel内部。不同之处在于您的原始代码使用“ exec”通道,默认情况下不分配伪终端。新代码使用“外壳”通道时,默认情况下会分配一个伪终端。使用shell执行命令不是一个好习惯。同样,将帐户配置为PATH对交互式和非交互式终端使用不同的帐户通常是一个不好的做法。
随时随地看视频慕课网APP

相关分类

Python
我要回答