【问题标题】:Setting Environment Variables with Paramiko [duplicate]使用 Paramiko 设置环境变量 [重复]
【发布时间】:2018-06-05 07:07:04
【问题描述】:

我在本地使用 paramiko 将 ssh 连接到 unix 服务器。我想从服务器上的本地启动一个可执行文件。可执行文件当前从 local/paramiko 失败,因为当我使用 paramiko ssh 时未正确设置 LD_LIBRARY_PATH 环境变量,但是当我使用 putty 并以交互方式工作时它会自动设置。当我通过 putty 登录机器时,可执行文件按预期工作,但是当我从本地通过 paramiko 登录时,可执行文件返回与 LD_LIBRARY_PATH 环境设置不正确有关的错误。

当我使用 putty 登录机器时,管理员 .login 文件为变量 LD_LIBRARY_PATH 指定了一系列路径。它看起来像这样:

setenv LD_LIBRARY_PATH path1:path2:path3:...

但是,通过 paramiko 登录时,此管理脚本未启动,我需要手动设置 LD_LIBRARY_PATH 变量。

我的连接如下:

ssh = pk.SSHClient()
ssh.set_missing_host_key_policy(pk.AutoAddPolicy())
ssh.connect(hostname='server', username='user', password='password')

我要运行的命令如下:

stdin, stdout, stderr = ssh.exec_command('nohup executablefile')

如何设置我的 LD_LIBRARY_PATH,然后使用 paramiko 的 exec_command 执行我的程序,还是应该寻找不同的函数?

【问题讨论】:

  • 具体见my answer
  • 我不同意,因为更改 get_pty 参数不会导致任何更改(仍然收到环境路径错误)。我也不明白在使用 ssh.connect 时如何实现 ssh -T myuser@host 解决方案 - 这是 shh.connect 的选项吗?启动文件设置正确,可用于交互式 putty,但我无法像 putty 那样让 paramiko 进入 ssh。
  • 那么我们需要了解更多。以下哪个有效:ssh -T user@host nohup executablefilessh user@host nohup executablefile
  • 已编辑,我会给你任何我能提供的信息。
  • 您还觉得这是一个重复的问题吗?我认为场景和解决方案都与众不同。

标签: python unix ssh environment-variables paramiko


【解决方案1】:

我修改并找到了一个简单的解决方案。

可以通过 ssh.connect() 明确地告诉远程机器环境路径应该是什么。诀窍是使用; 将一系列命令绑定在一起。

stdin, stdout, stderr = ssh.exec_command('cd directory_desired; setenv LD_LIBRARY_PATH library_path_needed; nohup executable_file')

【讨论】:

    【解决方案2】:

    很可能在命令起作用之前设置了变量。这仅用于说明。这需要翻译成 paramiko 的等价物。

    ssh remote-host 'COOKS=32 env'
    

    应该返回如下内容。哪个是远程主机的环境内容。

    COOKS=32
    XDG_SESSION_ID=889
    SHELL=/bin/bash
    ....
    

    【讨论】: