【问题标题】:Unable use bash commands through asyncio无法通过 asyncio 使用 bash 命令
【发布时间】:2016-08-02 20:56:20
【问题描述】:

我正在尝试创建一个简单的命令,我可以在不和谐中调用它让我查看目录中有多少文件,但由于某种原因,我的代码在我运行命令后一直遇到以下错误:

 `Traceback (most recent call last):
  File "/home/pi/MusicToaster/musicbot/bot.py", line 1995, in on_message
    response = await handler(**handler_kwargs)
  File "/home/pi/MusicToaster/musicbot/bot.py", line 1822, in cmd_audiocache
    stdout=asyncio.subprocess.PIPE)
  File "/usr/local/lib/python3.5/asyncio/subprocess.py", line 212, in create_subprocess_exec
    stderr=stderr, **kwds)
  File "/usr/local/lib/python3.5/asyncio/base_events.py", line 970, in subprocess_exec
    bufsize, **kwargs)
  File "/usr/local/lib/python3.5/asyncio/unix_events.py", line 184, in _make_subprocess_transport
    **kwargs)
  File "/usr/local/lib/python3.5/asyncio/base_subprocess.py", line 40, in __init__
    stderr=stderr, bufsize=bufsize, **kwargs)
  File "/usr/local/lib/python3.5/asyncio/unix_events.py", line 635, in _start
    universal_newlines=False, bufsize=bufsize, **kwargs)
  File "/usr/local/lib/python3.5/subprocess.py", line 950, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.5/subprocess.py", line 1540, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'find /home/pi/MusicToaster/audio_cache -type f | wc -l'`

我检查了正在运行的命令,但我无法找到导致错误的原因,当我手动输入时我没有问题:

值增加了,因为写入该文件夹的机器人正在运行,而我正在拍摄该屏幕截图

这里是命令的代码:

async def cmd_audiocache(self, channel):
    await self.safe_send_message(channel, "hang on ill check :thinking:")
    process = await asyncio.create_subprocess_exec(
        'find /home/pi/MusicToaster/audio_cache -type f | wc -l',
        stdout=asyncio.subprocess.PIPE)
    stdout, stderr = await process.communicate()
    file_count = stdout.decode().strip()
    file_count = str(file_count)
    file_count = file_count + " songs stored"
    await self.safe_send_message(channel, file_count)
    process = await asyncio.create_subprocess_exec(
        'du /home/pi/MusicToaster/audio_cache -h',
        stdout=asyncio.subprocess.PIPE)
    stdout, stderr = await process.communicate()
    file_size = stdout.decode().strip()
    file_size = str(file_size)
    file_size = "all songs total to" + file_size
    await self.safe_send_message(channel, file_size)

请原谅那段代码的混乱,在我知道它可以工作之前我不会整理代码。

【问题讨论】:

    标签: bash python-3.x python-asyncio


    【解决方案1】:

    注意create_subprocess_exec的区别:

    从一个或多个字符串参数创建一个子进程 [...] 其中第一个字符串指定要执行的程序,其余字符串指定程序的参数。

    create_subprocess_shell:

    使用平台的“shell”语法从 cmd [...] 创建一个子进程。

    例子:

    # Using exec
    process = await asyncio.create_subprocess_exec('ls', '-l')
    # Using shell
    process = await asyncio.create_subprocess_shell('ls -l') 
    

    【讨论】:

    • 所以如果我有一个完整的 shell 命令作为一个长字符串,我如何将它发送到asyncio.create_subprocess_exec() 以防止 shell 注入?我试过commandString.split(),但与Popen 不同,subprocess_exec 不接受列表...
    • @medley56 过去,解决方法是使用create_subprocess_exec(*cmdList, ...)
    • @medley56 过去,解决方法是使用shlex.quote() 方法。如果您需要调用create_subprocess_exec(),则在字符串上调用split() 函数。在此处阅读更多信息:docs.python.org/3.6/library/shlex.html#shlex.quote
    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2016-11-30
    • 1970-01-01
    • 2021-01-31
    • 2014-10-30
    相关资源
    最近更新 更多