Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Paramiko时的环境变量差异_Python_Ssh_Environment Variables_Paramiko - Fatal编程技术网

Python 使用Paramiko时的环境变量差异

Python 使用Paramiko时的环境变量差异,python,ssh,environment-variables,paramiko,Python,Ssh,Environment Variables,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') s

我通过终端(在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())
知道为什么环境变量不同吗


如何修复它?

默认情况下,
SSHClient.exec\u命令不为会话分配伪终端。因此,(可能)会获得一组不同的启动脚本(特别是对于非交互式会话,
.bash\u profile
未获得)。根据
术语
环境变量的缺失/存在,在脚本中采用和/或不同的分支


要使用
ssh
模拟默认的Paramiko行为,请使用
-T
开关:

ssh -T myuser@host
见:

-T
禁用伪tty分配


相反,要使用Paramiko模拟默认的
ssh
行为,请将
exec_命令的
get_pty
参数设置为
True

def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False):

虽然您不应该通过在Paramiko中分配伪终端来解决这个问题,但您最好修复启动脚本,为所有会话设置相同的
路径


请参见。

使用
频道
对象而不是
SSHClient
对象解决了我的问题

chan=ssh.invoke_shell()
chan.send('echo $PATH\n')
print (chan.recv(1024))

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

,虽然这确实有帮助,但答案无法解释原因。它不是关于
频道
SSHClient
的对比。
SSHClient
在内部使用
频道。区别在于您的原始代码使用“exec”通道,默认情况下,该通道不分配伪终端。而您的新代码使用“shell”通道,默认情况下,该通道分配一个伪终端。使用shell执行命令不是一种好的做法。同样,将您的帐户配置为对交互式和非交互式终端使用不同的
路径通常是一种不好的做法。我尝试了您的code,因为即使我的ec2中有pandas这样的模块,exec_命令也没有导入它们。即使是刚刚编写了一个新文件的小py文件也不能与您的代码一起工作。如何从上述方法中恢复错误