【问题标题】:How to avoid Shell Injection with a path variable and wait for command exist?如何避免使用路径变量进行 Shell 注入并等待命令存在?
【发布时间】:2015-03-15 23:31:31
【问题描述】:

我需要读取一个命令的退出(然后我必须以同步的方式等待它):

import subprocess
subprocess.call('ls ~', shell=True)

我的问题是这样的路径:

~/testing/;xterm;/blabla

我怎样才能清理来自用户的字符串(允许他的语言中的特殊字符)?

import subprocess
subprocess.call('ls ~/testing/;xterm;/blabla', shell=True) # This will launch xterm

我在 PHP 中找到了 escapeshellcmd,但在 Python 中没有找到任何东西。

PS:这不是重复的:

提前致谢!

=======

【问题讨论】:

    标签: python shell code-injection


    【解决方案1】:

    传递一个列表而不是一个字符串。并删除 shell=True 以使命令不由 shell 运行。 (您需要使用os.path.expanduser自己扩展~

    import os
    import subprocess
    
    subprocess.call(['ls', os.path.expanduser('~') + '/testing/;xterm;/blabla'])
    

    旁注:如果您想获取文件名列表,最好使用os.listdir

    filelist = os.listdir(os.path.expanduser('~') + '/testing/;xterm;/blabla')
    

    【讨论】:

    • 谢谢,但是我发现了这个问题:没有shell=True,我无法得到命令的退出,文件列表总是空的。
    • @costales,这很奇怪。你能试试这个吗? filelist = os.listdir(os.path.join(os.path.expanduser('~'), 'testing', ';xterm;', 'blabla'))
    • 除非你想忽略非零退出状态,否则我会使用 check_call
    • @falsetru,是的,我就是这个意思。
    • @falsetru:非常感谢! os 库正在解决我的问题 :)
    猜你喜欢
    • 2013-11-02
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多