使用python将文件通过SSH猫到远程bash脚本



我正在使用subprocess.popen和shlex使用ssh调用远程bash脚本。此命令在狂欢本身上效果很好。但是,一旦我尝试将其转换为python和subocess.popen。

远程bash脚本:

#!/bin/bash
tmp="";     
while read -r line;
do
    tmp="$tmp $linen";
done;
echo $tmp;

bash cmd结果(在命令行上调用远程bash脚本)

$> ssh x.x.x.x cat < /tmp/bef69a1d-e580-5780-8963-6a9b950e529f.txt " | /path/to/bash/script.sh;"
Barn
$> 

Python代码

import shlex
import subprocess
fn = '/tmp/bef69a1d-e580-5780-8963-6a9b950e529f.txt'
s = """                                                                    
ssh x.x.x.x cat < {localfile} '| /path/to/bash/script.sh;'
""".format(localfile=fn)
print s
lexer = shlex.shlex(s)                                                     
lexer.quotes = "'"                                                         
lexer.whitespace_split = True                                              
sbash = list(lexer)                                                        
print sbash                                                                
# print buildCmd                                                           
proc=subprocess.Popen(sbash,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
out,err=proc.communicate()                                                 
print "Out: " + out                                                        
print "Err: " + err                                                        

python脚本结果

$> python rt.py
    ssh x.x.x.x cat < /tmp/bef69a1d-e580-5780-8963-6a9b950e529f.txt '| /path/to/bash/script.sh'
['ssh', 'x.x.x.x', 'cat', '<', '/tmp/bef69a1d-e580-5780-8963-6a9b950e529f.txt', "'| /path/to/bash/script.sh'"]
Out: 
Err: bash: /tmp/bef69a1d-e580-5780-8963-6a9b950e529f.txt: No such file or directory
$>

我缺少什么?

问题是您在命令中使用了shell重定向,但是使用SubProcess时没有壳。

考虑以下(非常简单)程序:

import sys
print sys.argv

现在,如果我们像运行ssh一样运行(假设存在foofile.txt),我们会得到:

python argcheck.py ssh cat < foofile.txt " | /path/to/bash/script.sh;"
['argcheck.py', 'ssh', 'cat', ' | /path/to/bash/script.sh;']

请注意,< foofile.txt永远不会进入Python的Commandline参数。这是因为BASH解析器拦截了<及其后的文件,并将该文件的内容重定向到程序的stdin。换句话说,ssh正在从Stdin读取文件。您希望使用Python将文件传递给sshstdin

s = """                                                                    
ssh x.x.x.x cat '| /path/to/bash/script.sh;'
"""
#<snip>
proc=subprocess.Popen(sbash,stdout=subprocess.PIPE,stderr=subprocess.PIPE,
                            stdin=subprocess.PIPE)
out,err=proc.communicate(open(fn).read())

大概会起作用。


以下对我有效:

import subprocess
from subprocess import PIPE
with open('foo.h') as f:
    p = subprocess.Popen(['ssh','mgilson@XXXXX','cat','| cat'],stdin=f,stdout=PIPE,stderr=PIPE)
    out,err = p.communicate()
    print out
    print '#'*80
    print err

bash中的等效命令:

ssh mgilson@XXXXX cat < foo.h '| cat'

其中 foo.h是我本地计算机上的文件。

相关内容

  • 没有找到相关文章

最新更新