Python作为一种广泛使用的编程语言,可以与SSH进行良好的结合,使我们在管理服务器时变得更为方便。本文将从不同的方面来详细介绍Python如何与SSH进行连接,以及相关的操作。
一、连接SSH服务器
首先,我们需要使用Python的Paramiko模块来连接SSH服务器。Paramiko是一个用于SSHv2协议的Python库,可以用来进行SSH连接并执行远程命令。下面是连接SSH服务器的示例代码:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('hostname', username='username', password='password') stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.readlines()) ssh.close()
在上述代码中,我们使用SSHClient()方法创建SSHClient对象,并使用set_missing_host_key_policy()方法指定主机。然后,我们使用connect()方法连接服务器,并指定用户名和密码。接着,我们使用exec_command()方法执行命令,并使用stdout.readlines()方法获取执行结果。
另外,如果需要使用SSH密钥进行连接,则需要使用paramiko.RSAKey类生成密钥并将私钥传递给connect()方法。示例代码如下:
import paramiko private_key_path = '/path/to/private/key' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('hostname', username='username', pkey=key) stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.readlines()) ssh.close()
二、上传和下载文件
在SSH连接中,我们经常需要上传或下载文件,这时我们可以使用SFTP传输协议。Paramiko模块提供了SFTPClient类来支持使用SFTP协议执行文件传输。下面是一个上传文件的示例:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('hostname', username='username', password='password') sftp = ssh.open_sftp() sftp.put(local_file_path, remote_file_path) sftp.close() ssh.close()
在上述代码中,我们使用SSHClient方法创建SSHClient对象,并使用connect()方法连接服务器。然后,我们使用open_sftp()方法创建SFTPClient对象,并使用put()方法上传本地文件到远程服务器中。
类似地,我们也可以使用get()方法将远程文件下载到本地文件系统中。示例代码如下:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('hostname', username='username', password='password') sftp = ssh.open_sftp() sftp.get(remote_file_path, local_file_path) sftp.close() ssh.close()
三、并行执行命令
有时候我们需要在多个服务器上同时执行相同的命令,这时我们可以使用Python的并行处理工具multiprocessing来并行执行远程命令。以下是一个并行执行命令的示例:
import paramiko from multiprocessing import Pool def run_cmd(ip, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, username=username, password=password) stdin, stdout, stderr = ssh.exec_command('ls') print(f'{ip}: {stdout.readlines()}') ssh.close() if __name__ == '__main__': ips = ['192.168.1.100', '192.168.1.101', '192.168.1.102'] username = 'username' password = 'password' pool = Pool(len(ips)) for ip in ips: pool.apply_async(run_cmd, args=(ip, username, password)) pool.close() pool.join()
在上述代码中,我们使用multiprocessing.Pool()方法创建进程池并指定进程池大小。然后,我们使用apply_async()方法启动进程池,并调用run_cmd()方法传递参数执行远程命令。
需要注意的是,我们使用if __name__ == '__main__'来防止出现子进程无法正确调用问题。
四、使用SSH配置文件
当我们需要连接多个SSH服务器时,可以将相关信息存储在SSH配置文件中,并使用Python的ConfigParser模块读取配置信息。以下是一个读取SSH配置文件的示例:
import paramiko import configparser config = configparser.RawConfigParser() config.read('/path/to/ssh_config') ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(config['SERVER']['hostname'], username=config['SERVER']['username'], password=config['SERVER']['password']) stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.readlines()) ssh.close()
在上述代码中,我们使用ConfigParser模块读取SSH配置文件中的服务器相关信息,并使用SSHClient类连接指定服务器。
五、结论
在本文中,我们从连接SSH服务器、上传和下载文件、并行执行命令、使用SSH配置文件等多个方面详细介绍了Python如何与SSH进行连接以及相关的操作。这些技巧可以使我们在服务器管理中更加便捷高效。