首页 > 编程知识 正文

Python SSH连接服务器

时间:2023-11-19 03:58:51 阅读:293400 作者:IRDM

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进行连接以及相关的操作。这些技巧可以使我们在服务器管理中更加便捷高效。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。