Python 3.4+Асинхронное программированиефункция
asyncio.create_subprocess_shell()
подпроцессы
Запускает команду через оболочку (sh на Unix, cmd.exe на Windows), не блокируя цикл событий; команда передаётся одной строкой.
Синтаксис
proc = await asyncio.create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None, **kwds)
Оболочка разбирает строку целиком, поэтому подставлять в неё ввод пользователя без shlex.quote() — прямая дорога к внедрению команд. Возвращаемый Process — это процесс оболочки: proc.pid и proc.kill() относятся к sh, а не к запущенной программе, и её дети могут пережить kill(). Если оболочка не нужна (каналы, *, &&), берите create_subprocess_exec.
Примеры
import asyncio
import shlex
async def main():
name = "мир; rm -rf /" # чужой ввод
proc = await asyncio.create_subprocess_shell(
'echo ' + shlex.quote(name),
stdout=asyncio.subprocess.PIPE,
)
out, _ = await proc.communicate()
print(out.decode().strip()) # → мир; rm -rf /
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности