Python Paramiko模块
Paramiko是基于Python(3.4+,2.7)的SSHv2协议执行,提供客户端和服务器功能。它为全功能SSH库Fabric提供了安装,我们建议您在常见的客户端用例中使用它,例如运行远程shell命令或传输文件。
直接使用Paramiko本身仅适用于需要提高/低级使用者或需要运行Python内的sshd的用户。
Paramiko依赖于密码功能,它使用C和Rust扩展,但有许多预编译选项可用。
SSH在RFC 4254、RFC 4253、RFC 4252和RFC 4251中定义。协议的基本操作执行由OpenSSH项目完成。Paramiko实现了SSH的大部分功能集,但偶尔会有一些差距。
如何在Windows系统上安装Python Paramiko
Python API的高级别从创建一个稳定的连接对象开始。作为客户端,它使用一个秘密密钥或客户端凭据进行验证,然后进行服务器主机密钥验证。具有更直接的控制并传递一个套接字以启动远程访问。
Paramiko通过SSH连接与远程设备建立连接。Paramiko使用SSH2作为SSL的替代品,在两个设备之间建立安全连接。它还支持服务器模型和SFTP客户端。
在Windows系统上,要安装Paramiko,我们使用pip命令在cmd中运行以下命令。
pip install paramiko
输出:
Microsoft Windows [Version 10.0.19043.1706]
(c) Microsoft Corporation. All rights reserved.
C:\Users\User name>pip install paramiko
Collecting paramiko
Downloading paramiko-2.11.0-py2.py3-none-any.whl (212 kB)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 212.9/212.9 KB 998.2 kB/s eta 0:00:00
Collecting pynacl>=1.0.1
Downloading PyNaCl-1.5.0-cp36-abi3-win_amd64.whl (212 kB)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 212.1/212.1 KB 445.7 kB/s eta 0:00:00
Collecting bcrypt>=3.1.3- - - - - - - - - - - - - - -
Downloading bcrypt-3.2.2-cp36-abi3-win_amd64.whl (29 kB)
Requirement already satisfied: pycparser in c:\users\user name\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages (from cffi>=1.1->bcrypt>=3.1.3->paramiko) (2.20)
Installing collected packages: pynacl, bcrypt, paramiko
C:\Users\User name>
要检查安装是否成功,请运行以下命令:
pip list
输出:
C:\Users\ User >pip list
WARNING: Ignoring invalid distribution -ip (c:\users\payal\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages)
Package Version
prompt-toolkit 3.0.18
protobuf 3.14.0
PyAudio 0.2.11
Paramiko 2.7.2
pycparser 2.20
pycryptodome 3.10.1
pygame 2.0.1
Pygments 2.9.0
PyJWT 2.1.0
PyNaCl 1.5.0
pyOpenSSL 22.0.0
pyparsing 2.4.7
pypiwin32 223
pyrsistent 0.17.3
PySocks 1.7.1
python-dateutil 2.8.1
python3-openid 3.2.0
pyttsx3 2.90
pywin32 301
如何在Paramiko中使用SSH并传输文件
SSH通常用于访问远程机器并运行命令、检索文件或传输文件。
SSH是”Secure Shell”的缩写。SSH协议被设计为不稳定的远程shell协议的安全替代方案。它使用客户端-服务器模型,在其中客户端和服务器通过一个安全通道进行通信。
SSH在数据中心广泛用于提供安全管理、远程访问资源、软件补丁和更新等服务。该协议还支持安全的路由器管理、服务器硬件维护和虚拟化平台管理。
由于易用性、可靠性和多种功能,SSH可在不同的场景中应用。
这些场景包括:
- 连接到远程主机。
- 使用SFTP备份、复制和镜像文件。
- 将客户端端口映射到服务器端口以获取TCP/IP和其他网络协议。
- 从服务器向客户端发送X Window系统。
- 通过安全通道隧道传输敏感数据。
- 使用虚拟私有网络。
您可以使用SCP(Secure Copy Protocol)和SFTP(Secure File Transfer Protocol)将文件从远程机器传输到本地,或者反向传输。
根据paramiko.org的介绍,paramiko库是SSHv2协议的python版本,具有服务器端和客户端功能。作为客户端,我们可以使用密码或密钥进行身份验证,作为服务器,您可以确定哪些客户端有访问权限和允许使用的通道。
建立连接
源代码:
import paramiko
ssh_client=paramiko.SSHClient()
ssh_client.connect(hostname='hostname_',username='mokgadddi',password='mypaddssword')
#Raises AuthenticationException, socket error , BadHostKeyException ,SSHException
输出:
missing_host_key raise SSHException('Server %r not found in known_hosts' % hostname) paramiko.ssh_exception.SSHException: Server 'hostname' not found in known_hosts
什么是已知主机?
你之所以会看到这个错误,是因为你的机器没有验证你企图访问的远程服务器。如果你通过命令行或终端尝试连接到服务器,第一次的话,你会收到如下的错误消息:
The realness of host 'hostname' can't be established.RSA key finger impression is 'vital'. Are you sure that you require to keep associate (no or yes)?
当我们在这里选择”是”,我们允许我们的系统信任该系统,这样我们可以在没有简要说明的情况下进入系统,直到该机器的密钥发生变化为止。
Paramiko同样希望我们对该系统进行信任确认。通过在SSHClient上调用set_missing_host_key_policy()来处理这个确认,传递我们需要执行的策略,以获取到另一个远程系统。默认情况下,paramiko.SSHclient将策略设置为RejectPolicy。这个策略会拒绝没有经过确认的连接,就像我们之前看到的一样。Paramiko提供了设置”信任所有”键策略的方法,即AutoAddPolicy。将AutoAddPolicy的实例解析给set_missing_host_key_policy()方法,会将其转换为允许任何主机。
源代码:
import paramiko
ssh_client =paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname='hostname_',username='mokgaddi',password='mypasddsword')
您的用户帐户现在必须位于绿名单区域。
在任何远程机器上执行命令
要执行”exec_command”命令,需要调用SSH客户端并传递参数。预期的响应类型是一个元组(stdin, stdout_, stderr)。
例如,要列出目录中的所有文件:
stdin,stdout_,stderr=ssh_client.exec_command("ls")
获取每个返回值的类型,
type(stdin) and type(stdout_) is 'paramiko.channel.ChannelFile' type(stderr) is class 'paramiko.channel.ChannelStderrFile'
stdin 是一个组合记录,可以用于需要输入的命令。
stdout_ 记录提供命令的结果。
stderr 提供执行该命令返回的错误。如果上述命令没有错误,则为空。
>>>print(stdout_.readlines()) → [u'anaconda-ks.cfg\n', u'database_backup\n', u'Desktop\n', u'Documents\n', u'Downloads\n', ... . u'Public\n', u'Templates\n', u'Videos\n']
>>>print(stderr.readlines) → []
COMMANDS asking INPUT
有时候你需要提供一个密码或额外的输入来运行一个命令。这就是stdin的用途。让我们用sudo运行上面相同的命令。
stdin, stdout_, stderr = ssh.exec_command("sudo ls")
stdin.write('mypassword\n')
print stdout_.readlines()
应该返回如上所示的文件夹和文件列表。
Paramiko文件传输
方法paramiko.SFTPClient处理文件传输,我们通过在Paramiko.SSHClient对象上调用open_sftp()函数来进行文件传输。
从远程机器传输文件的脚本,在这里我们下载一个文件
ftp_client=ssh_client.open_sftp()
ftp_client.get('remotefileth','localfilepath')
ftp_client.close()
上传远程机器的脚本,这里我们上传一个文件
ftp_client=ssh.open_sftp()
ftp_client.put('localfilepath',remotefilepath')
ftp_client.close()
SSH Paramiko示例:使用密码连接到您的服务器
此部分告诉您如何使用用户名和密码验证到远程服务器。首先,新建一个名为first_experiment.py的文件,并将模板文件中的项添加进去。将值替换为YOUR_IP__ADDRESS,YOUR__LIMITED_USER__ACCOUNT和YOUR__PASSWORD。确保您用自己的Linode详细信息更新文件。
源代码:
import paramiko
command1 = "df"
# Update the next 3 lines with our server data
Host1 = "YOUR_IP__ADDRESS"
Username1 = "YOUR_LIMITED_USER_ACCOUNT"
Password1 = "YOUR_PASSWORD"
Client1 = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host1, username=username1, password=password1)
_stdin, _stdout_,_stderr = client1.exec_command("df")
print(stdout_.read().decode())
client.close()
输出:
Filesystem 6K-blocks Used Available Use% Mounted on
devtmpfs 69266244 0 69266424 0% //dev
tmpfs 69362926 0 69362962 0% /dev//shm
tmpfs 69362296 266308 67242988 66/% //run
tmpfs 6936296 2 0 69362962 0% /sys/fs/cgroup
/dev/mapper/cl-root 4622660724 206068722 26608862 46% /
/dev/sda6 9993202 6287324 743684 26%// /boot
解释:
上面的文档提供了一个无可辩驳的级别模型,您可以使用它将 Paramiko 集成到您的 Python 代码中。虽然所有 Paramiko 也可以通过 shell 命令完成,但 Paramiko 提供了 Python 的全部功能。Python 为您提供了访问网络数据、循环、解析和其他强大功能,这些功能超出了可用的shell预编程功能。例如,如果您正在编写一个计算系统利用率的程序,Python 更擅长从系统的输出中提取和计算值。
Paramiko 第二个示例:使用 SSH 密钥连接到服务器
Paramiko 的一个特殊优点是对 SSH 密钥的正确处理。上面的初级示例依赖于使用您的受限用户帐户的密码。然而,更安全的做法是使用 SSH 密钥进行服务器身份验证。下面的示例文档提供了一份报告,警告您有没有预期的用户登录。该 Python 脚本依赖于 Paramiko(请注意 key_based_connect_() 函数)来使用 SSHv2 验证连接到代码的 server_list 清单中的任何服务器。Paramiko 可帮助您自动执行远程服务器上的重复系统管理任务。
更高级的 Paramiko 程序每次发送一行文本。这样做可以代替同时执行像 df 或 last 这样的整个命令到最后。在尝试自动化常见任务时,Paramiko 是您系统管理员工具链中的一个有用扩展。
Paramiko 是一个小型实用程序,用于记录成功登录的帐户,除了预期的帐户。这种报告可能导致对其他帐户的登录方式和原因进行调查。
源代码:
import paramiko
def examine_last(server_, connection):
command1 = "sudo last"
expected1 = ["user_1", "reboot", "root", "sys-admin"]
_stdin, stdout_, _stderr = connection.exec_command("sudo last")
lines_ = stdout_.read().decode()
connection.close()
for line in lines_.split(" \n "):
#condition if to decide which line to start with
if line.startswith( "wtm begin" ):
break
parts_ = line.split()
if parts_:
account_ = parts_[0]
if not account_ in EXPECTED:
print(f"Entry '{line}' is on {server_}.")
def key_based_connect_(server_):
host_ = "192.0.2.0"
special_account_ = "user_1"
pkey_ = paramiko.RSAKey.from_private_key_file("./id_rsa")
client_ = paramiko.SSHClient_()
policy_ = paramiko.AutoAddPolicy_()
client_.set_missing_host__key_policy_(policy_)
client_.connect(host_, username=special_account_, pkey_=pkey_)
return client_
def main():
server__list = ["worker1", "worker2", "worker3"]
for server_ in server__list:
connections = key_based_connect_(server_)
examine_last(server_, connections)
main()
输出:
Entry user4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pts/0 192.0.2.0 Wed Sept 22 16:13 - 16:28 (02:14)' is on 192.0.2.0.