一、paramiko模块
Python的paramiko模块基于SSH用于连接远程服务器并执行相关的操作。
1.1 在windows上安装paramiko模块
测试环境: win10 , python3.5 并且已安装 pip
在命令窗口,切换到 python 安装目录中的 Scripts
执行: pip install paramiko
检测: import paramiko
二、SSHClient
2.1 基于用户名密码连接
import paramiko
'''
用于连接远程服务器,并执行命令
'''
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='172.16.200.30', port=22, username='root', password='111111')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls&&df')
# 获取命令结果
# 三元运算
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode())
# 关闭连接
ssh.close()
输出
- stdin => 标准输入,就是你输入的那个命令
- stdout => 标准输出,你输入命令后执行的结果
- stderr => 标准错误,名利执行的过程中,如果出错了,就把这个错误打到这里
2.2 基于公钥秘钥连接
其实很上面用密码登入没什么区别,只是不用写明文密码了
import paramiko
private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='172.16.200.30', port=22, username='root', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果
# 三元运算
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode())
# 关闭连接
ssh.close()
输出
004776
1
_1748
anaconda-ks.cfg
monitor
npm-debug.log
2.3 SSHClietn封装了transport
# -*- coding: UTF-8 -*-
# SSHClient 封装了Transport
import paramiko
transport = paramiko.Transport(('172.16.200.30', 22))
transport.connect(username='root', password='111111')
ssh = paramiko.SSHClient()
ssh._transport = transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode())
transport.close()
基于秘钥
# SSHClient 封装了Transport
import paramiko
private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi')
transport = paramiko.Transport(('172.16.200.30', 22))
transport.connect(username='root', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ds')
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode())
transport.close()
三、SFTPClient
用于连接远程服务器并执行上传和下载
3.1 基于用户名和密码
import paramiko
transport = paramiko.Transport(('172.16.200.30', 22))
transport.connect(username='root', password='111111')
sftp = paramiko.SFTPClient.from_transport(transport)
# 将本地文件上传至服务器
sftp.put(r'G:\python\untitled\study9\ceshi', '/tmp/ceshi')
# 将远程服务器的文件下载至本地
sftp.get('/tmp/test.txt', r'G:\python\untitled\study9\test_linux.txt')
transport.close()
#注:
上传和下载的路径必须是全路径,即必须把文件名也加上,不能只写目录名
3.2 基于公钥和私钥上传和下载
同样改变不多
import paramiko
# 秘钥
private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi')
transport = paramiko.Transport(('172.16.200.30', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将本地文件上传至服务器
sftp.put(r'G:\python\untitled\study9\ceshi', '/tmp/ceshi')
# 将远程服务器的文件下载至本地
sftp.get('/tmp/test.txt', r'G:\python\untitled\study9\test_linux.txt')
transport.close()