你是否厌倦了手动登录远程服务器并执行日常任务?SSH任务可以自动化编程实现,能欧节省大量的时间和精力。在本文中,我们将探索如何使用Paramiko(Python库)来自动执行SSH任务。
Paramiko 简介
Paramiko是Python库,支持与SSH服务器进行交互。它提供易于使用的界面,用于登录、执行命令、传输文件和管理SSH密钥。Paramiko同时支持SSHv2和SFTP协议,使其成为通用自动化任务工具。
安装paramiko
在我们使用Paramiko之前,需要安装它。你可以使用Python包管理器pip安装Paramiko。打开终端窗口,输入以下命令:
shell
pip install paramiko
Paramiko 实战
连接SSH服务器
要使用Paramiko连接到SSH服务器,我们首先需要创建SSH客户端对象。我们可以通过导入SSHClient类并创建一个实例来实现:
python
import paramiko
ssh = paramiko.SSHClient()
缺省情况下,Paramiko不信任任何SSH服务器。因此,我们需要启用主机密钥检查,以确保我们连接到一个受信任的服务器。我们可以通过在SSH客户端对象上调用set_missing_host_key_policy方法来做到这一点:
python
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
现在我们已经设置了主机密钥策略,我们可以通过调用SSH客户端对象上的connect方法连接到SSH服务器:
python
ssh.connect('example.com', username='myuser', password='mypassword')
将example.com替换为SSH服务器的主机名或IP地址,将myuser替换为您的用户名,将mypassword替换为您的密码。
如果您想使用SSH密钥而不是密码进行连接,可以使用以下代码:
python
ssh.connect('example.com', username='myuser', key_filename='/path/to/keyfile')
将/path/to/keyfile替换为SSH私钥的路径。
执行命令
现在我们已经连接到SSH服务器,我们可以使用exec_command方法在其上执行命令:
python
stdin, stdout, stderr = ssh.exec_command('ls')
print(stdout.read().decode())
这段代码在远程服务器上执行ls命令,并将输出打印到控制台。exec_command方法返回三个类文件对象:stdin、stdout和stderr。我们可以通过调用stdout对象上的read方法来读取命令的输出。
我们也可以通过创建shell对象,并可以在单个SSH会话中执行多条命令:
python
shell = ssh.invoke_shell()
shell.send('ls\n')
shell.send('pwd\n')
shell.send('whoami\n')
output = shell.recv(65535).decode()
print(output)
这段代码在远程服务器上打开交互式shell,并向它发送三个命令。我们可以通过调用shell对象上的recv
方法来读取命令输出。
完整示例
本节展示如何使用用户名和密码对远程服务器进行身份验证。下面代码需要替换 "YOUR_IP_ADDRESS"、"YOUR_LIMITED_USER_ACCOUNT" 和 "YOUR_PASSWORD" 的值。如果需要,使用查找连接主机的IP地址。
python
# first_experiment.py
import paramiko
command = "df"
# Update the next three lines with your
# server's information
host = "YOUR_IP_ADDRESS"
username = "YOUR_LIMITED_USER_ACCOUNT"
password = "YOUR_PASSWORD"
client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host, username=username, password=password)
_stdin, _stdout,_stderr = client.exec_command("df")
print(_stdout.read().decode())
client.close()
虽然上面Paramiko示例也可以用shell命令完成,但Paramiko提供了Python的所有功能。Python能够访问结构化数据、循环、解析和其他强大的功能,这些功能超出了shell脚本所提供的功能。例如,如果你正在编写计算系统使用百分比的程序,那么Python更擅长从系统输出中提取和计算值。
传输文件
Paramiko还支持使用SFTP协议在本地机器和远程服务器之间传输文件。要传输文件,我们首先需要创建SFTP客户端对象:
sftp = ssh.open_sftp()
然后,我们可以使用put方法将文件从本地机器上传到远程服务器:
python
sftp.put('/path/to/local/file', '/path/to/remote/file')
将"/path/to/local/file"替换为要上传的本地文件路径,将"/path/to/remote/file"替换为要创建的远程文件路径。
类似地,我们可以使用get方法从远程服务器下载文件到本地机器:
python
sftp.get('/path/to/remote/file', '/path/to/local/file')
将"/path/to/remote/file"替换为需要下载的远程文件路径,将"/path/to/local/file"替换为需要创建的本地文件路径。
关闭连接
一旦完成了SSH会话,我们应该关闭到服务器的连接:
python
ssh.close ()
这可能存在潜在的安全风险,关闭连接不会流行任何已打开的连接。
最后总结
本文我们介绍了如何使用Paramiko来自动执行SSH任务。包括连接到SSH服务器、执行命令、传输文件和关闭连接。有了这些基础知识,你可以自动执行日常任务,节省大量的时间和精力。更多内容请参考官方文档,自动化快乐!