rea*_*ash 7 python ssh ubuntu paramiko
有没有人知道如何在使用SSHClient时为exec_command调用注册环境变量?
我正在使用一个实例化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()
Run Code Online (Sandbox Code Playgroud)
注意:我无法在paramiko中更改我的目录.我cd在followup命令中附加了一个命令ssh.exec_command('cd /dddd/ddd;ls').我给出ls了一个例子,但我的实际后续命令是不同的.
从2016年2月1日发行的版本2.1.0开始,您可以将环境变量字典添加到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()
Run Code Online (Sandbox Code Playgroud)
输出:
ET_HOME
...
MILES_APART
Run Code Online (Sandbox Code Playgroud)
但是,为什么我选择LC_TELEPHONE和LC_MEASUREMENT?因为这是目标主机的ssh配置允许我设置的少数几个环境中的两个:
grep AcceptEnv /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
换句话说,这不起作用:
env_dict={"HELLO":"WORLD","GOODBYE":"CRUEL_WORLD"}
stdin , stdout, stderr = ssh.exec_command("echo $HELLO; echo '...'; echo $GOODBYE")
print stdout.read()
Run Code Online (Sandbox Code Playgroud)
输出:
...
Run Code Online (Sandbox Code Playgroud)
如文档警告所述,环境变量会被静默拒绝 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()
Run Code Online (Sandbox Code Playgroud)
输出:
# begin .set_env
HELLO="WORLD"
GOODBYE="CRUEL_WORLD"
# end .set_env
WORLD
...
CRUEL_WORLD
Run Code Online (Sandbox Code Playgroud)
#!/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()
Run Code Online (Sandbox Code Playgroud)
这一切对我来说都很好。如果您有特殊的环境变量,您可能必须在远程命令提示符下设置它们。如果您将变量写入 myENV 文件然后调用,也许会有所帮助
stdin,stdout,stderr = client.exec_command('source ./myEnv')
你尝试过类似的事情吗?
| 归档时间: |
|
| 查看次数: |
5293 次 |
| 最近记录: |