Paramiko的使用

来自CloudWiki
Cloud17讨论 | 贡献2020年5月23日 (六) 09:04的版本
跳转至: 导航搜索

Paramiko的使用

安装

pip install paramiko

pip会自动安装Paramiko所依赖的包。如果要离线安装,则先使用pip下载。

mkdir paramiko && cd paramiko #创建一个目录存放安装包
pip download paramiko #下载到paramiko中,并传输至离线环境
pip install paramiko –no-index -f paramiko #离线环境下在目录paramiko中检索安装包

基于用户名和密码的SSHClient方式登录

编程步骤如下:

(1)初始化一个SSHClient类的实例。

(2)调用connect方法连接远程主机。

(3)执行命令获取输出结果和返回值,关闭连接。

# -*- coding: utf-8 -*-
# File Name: paramiko_user_pwd.py
# Description: 使用用户名密码来登陆并执行远程命令
import paramiko

# 建立一个sshclient对象
ssh = paramiko.SSHClient()
# 将信任的主机自动加入到host_allow列表,须放在connect方法前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 调用connect方法连接服务器
ssh.connect(hostname="192.168.1.3", port=22, username="root", password="000000")
# 执行命令
stdin, stdout, stderr = ssh.exec_command("echo `date` && df -hl")
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode('utf-8'))
# 
returncode = stdout.channel.recv_exit_status()
print("returncode:",returncode)
# 关闭连接
ssh.close()

运行结果:

[root@localhost op]# python3 paramiko_user_pwd.py

Sat May 23 16:26:31 CST 2020
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 979M     0  979M   0% /dev
tmpfs                    991M     0  991M   0% /dev/shm
tmpfs                    991M  9.6M  981M   1% /run
tmpfs                    991M     0  991M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  2.3G   15G  14% /
/dev/sda1               1014M  139M  876M  14% /boot
tmpfs                    199M     0  199M   0% /run/user/0

returncode: 0

本方法是传统的连接服务器、执行命令、关闭一个操作,有时候需要登录上服务器执行多个操作,如执行命令、上传/下载文件,该方法则无法实现,可以通过下面的方法来操作。

基于用户名和密码的Transport方式登录并实现上传与下载

步骤:

(1)实例化一个Transport的实例,并调用connect方法连接远程主机。

(2)实例化一个SSHClient的实例,指定其_transport为步骤1的实例。

(3)实例化一个sftp对象,指定连接的通道为步骤1的实例。

(4)执行命令或sftp上传下载命令。

(5)关闭连接。

 # -*- coding: utf-8 -*-
#Time: 2018/8/23 22:07:12
#Description: 实现上传和下载功能
#File Name: transport_upload_download.py
 
import paramiko

trans = paramiko.Transport(('192.168.1.3', 22))
# 建立连接,指定SSHClient的_transport
trans.connect(username='root', password='000000')
ssh = paramiko.SSHClient()
ssh._transport = trans
# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('echo `date` && df -hl')
print(stdout.read().decode('utf-8'))

# 实例化一个 sftp对象,指定连接的通道
sftp = paramiko.SFTPClient.from_transport(trans)
# 发送文件
sftp.put(localpath='./transport_upload_download.py',
        remotepath='/tmp/transport_upload_download_tmp.py')
# 下载文件
sftp.get(localpath='./tmp/transport_upload_download.py',
        remotepath='/tmp/transport_upload_download_tmp.py')
stdin, stdout, stderr = ssh.exec_command('ls -ltr /tmp')
print(stdout.read().decode('utf-8'))
# 关闭连接
trans.close()

参考文档:https://www.cnblogs.com/xiao-apple36/p/9144092.html

https://developer.51cto.com/art/201910/604700.htm