为paramiko会话设置会话变量

时间:2013-02-12 13:58:09

标签: python ubuntu ssh paramiko

有谁知道如何注册环境变量 exec_command在使用SSHClient时调用?

我正在使用一个实例化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中更改我的目录。我在后续命令中将cd命令附加在单个ssh.exec_command('cd /dddd/ddd;ls')中。我以ls为例,但我的实际跟进命令不同。

3 个答案:

答案 0 :(得分:3)

自2016年12月2日发布以来,您可以将环境变量字典添加到 exec_command

weak

输出:

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()

但为什么我选择LC_TELEPHONE和LC_MEASUREMENT?因为这些是目标主机的ssh配置允许我设置的少数环境中的两个:

ET_HOME
...
MILES_APART

输出:

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()

答案 1 :(得分: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')

你有没有尝试过类似的东西?

答案 2 :(得分:1)

你可以这样做:client.exec_command(..., get_pty=True)

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