好吧所以我试着拿走我的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
任何帮助将不胜感激
答案 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 < foo
与cat foo | bar
类似,但更简单,开销更少;在Python中,打开文件,然后传递stdin=foo
批次比管道cat
更容易。
话虽这么说,试图驱动ssh
作为命令行应用程序有各种你不想处理的繁琐问题;使用像paramiko
或fabric
这样的库会好得多。
另一方面,如果你确实想要使用ssh
命令行工具和shell管道等等... bash是比Python更好的语言。