linux中的Python脚本

时间:2014-01-16 23:54:33

标签: python linux

好吧所以我试着拿走我的ssh密钥并将其推送到我的root的授权密钥列表,这就是为什么香港专业教育学院尝试了许多不同的变化。请记住我是python的新手:

import subprocess
f = open("/Users/MacUser/server.lst", "r")
USER = "root"

def multi_com(f):

    for EACH in f:

            com_keys = subprocess.Popen('cat ~/.ssh/id_pub.rsa | ssh ' + USER + "@" + EACH + 'tee -a .ssh/authorized_keys', stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            output, errors = com_keys.communicate()
            return com_keys
            print output

multi_com(f)

我的server.lst包含很多喜欢,每行都有一个单独的FQDN,如下所示:

abc1.domain.com
abc2.domain.com
abc3.domain.com
abc4.domain.com    

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

首先,subprocess.Popen的第一个参数应该是参数列表,而不是单个字符串,除非(a)您正在使用shell=True,或者(b)编写Windows的代码-具体。在你的情况下,这些都不是真的。

话虽这么说,如果您想运行该命令,使用shell=True。否则,您只是运行cat命令,|作为第二个参数,ssh作为第三个参数,依此类推。并且cat不知道该怎么做;它只是查找名为|的文件,但失败了。如果要使用|管道等shell功能,则必须使用shell。

虽然我们处于此状态,但'… ssh ' + USER + "@" + EACH + 'tee -a…'在主机名和tee之间没有空格,这不太可能是您想要的。这是% - 格式化或format功能更好的众多原因之一:

cmdline = 'cat ~/.ssh/id_pub.rsa | ssh {}@{} tee -a .ssh/authorized_keys'.format(USER, EACH)

话虽这么说,你不应该使用你不需要的shell功能。文档在Replacing Older Functions with the subprocess Module上有很好的部分,第一个示例之一向您展示了如何替换shell管道并在Python中完成所有操作。

就此而言,几乎没有理由将cat foo传递给另一个程序。只需将foo作为输入传递即可。在shell中,bar < foocat foo | bar类似,但更简单,开销更少;在Python中,打开文件,然后传递stdin=foo 批次比管道cat更容易。

话虽这么说,试图驱动ssh作为命令行应用程序有各种你不想处理的繁琐问题;使用像paramikofabric这样的库会好得多。

另一方面,如果你确实想要使用ssh命令行工具和shell管道等等... bash是比Python更好的语言。