为paramiko会话设置会话变量

2024-04-29 18:49:26 发布

您现在位置:Python中文网/ 问答频道 /正文

有人知道如何注册环境变量吗 使用SSHClient时执行命令调用?

我使用的是一个基本脚本,它实例化SSHClient类,使用connect方法连接到另一台计算机,然后使用exec_命令方法发送命令。但是,当我试图发出命令时,似乎没有注册任何环境变量。我可以做一些基本的事情,比如'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作为示例,但实际的后续命令不同。


Tags: 方法命令paramikoconnectstderrstdinstdout环境变量
3条回答

从2.1.0版2016-12-09开始,您可以将环境变量字典添加到exec_命令中:

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_电话和LC_测量?因为这是目标主机的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.htmlhttp://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
#!/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')

你试过那样的东西吗?

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

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

相关问题 更多 >