簡體   English   中英

如何不使用shell = True進行此Python子進程調用?

[英]How to do this Python subprocess call without using shell=True?

例如,在/ tmp中,我想以.txt,.doc和.jpg結尾的文件可以通過粉碎和子處理一步一步地刪除。

以下是工作:

subprocess.call('bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"', shell=True)

我如何不使用shell = True來執行此命令。 我嘗試了以下方法:

subprocess.call(['bash', '-c', '"shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}"'])
subprocess.call(['bash', '-c', 'shred', '-n 10', '-uz', '/tmp/{*.txt,*.pdf,*.doc}'])

有什么建議么?

我相信有其他人在現場(雖然我自己沒有嘗試過)。 但是,如果再次遇到類似問題,則shlex.split(s)可能會有所幫助。 它采用字符串“ s”,並“使用類似於shell的語法”將其拆分。

In [3]: shlex.split(s)
Out[3]: ['bash', '-c', 'shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}']
subprocess.call(['bash', '-c', 'shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}'])

您可以通過以下命令知道如何擴展和拆分命令:

$ printf "Argument: %s\n" bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"
Argument: bash
Argument: -c
Argument: shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}

在更一般的情況下(這里是過度殺傷力),如果您不確定帶有參數的對象執行的操作,可以使用strace:

$ cat script
import subprocess
subprocess.call('bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"', shell=True)

$ strace -s 1000 -fe execve python script
...
execve("/bin/bash", ["bash", "-c", "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"], [/* 49 vars */]) = 0
...
$ 

如果命令來自可信來源,例如,它是經過硬編碼的,那么使用shell=True並沒有錯:

#!/usr/bin/env python
from subprocess import check_call

check_call("shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}",
           shell=True, executable='/bin/bash')

/bin/bash用於在命令中支持{}

該命令不運行/bin/sh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM