linux中的Python脚本

linux中的Python脚本,python,linux,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密钥并将其推送到我的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)
my server.lst包含许多like,每行都有一个单独的FQDN,如下所示:

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

任何帮助都将不胜感激。

首先,
子流程的第一个参数。Popen
应该是参数列表,而不是单个字符串,除非(a)您正在使用
shell=True
,或者(b)编写特定于Windows的代码。在你的情况下,这两个都不是真的

也就是说,如果要运行该命令,应该使用
shell=True
。否则,您只需运行
cat
命令,将
|
作为第二个参数,
ssh
作为第三个参数,依此类推。猫不知道该怎么办;它只查找名为
|
的文件,但失败。如果要使用shell功能,如
|
管道,则必须使用shell

当我们这样做时,
“…ssh”+USER+“@”+EACH+'tee-a..”
在主机名和
tee
之间没有空格,这不太可能是您想要的。这是
%
-格式化或
格式化
功能更好的众多原因之一:

cmdline = 'cat ~/.ssh/id_pub.rsa | ssh {}@{} tee -a .ssh/authorized_keys'.format(USER, EACH)
也就是说,您不应该使用不需要的shell功能。文档中有一个很好的章节,第一个示例中的一个向您展示了如何替换shell管道,以及如何在Python中完成这一切

就这一点而言,几乎没有一个很好的理由将
catfoo
管道传输到另一个程序。只需将它作为输入传递给foo。在shell中,
bar
类似于
catfoo | bar
,但更简单,开销更小;在Python中,打开文件然后传递
stdin=foo
要比通过管道传递
cat
容易得多

也就是说,试图将ssh作为命令行应用程序来驱动,会遇到各种各样你不想处理的棘手问题;最好使用像或这样的库


另一方面,如果您真的想使用
ssh
命令行工具和shell管道等等……bash是一种比Python更好的语言。

您可以尝试使用scp将授权密钥复制到每台机器上。由于返回语句,for循环将只运行1次迭代。此外,
print output
行将永远无法访问。我有150台服务器要执行此操作,还有其他用户的密钥也存储在那里。我试图附加文件,而不是覆盖文件这对我来说也是一种学习经验,因为我正在学习python。您向我们展示了一些代码,但您没有解释它的功能,以及它与您希望它执行的功能的区别,这使得调试非常困难。