Python Paramiko模块

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.

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程