1

我正在使用 paramiko ssh 将文件放在远程机器上,如下所示。

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

引号需要转义一次以适合echo命令的参数。这是双引号分隔的“弱转义”:"必须将每个转义为\",您还必须担心\,$`. 然后将结果放入su命令的参数中,以单引号分隔的“强转义”。在这里,必须通过拆分字符串来包含任何单引号字符,例如通过替换为'\''.

嵌套转义很难正确处理,并且su涉及到任何错误的后果似乎对安全性来说都是可怕的。不惜一切代价避免嵌套模板和模板化 shell 命令。

一个可能更好的解决方案是通过返回的类似文件的对象,cat > /etc/chef/first-boot.json然后通过管道输入您想要存储的内容。那就不用担心逃跑了。stdinexec_command

或者干脆使用 Paramiko 的 SFTPClient 来传输文件。

(另外,str()第一行是完全多余的。)

于 2012-04-08T07:40:27.477 回答