使用Python自动化SSH

时间:2012-12-26 11:42:51

标签: python ssh paramiko

我有这30台虚拟机,我现在正在手动完成所有操作,这对我来说是一种麻烦。我现在正在尝试编写一个脚本,以便我可以自动连接到它们并完成我想要的任务。我制作了一个我需要做的流程图。任何人都可以给我一些关于如何以编程方式完成此任务的提示。我附上了流程图。
提前致谢。

enter image description here

请右键单击图像,然后单击查看图像以查看流程图。

3 个答案:

答案 0 :(得分:4)

阅读文本文件并获取数据非常简单:

with open('host.txt', 'r') as inf:
    lines = inf.readlines()
    hostlist = [ln.split() for ln in lines]

现在hostlist应该是列表清单;

[['192.168.0.23', 'root', 'secret'], ['192.168.0.24', 'root', 'secret2'] ...

但是您的列表不应包含多于主机名。 IP地址可以从您必须配置的DNS中获取,如果配置正确,ssh可以在没有密码的情况下登录。

将所有虚拟主机的密码放在纯文本文件中存在安全问题。如果您想要走这条路线,请务必限制对该文件的访问!

您可以使用subprocess执行命令。我建议使用rsync将所需文件推送到虚拟机。这最小化了网络流量。您可以直接从文件系统部署到文件系统,而无需滚动tarball。它可以像

一样简单
status = subprocess.check_output(['rsync', '-av', localdir, remotedir])

其中localdir是存储相关虚拟机文件的目录(它应以'/'结尾),而'remotedir'是虚拟机上的hostname::directory数据应该着陆(这应该以'/'结尾。

为了远程执行命令,ssh是可行的方法。配置无密码登录,使用每个远程主机上的ssh的authorized_keys文件。然后,您不需要将密码放在主机列表中。

答案 1 :(得分:1)

Fabric是您的最佳解决方案。基于paramiko(基于libssh2)的Fabric,它可以很容易地在远程主机上使用命令,并提供从远程主机上传和下载fiels的功能。 这是http://docs.fabfile.org/en/1.5/

关于put函数here

的文档

答案 2 :(得分:1)

我没有在流程图中提出您的问题,但您可以按照建议使用paramiko,并且我在paramiko之上编写了大量后台实用程序,这使得支持人员可以在浏览器上监视远程Web服务器。下面的代码段,

client = paramiko.SSHClient()
client.set_missing_host_key_policy( paramiko.AutoAddPolicy() )
client.load_system_host_keys()
client.connect( '192.168.100.1', port=4001, username='monitor', password='XXXX' )

cmds = [ "sed -i 's/\/bin\/date -u/\/bin\/date/g' /etc/cron.hourly/reboot" ]

for cmd in cmds:

    if __DEBUG_MODE__:
        print 'Executing..... ' + cmd

    stdin, stdout, stderr = client.exec_command( cmd )

另外,如果你想推送下面的文件是片段,

def setupSFTPClient(self, ip_add):
    print 'Setting SFTP client: ' + ip_add
    tb = 'Finished SFTP-ing. '
    try:
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.load_system_host_keys()
        client.connect(ip_add, port=4001, username='monitor', password='XXXX')
        sftp_client = client.open_sftp()
        # NB you need the filename for remote path otherwise 
        #    paramiko barfs with IOError: Failure
        sftp_client.put( '/home/projects/portal_release.tgz', '/var/ND/portal_release.tgz' )
        sftp_client.put( '/home/projects/portal_installer.sh', '/var/ND/portal_installer.sh' )
        sftp_client.close()

    except Exception, e:
        print e
        tb = traceback.format_exc()

    finally:
        print tb
        client.close()