【问题标题】:setting session variable for paramiko session为 paramiko 会话设置会话变量
【发布时间】:2013-01-27 20:38:08
【问题描述】:

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

我正在使用一个基本脚本来实例化 SSHClient 类,使用 connect 方法连接到另一台计算机,然后使用 exec_command 方法发送命令。但是,当我尝试发出命令时,似乎没有注册任何环境变量。我可以做一些基本的事情,比如“ls”并查看标准输出,但是在尝试运行已安装的程序时,缺少环境变量的事实使得无法运行它们。在命令行中使用 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 为例,但我的实际后续命令不同。

【问题讨论】:

  • 您是否尝试通过os.environ添加它们?
  • 我也在寻找设置“TZ”环境变量:|如果paramiko 不支持,我们如何使用os.environ 设置'TZ' 环境变量?谢谢。

标签: python ubuntu ssh paramiko


【解决方案1】:

自 2.1.0 2016-12-09 发布以来,您可以将环境变量字典添加到 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

【讨论】:

  • 我在 exec_command 中找不到环境参数,它显示在文档中,但我在 client.py 的 exec_command 中没有看到它
  • paramiko 中有两个exec_command 方法。有client.exec_command,然后有channel.exec_command。第一个 client.exec_command 有参数。第二个没有。
  • 无论如何,由于默认配置中的 sshd 拒绝大多数环境变量,exec_command(environment=) 不是可行的方法,除非您需要设置的环境与语言环境相关(这些往往被接受)。
【解决方案2】:
#!/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')

你尝试过类似的方法吗?

【讨论】:

【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多