为了账号安全,请及时绑定邮箱和手机立即绑定

使用Paramiko时环境变量的差异

使用Paramiko时环境变量的差异

蓝山帝景 2019-10-22 22:08:11
我正在通过终端(在Mac上)连接到SSH并运行Paramiko Python脚本,由于某种原因,会话的行为似乎有所不同。该PATH环境变量,在这两种情况下的不同这是我运行的代码:import paramikossh = 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())知道为什么环境变量不同吗?我该如何解决?
查看完整描述

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”。


查看完整回答
反对 回复 2019-10-22
?
暮色呼如

TA贡献1853条经验 获得超9个赞

使用Channel对象而不是SSHClient对象解决了我的问题。


chan=ssh.invoke_shell()

chan.send('echo $PATH\n')

print (chan.recv(1024))

有关更多详细信息,请参见文档


查看完整回答
反对 回复 2019-10-22
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 1513 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信