gpt4 book ai didi

python - 使用 Python 通过 ssh 将文件 cat 到远程 bash 脚本

转载 作者:太空狗 更新时间:2023-10-30 03:05:13 26 4
gpt4 key购买 nike

我将 subprocess.popen 与 shlex 结合使用,以使用 ssh 调用远程 bash 脚本。这个命令在 bash 本身上工作得很好。但是,一旦我尝试使用 subprocess.popen 将其转换为 python 和 shlex,它就会出错。

远程 bash 脚本:

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

BASH CMD RESULT(在命令行调用远程bash脚本)

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

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 重定向,但是在使用子进程时没有生成 shell。

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

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 的命令行参数。那是因为 bash 解析器拦截了 <以及它后面的文件,并将该文件的内容重定向到程序的标准输入。换句话说,ssh正在从标准输入读取文件。您希望将文件传递给 stdinssh也使用 python。

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是我本地机器上的一个文件。

关于python - 使用 Python 通过 ssh 将文件 cat 到远程 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13276755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com