Python 使用子流程在本地执行远程脚本-远程脚本使用~/.profile中的变量

Python 使用子流程在本地执行远程脚本-远程脚本使用~/.profile中的变量,python,bash,unix,subprocess,Python,Bash,Unix,Subprocess,我正在执行驻留在远程服务器上的脚本。 这个bash脚本使用一个变量。 此变量在~/.profile中定义。 为了这个目的,让我们说吧 $MYVAR=/a/b/c 所以,在远程服务器上,甚至ssh到远程服务器,我执行 echo $MYVAR returns /a/b/c as you would expect. 但是,如果我使用python子进程在本地执行远程脚本,脚本就会失败。它失败了,因为脚本使用了$MYVAR,它被翻译为soemthing不正确 这是因为我是通过SSH执行它的,~./配置

我正在执行驻留在远程服务器上的脚本。 这个bash脚本使用一个变量。 此变量在~/.profile中定义。 为了这个目的,让我们说吧

$MYVAR=/a/b/c
所以,在远程服务器上,甚至ssh到远程服务器,我执行

echo $MYVAR returns /a/b/c as you would expect.
但是,如果我使用python子进程在本地执行远程脚本,脚本就会失败。它失败了,因为脚本使用了$MYVAR,它被翻译为soemthing不正确

这是因为我是通过SSH执行它的,~./配置文件不能被加载,而是使用其他配置文件。 看这里

下面是从python脚本执行的命令

ssh = subprocess.Popen(['ssh', '%s' % env.host, 'cd /script/dir | ./myscript arg1 arg2'],shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

我的问题是如何在本地运行一个脚本,它将ssh连接到远程,加载用户~/.profile,然后执行bash脚本。

最简单的解决方案是创建一种类似这样的包装器脚本

#!/bin/bash
. /users/me/.profile

cd /dir/where/script/exists/

exec script LIVE "$@"
现在,在python脚本中创建一个方法,将包装器脚本scp到tmp dir

scp wrapper user@remote:/tmp
现在这个问题中的ssh命令变成了

subprocess.Popen(['ssh', '%s' % env.host, env.installPatch],shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
env.installPatch转换为:

cd /tmp; ./wrapper 'patch_name'
现在已加载.profile,并且修补程序脚本具有正确的变量VAL。 通过使用exec,我可以从修补程序o/p获得所有输出,并可以写入文件


这是我的案例中最干净的解决方案。

您可以使用paramiko模块从本地在远程服务器上运行脚本

安装后,可以运行命令,如下面的示例所示

import paramiko
command=" 'ssh', '%s' % env.host, 'cd /script/dir | ./myscript arg1 arg2' "
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.18.1.26',port=22,username='root',password='defassult') #This will connect to remote server
stdin,stdout,stderr=ssh.exec_command(command)  #This will execute the command on remote server
output=stdout.readlines()
print '\n'.join(output)

不知道
$MYVAR
是如何在代码中使用的,它是否在
/myscript
中使用?
cd something | somecommand
没有任何用处,因为
cd
在标准输出上没有任何用处。您实际想要完成什么?您正在寻找
['ssh',remote',cd dir;myvar=“{}”somecommand arg1 arg2'.格式(shlex.quote(os.environ['myvar']))
?我想ssh到远程,将目录更改为脚本存在的位置。然后运行脚本。我的代码中根本没有使用$MYVAR。远程脚本使用它。远程脚本退出是因为$MYVAR不是它应该的样子。奇怪的是(对我来说)是不是当你在遥控器上运行echo$MYVAR时,它会返回预期值。那么它从何处获取其他值呢?这是我不明白的。@Nanotron试试这个嗨,是的,我确实有可用的模块,但我会尽量让其他人使用这个脚本。也就是说,为了这个目的,只有标准的libra可以使用ry模块。