在上运行bash命令

2024-09-28 20:51:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在远程服务器上运行Python中的bash命令pdfcrack。这是我的密码:

bashCommand = "pdfcrack -f pdf123.pdf > myoutput.txt"
import subprocess
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()

但是,我收到以下错误消息:

Non-option argument myoutput2.txt
Error: file > not found

有人能看出我的错误吗?你知道吗


Tags: import命令服务器txtbash密码远程pdf
3条回答

你的错误是>在指挥。你知道吗

它不会将此视为重定向到文件,因为通常bash会这样做,而现在您不使用bash运行它。你知道吗

如果您想使用bash,请尝试使用shell=True。这样就不必将命令拆分为列表。你知道吗

subprocess.Popen("pdfcrack -f pdf123.pdf > myoutput.txt", shell=True)

>由shell解释,否则无效。你知道吗

所以,这是可行的(不要拆分,按原样使用):

process = subprocess.Popen(bashCommand, shell=True)

(而且stdout=subprocess.PIPE没有用,因为所有输出都被重定向到输出文件)

但是使用本机python可以更好地重定向到输出文件并将参数作为列表传递(如果需要,可以处理引号保护)

with open("myoutput.txt","w") as f:
    process = subprocess.Popen(["pdfcrack","-f","pdf123.pdf"], stdout=subprocess.PIPE)
    f.write(process.read())
    process.wait()

Popen的第一个参数是一个包含命令名及其参数的列表。>不是命令的参数,而是shell语法。您可以简单地将整行传递给Popen,并指示它使用shell执行它:

process = subprocess.Popen(bashCommand, shell=True)

(请注意,由于您正在将命令的输出重定向到文件,因此没有理由将其标准输出设置为管道,因为将没有任何内容可读取。)

不过,更好的解决方案是让Python处理重定向。你知道吗

process = subprocess.Popen(['pdfcrack', '-f', 'pdf123.pdf'], stdout=subprocess.PIPE)
with open('myoutput.txt', 'w') as fh:
    for line in process.stdout:
        fh.write(line)
        # Do whatever else you want with line

另外,不要用str.split代替shell的分词。像pdfcrack -f "foo bar.pdf"这样的有效命令行将被拆分为不正确的列表['pdfcrack', '-f', '"foo', 'bar.pdf"'],而不是正确的列表['pdfcrack', '-f', 'foo bar.pdf']。你知道吗

相关问题 更多 >