2013-02-12 270 views
6

有谁知道如何使环境变量注册为 exec_command调用时使用SSHClient?设置会话变量为paramiko会话

我正在使用基本脚本实例化SSHClient类,使用connect方法连接到另一台计算机,然后使用exec_command方法发出命令。但是,当我尝试发出命令时,似乎没有任何环境变量被注册。我可以做'ls'等基本的东西并看到stdout,但是当试图运行已安装的程序时,环境变量缺失的事实使得它们无法运行。在命令行中使用ssh执行相同的操作,因为用户的环境变量已设置。

#!/usr/bin/python 
import paramiko 

ssh.connect('mymachine',username='myname',password='pass')  
stdin,stdout,stderr=ssh.exec_command('cd /myfolder/path') 
stdin,stdout,stderr=ssh.exec_command('ls') 

.... 

.... 

ssh.close() 

注意:我无法在paramiko中更改我的目录。我在单个ssh.exec_command('cd /dddd/ddd;ls')后续命令中追加了cd命令。我以ls为例,但我的实际跟进命令不同。

+0

您是否试过通过['os.environ'](http://docs.python.org/2/library/os.html#os.environ)添加它们? – mgilson 2013-02-12 13:59:04

+0

我正在设置'TZ'env变量以及:我们如何使用'os.environ'设置'TZ'env变量,如果'paramiko'中不支持?谢谢。 – 2014-01-04 20:39:41

回答

1
#!/usr/bin/python 
import paramiko 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.WarningPolicy) 
client.connect(myhostname, theport, myuser, thepass) 
stdin,stdout,stderr = client.exec_command('cd /tmp;pwd;ls -al') 
#returns your output 
print stdout.read() 

这对我来说都很好。如果你有特殊的环境变量,你可能需要在远程命令提示符下设置它们。也许,如果你写的 变量输入myENV文件,然后调用

stdin,stdout,stderr = client.exec_command('source ./myEnv')

你有没有尝试过类似的东西,它可以帮助?

+1

不适用于我。从这里可以看出http://stackoverflow.com/questions/19938993/python-using-env-variables-of-remote-host-with-ssh窍门是把它写在一个client.exec_command('source $ PROFILE ; CommandToExcecute') – Mrlenny 2015-08-25 13:43:04

1

您可以:client.exec_command(..., get_pty=True)

这将使paramiko分配一个伪终端,类似于ssh

1

自发布2.1.0 2016年12月9日,你可以可变字典添加一个环境到exec_command

import paramiko 
paramiko.util.log_to_file("paramiko.log") 
ssh = paramiko.SSHClient() 
k = paramiko.RSAKey.from_private_key_file("<private_key_file>") 
ssh.connect(<hostname>,username=<username>,pkey=k) 
env_dict={"LC_TELEPHONE":"ET_HOME","LC_MEASUREMENT":"MILES_APART"} 
stdin , stdout, stderr = ssh.exec_command('echo $LC_TELEPHONE; echo "..."; echo $LC_MEASUREMENT',environment=env_dict) 
print stdout.read() 

输出:

ET_HOME 
... 
MILES_APART 

但是为什么我选择LC_TELEPHONE和LC_MEASUREMENT?因为这是两个为数不多的环境目标主机的SSH配置可以让我设置:

grep AcceptEnv /etc/ssh/sshd_config 

输出:

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES 
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT 
AcceptEnv LC_IDENTIFICATION LC_ALL 

换句话说,这不起作用:

env_dict={"HELLO":"WORLD","GOODBYE":"CRUEL_WORLD"} 
stdin , stdout, stderr = ssh.exec_command("echo $HELLO; echo '...'; echo $GOODBYE") 
print stdout.read() 

输出:

... 

随着文档警告说,环境变量默默拒绝 http://docs.paramiko.org/en/2.1/api/client.html http://docs.paramiko.org/en/2.1/api/channel.html#paramiko.channel.Channel.set_environment_variable

如果你无法控制目标服务器的sshd的配置,把环境变量到一个文件和采购工作原理:

stdin , stdout, stderr = ssh.exec_command("cat .set_env;source .set_env; echo $HELLO; echo '...'; echo $GOODBYE") 
print stdout.read() 

输出:

# begin .set_env 
HELLO="WORLD" 
GOODBYE="CRUEL_WORLD" 
# end .set_env 
WORLD 
... 
CRUEL_WORLD 
+0

我无法在exec_command中找到环境参数,它显示在文档中,但我没有在client.py的exec_command中看到它 – Cas 2018-02-06 02:07:30