1

次のようにparamikosshを使用してリモートマシンにファイルを配置しています。

rl = str(""" {"run_list":["role[monitor_server]"]}""")
cmd = """sudo touch /etc/chef/first-boot.json;sudo su - -c 'echo "%s" >> /etc/chef/first-boot.json'""" % (rl)
ssh.exec_command(cmd)

しかし、ファイルを見るとこんな感じです。

{run_list:[role[monitor_server]]}

これを見るには次のようにする必要があります:{"run_list":["role [monitor_server]"]}

見積もりを保持するにはどうすればよいですか?

4

2 に答える 2

1

引用符をエスケープしてみてください。これは特定の解決策ですが、機能するはずです。

>>> rl = """ {"run_list":["role[monitor_server]"]}""".replace('"', '\\"')
>>> print """sudo touch /etc/chef/first-boot.json;sudo su - -c 'echo "%s" >> /etc/chef/first-boot.json'""" % (rl)
sudo touch /etc/chef/first-boot.json;sudo su - -c 'echo " {\"run_list\":[\"role[monitor_server]\"]}" >> /etc/chef/first-boot.json'
于 2012-04-08T07:37:17.677 に答える
1

コマンドの引数に合わせるには、引用符を1回エスケープする必要がありますecho。これは二重引用符で区切られた「弱いエスケープ」です。すべて"をエスケープする必要があり、、、および\"についても心配する必要があります。次に、結果は、一重引用符で区切られた「強力なエスケープ」で、コマンドの引数にドロップされます。ここでは、一重引用符は、文字列を分割して含める必要があります。たとえば、。に置き換えます。\$`su'\''

ネストされたエスケープは正しく行うのが難しいです。与えられsuた場合、ミスの結果はセキュリティにとって悲惨なように見えます。ネストされたテンプレートやシェルコマンドのテンプレートは絶対に避けてください。

潜在的により良い解決策は、返されるファイルのようなオブジェクトをcat > /etc/chef/first-boot.json介して保存したいコンテンツをパイプで送ることです。その時は逃げることを心配する必要はありません。stdinexec_command

または、ParamikoのSFTPClientを使用してファイルを転送します。

(また、str()最初の行は完全に冗長です。)

于 2012-04-08T07:40:27.477 に答える