2

我想调用一个 python 函数pexpect.spawn(cmd),其中 cmd 是一个字符串,如下所示:

ssh -t kity@192.199.61.205 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'

IP地址总是在变化,所以它是这样的:

ssh -t kity@%s 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' %host_ip

有几个'and ",我很茫然如何处理,所以基本上,它是关于如何处理python字符串中的转义以及当有可变子字符串时,如何处理它

谢谢

4

2 回答 2

7

你可以使用三引号:

"""ssh -t kity@{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address)
于 2013-04-18T23:33:30.433 回答
0

Cameron Sparr 已经给出了通用的答案。

但在您的具体情况下,您可能不需要这个。

pexpect.spawn接受命令和参数字符串命令字符串和单独的参数字符串列表。对于其他库中的大多数类似方法(如标准库subprocess模块中的所有内容)也是如此。

因此,您只需要将每个参数变成一个字符串,如下所示:

pexpect.spawn('ssh', ['-t', 'kity@192.199.61.205', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'])

实际上,正是出于这个原因,文档特别建议了这一点:

第二种形式的 spawn(传递参数列表)在您希望生成命令并将其自己的参数列表传递给它的情况下很有用。这可以使语法更清晰。

当然,在您的情况下,您实际上是在生成一个带有参数列表的命令……其中一个本身就是要生成的命令和参数列表(sudo),依此类推(nohup, bash,最后tcp_sender),显然pexpect只能帮助完成这些步骤中的第一步。幸运的是,在这种情况下,这就是您所需要的。

如果您确实需要更多,那里有一些库可以从参数列表中生成 POSIX 样式的引用字符串(基本上shlex与我最终自己重写了它……实际上并没有那么复杂(基本上,只需将所有内容都转义然后引用所有参数)。但希望你永远不必这样做。

于 2013-04-18T23:59:18.747 回答