コマンドライン引数として安全に使用するために文字列をエスケープする最良の方法は何ですか?subprocess.Popenusingがこのusingを処理することは知っていますlist2cmdline()が、paramikoでは正しく機能しないようです。例:
from subprocess import Popen
Popen(['touch', 'foo;uptime']).wait()
これにより、文字通りという名前のファイルが作成されますfoo;uptime。これが私が欲しいものです。比較:
from paramiko import SSHClient()
from subprocess import list2cmdline
ssh = SSHClient()
#... load host keys and connect to a server
stdin, stdout, stderr = ssh.exec_command(list2cmdline(['touch', 'foo;uptime']))
print stdout.read()
これにより、というファイルが作成されfoo、リモートホストの稼働時間が出力されます。uptime最初のコマンドの引数の一部として使用するのではなく、2番目のコマンドとして実行されましたtouch。これは私が望むものではありません。
に送信する前後にバックスラッシュでセミコロンをエスケープしようとしましたlist2cmdlineが、結局は。というファイルになりましたfoo\;uptime。
uptimeまた、の代わりにスペースを含むコマンドを使用すると、正しく機能します。
stdin, stdout, stderr = ssh.exec_command(list2cmdline(['touch', 'foo;echo test']))
print stdout.read()
これにより、引用符で囲まれているfoo;echo testため、文字通り呼び出されるファイルが作成されます。list2cmdline
また、試しpipes.quote()てみたところ、と同じ効果がありましたlist2cmdline。
編集:明確にするために、受信する入力データに関係なく、リモートホストで実行されるコマンドが1つだけであることを確認する必要があります。つまり、、、、バックティックなどの文字をエスケープする必要が;あり&ます。