国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

詳談python中subprocess shell=False與shell=True的區別

瀏覽:4日期:2022-06-21 15:19:51

shell=True參數會讓subprocess.call接受字符串類型的變量作為命令,并調用shell去執行這個字符串,當shell=False是,subprocess.call只接受數組變量作為命令,并將數組的第一個元素作為命令,剩下的全部作為該命令的參數。

舉個例子來說明

詳談python中subprocess shell=False與shell=True的區別

from subprocess import call import shlex cmd = 'cat test.txt; rm test.txt' call(cmd, shell=True)

上述腳本中,shell=True的設置,最終效果是執行了兩個命令

cat test.txt 和 rm test.txt

把shell=True 改為False,

from subprocess import call import shlex cmd = 'cat test.txt; rm test.txt' cmd = shlex(cmd) call(cmd, shell=False)

則調用call的時候,只會執行cat的命令,且把 'test.txt;' 'rm' 'test.txt' 三個字符串當作cat的參數,所以并不是我們直觀看到的好像有兩個shell命令了。

也許你會說,shell=True 不是很好嗎,執行兩個命令就是我期望的呀。但其實,這種做法是不安全的,因為多個命令用分號隔開,萬一檢查不夠仔細,執行了危險的命令比如 rm -rf / 這種那后果會非常嚴重,而使用shell=False就可以避免這種風險。

總體來說

看實際需要而定,官方的推薦是盡量不要設置shell=True。

補充: python subprocess模塊的shell參數問題

昨天調試其他同學的代碼時,發現對于subprocess模塊所傳的args變量,與shell變量存在關聯,傳值不當會有各種問題。比較有趣,就記錄一下。

根據subprocess模塊的args定義如下:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

對于args,可傳string,也可傳list,但當傳string時,shell的值必須設為True。

當shell為True時

If shell is True, the specified command will be executed through the shell. This can be useful if you are using Python primarily for the enhanced control flow it offers over most system shells and still want convenient access to other shell features such as shell pipes, filename wildcards, environment variable expansion, and expansion of ~ to a user’s home directory.

就是調用了系統的 sh 來執行命令(args的string),這樣會導致一些猥瑣的安全問題,類似于SQL Injection攻擊:

from subprocess import callfilename = input('What file would you like to display?n')What file would you like to display?non_existent; rm -rf / #call('cat ' + filename, shell=True) # Uh-oh. This will end badly...

所以,安心用shell=False吧,記得args傳list。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产欧美一区二区三区观看 | 老外黑人欧美一级毛片 | 日韩永久在线观看免费视频 | 欧美高清性色生活 | 中日韩精品视频在线观看 | 日本加勒比视频在线观看 | 欧美无玛 | 免费看欧美成人性色生活片 | 深夜福利视频大全在线观看 | 亚洲美女在线播放 | 国产91免费| 欧美一级视频在线 | 台湾三级香港三级在线理论 | 欧美成人高清在线视频大全 | 成人怡红院视频在线观看 | 日本欧美一区二区三区不卡视频 | 亚洲黄色三级网站 | 欧美一级一极性活片免费观看 | 亚洲天堂男人网 | 欧美另类特大 | 欧美精品综合一区二区三区 | 激情丝袜美女视频二区 | 日本视频三区 | 91最新91精品91蝌蚪 | 在线欧美不卡 | 精品国产一区二区 | 国产国产人免费人成成免视频 | 理论片我不卡在线观看 | 国模肉肉人体大尺度啪啪 | 日韩美女一区二区三区 | 久久中文字幕久久久久 | 6一12呦女精品 | 亚洲欧美日韩国产综合 | 亚洲人成免费网站 | 国产伦精品一区二区三区免费 | 久久国产经典视频 | 国产亚洲精品日韩已满十八 | 日韩日韩日韩手机看片自拍 | 加勒比日本 | ppypp日本欧美一区二区 | 一级白嫩美女毛片免费 |