"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como escapar corretamente dos argumentos de comando nas chamadas `os.system()` do Python?

Como escapar corretamente dos argumentos de comando nas chamadas `os.system()` do Python?

Publicado em 2024-11-02
Navegar:482

How to Properly Escape Command Arguments in Python\'s `os.system()` Calls?

Escapando argumentos de comando em chamadas os.system()

Ao trabalhar com os.system() em Python, garantir o tratamento adequado dos argumentos é crucial. Arquivos e outros parâmetros geralmente exigem escape para evitar interferência nos comandos do shell. Aqui está um guia completo para escapar efetivamente de argumentos para vários sistemas operacionais e shells, particularmente bash:

Usando aspas

A solução mais simples é colocar argumentos entre aspas. Aspas simples (') evitam a expansão do shell, enquanto aspas duplas (") permitem a substituição de variáveis, mas suprimem a expansão de variáveis ​​dentro da string citada. Essa abordagem é amplamente suportada em diferentes plataformas e shells, incluindo bash:

os.system("cat '%s' | grep something | sort > '%s'" 
          % (in_filename, out_filename))

Usando o módulo shlex

Python fornece o módulo shlex projetado especificamente para essa finalidade. Sua função quote() escapa corretamente de strings para uso em shells POSIX, incluindo bash:

import shlex

escaped_in_filename = shlex.quote(in_filename)
escaped_out_filename = shlex.quote(out_filename)
os.system("cat {} | grep something | sort > {}".format(
          escaped_in_filename, escaped_out_filename))

Usando o módulo pipes (aviso de descontinuação!)

Para versões Python 2.xe 3.x até 3.10, pipes.quote do O módulo de tubos obsoleto pode ser usado como uma alternativa ao shlex.quote. Esteja ciente de que a partir do Python 3.11, pipes estão marcados para remoção:

from pipes import quote

escaped_in_filename = quote(in_filename)
escaped_out_filename = quote(out_filename)
os.system("cat {} | grep something | sort > {}".format(
          escaped_in_filename, escaped_out_filename))

Como regra geral, por motivos de segurança, a entrada gerada pelo usuário não deve ser conectada diretamente às chamadas do sistema sem validação e higienização adequadas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3