如何在Paramiko(SSH)上使用Python模块?
Paramiko是一种用Python编写的SSHv2(安全外壳协议)[1]实现。这个模块可以让你以编程方式登录到远程主机并执行命令。使用Paramiko可以轻松地构建自动化系统管理器,并通过Python脚本控制远程服务器。本文将介绍如何使用Python模块来在Paramiko上实现一些常见的SSH操作。
阅读更多:Python 教程
安装Paramiko
在使用Paramiko前,首先需要安装Paramiko才能使用它的模块。安装方法如下所示:
$ pip install paramiko
如果你在Windows平台上安装,可以尝试使用以下命令:
$ pip install paramiko-py36
连接到SSH服务器
首先,让我们看看如何使用Paramiko连接到SSH服务器并执行命令。
import paramiko
hostname = "your.hostname.com"
username = "yourusername"
password = "yourpassword"
# 实例化SSHClient()对象
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
# 如果从未登录,则自动添加远程主机的主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接远程主机
ssh.connect(hostname, username=username, password=password)
#执行远程命令
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())
在该示例中,我们首先实例化SSHClient()对象,然后使用load_system_host_keys()(加载系统主机密钥)方法来加载主机密钥。随后,我们使用set_missing_host_key_policy()(设置缺失主机密钥策略)将自动添加远程主机的主机密钥。最后,我们使用connect()方法连接到远程主机并使用exec_command()方法执行远程命令。最后,使用print()语句输出结果。
在SSH会话中执行多个命令
下面是一个示例,演示如何在同一个SSH会话中执行多个命令。
import paramiko
hostname = "your.hostname.com"
username = "yourusername"
password = "yourpassword"
# 实例化SSHClient()对象
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
# 如果从未登录,则自动添加远程主机的主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接远程主机
ssh.connect(hostname, username=username, password=password)
#开始一个新的SSH会话
channel = ssh.invoke_shell()
#执行多个命令
channel.exec_command('ls -l')
channel.exec_command('df -h')
#停止接收数据流,等待执行完所有命令后在停止
channel.shutdown_write()
#接收数据流
print(channel.recv(1024).decode())
#关闭SSH会话
channel.close()
在该示例中,我们首先实例化SSHClient()对象,并连接到远程主机。接着,我们使用invoke_shell()方法开始一个新的SSH会话。使用exec_command()方法执行多个命令。在所有命令执行完毕后,我们使用shutdown_write()方法停止接收数据流。使用recv()方法读取所有输出结果并使用print()方法输出。最后,我们使用close()方法关闭SSH会话。
使用ssh-keygen生成公钥/私钥
SSH密钥对由一对公钥和私钥组成,生成的公钥可用于远程主机上的SSH服务器进行身份验证,私钥将用于SSH客户端验证。可以使用ssh-keygen工具生成新的SSH密钥对。
import paramiko
hostname = "your.hostname.com"
username = "yourusername"
password = "yourpassword"
# 实例化SSHClient()对象
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
# 如果从未登录,则自动添加远程主机的主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程主机
ssh.connect(hostname, username=username, password=password)
#生成SSH密钥对
key = paramiko.RSAKey.generate(2048)
#将密钥对存储为SSH密钥格式
private_key_file = "/path/to/private/key"
key.write_private_key_file(private_key_file)
#将公钥储存在远程主机上
public_key_file = "/path/to/public/key"
with open(public_key_file, 'w') as f:
f.write(f'{key.get_name()} {key.get_base64()} generated-key')
#关闭SSH连接
ssh.close()
在该示例中,我们使用SShClient()对象连接到远程主机。接着,我们使用RSAKey.generate()方法生成SSH密钥对,密钥长度为2048 bit。使用write_private_key_file()方法将私钥存储到指定目录下的文件中,同时使用get_name()和get_base_64()方法生成公钥并写入公钥文件中。最后,我们使用close()方法来关闭SSH连接。
结论
Paramiko模块可帮助我们轻松连接到SSH服务器,执行命令和文件操作,并与远程主机建立会话。你可以使用Python中的Paramiko模块来构建自动化系统管理工具。通过这篇文章,您应该能够开始使用Python和Paramiko来执行各种自动化SSH任务。如果想深入了解Paramiko,请访问Paramiko项目的官方网站。