使用 Paramiko 时的环境变量差异
Environment variable differences when using Paramiko
我正在通过终端(在 Mac 上)和 运行 Paramiko Python 脚本连接到 SSH,由于某种原因,这两个会话的行为似乎不同。在这些情况下,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())
知道为什么环境变量不同吗?
我该如何解决?
SSHClient.exec_command
默认不为会话分配伪终端。因此,(可能)获取了一组不同的启动脚本(特别是对于非交互式会话,.bash_profile
未获取)。 And/or 根据 TERM
的 absence/presence 环境变量,采用脚本中的不同分支。
要使用 ssh
模拟默认的 Paramiko 行为,请使用 -T
开关:
ssh -T myuser@host
参见 ssh
man:
-T
Disable pseudo-tty allocation.
相反,要使用 Paramiko 模拟默认的 ssh
行为,请将 exec_command
的 get_pty
参数设置为 True
:
def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False):
虽然不是通过在 Paramiko 中分配伪终端来解决这个问题,您最好修复您的启动脚本,为所有会话设置相同的 PATH
。
请参阅 。
使用 Channel
对象而不是 SSHClient
对象解决了我的问题。
chan=ssh.invoke_shell()
chan.send('echo $PATH\n')
print (chan.recv(1024))
有关详细信息,请参阅 documentation
我正在通过终端(在 Mac 上)和 运行 Paramiko Python 脚本连接到 SSH,由于某种原因,这两个会话的行为似乎不同。在这些情况下,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())
知道为什么环境变量不同吗?
我该如何解决?
SSHClient.exec_command
默认不为会话分配伪终端。因此,(可能)获取了一组不同的启动脚本(特别是对于非交互式会话,.bash_profile
未获取)。 And/or 根据 TERM
的 absence/presence 环境变量,采用脚本中的不同分支。
要使用 ssh
模拟默认的 Paramiko 行为,请使用 -T
开关:
ssh -T myuser@host
参见 ssh
man:
-T
Disable pseudo-tty allocation.
相反,要使用 Paramiko 模拟默认的 ssh
行为,请将 exec_command
的 get_pty
参数设置为 True
:
def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False):
虽然不是通过在 Paramiko 中分配伪终端来解决这个问题,您最好修复您的启动脚本,为所有会话设置相同的 PATH
。
请参阅
使用 Channel
对象而不是 SSHClient
对象解决了我的问题。
chan=ssh.invoke_shell()
chan.send('echo $PATH\n')
print (chan.recv(1024))
有关详细信息,请参阅 documentation