一、简介
paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
二、使用
1、下载
pip3 install paramiko
2、模块使用
SSHClient:
远程连接分为两种:
- (1)基于用户名密码连接
- (2)基于公钥秘钥连接
通过是用paramiko远程操作,其实本质也分为两种:
- (1)只用SSHClient
- (2)自己创建一个transport
**Note: **
基于SSHClient是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,上面方法则无法实现,可以通过如下方式来操作.
# coding:utf-8
import paramiko
# 1. SSHClient 用户名 密码
def SSHClient_userPassword():
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.137.2.2', port=22, username='root', password='***')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls')
# 获取命令结果
result = stdout.read()
print(result) # b'2020\n2021\n'
# 关闭连接
ssh.close()
# 2. SSHClient 基于公钥秘钥连接
def SSHClient_rsa():
# 添加公钥密钥文件
private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
#ssh.connect(hostname='123.57.2.2', port=22, username='root', password='***')
ssh.connect(hostname='123.57.2.2', port=22, username='root', pkey=private_key)
# 执行命令
# 执行多条命令时需要将各个命令用‘;’隔开,最后将get_pty设为True;如果是单条命令的则只传入命令即可
stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls', get_pty=True)
# 多条命令的话会将执行结果一起返回,所以建议遍历打印。也可以直接打印:print(stdout.read().decode('utf-8'))
files = stdout.readlines()
for i in files:
# 打印执行反馈结果
print(i.encode().decode('utf-8').split()[0])
# 打印报错信息
print(stderr.read().decode('utf-8'))
# 关闭连接
ssh.close()
# 3. SSHClient 封装 Transport
def Transport_userPassword():
import paramiko
transport = paramiko.Transport(('10.137.2.2', 22))
transport.connect(username='root', password='***')
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls')
#print(stdout.read()) # b'2021\n'
files = stdout.readlines()
print(files) # ['2021\n']
for i in files:
# 打印执行反馈结果
#print(i.encode().decode('utf-8').split()) # ['2020', '2021']
print(i.split()) # ['2021']
# 打印报错信息
# print(stderr.read().decode('utf-8')) # 打印出空
transport.close()
# 4. SSHClient 封装 Transport 基于公钥秘钥连接
def Transport_rsa():
# 添加公钥密钥文件
private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
transport = paramiko.Transport(('123.57.2.2', 22))
transport.connect(username='root', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 执行命令
# 执行多条命令时需要将各个命令用‘;’隔开,最后将get_pty设为True;如果是单条命令的则只传入命令即可
stdin, stdout, stderr = ssh.exec_command('cd /home/image_accept;ls', get_pty=True)
# 多条命令的话会将执行结果一起返回,所以建议遍历打印。也可以直接打印:print(stdout.read().decode('utf-8'))
files = stdout.readlines()
for i in files:
# 打印执行反馈结果
print(i.encode().decode('utf-8').split()[0])
# 打印报错信息
print(stderr.read().decode('utf-8'))
# 关闭连接
ssh.close()
if __name__ == '__main__':
# 1. SSHClient 用户名 密码
SSHClient_userPassword()
# 2. SSHClient 基于公钥秘钥连接
SSHClient_rsa()
# 3. SSHClient 封装 Transport
Transport_userPassword()
# 4. SSHClient 封装 Transport 基于公钥秘钥连接
Transport_rsa()
SFTPClient:
用于连接远程服务器并进行上传下载功能。
# coding:utf-8
import paramiko
# 1. 基于用户名密码上传下载
def transport_user_put_get():
import paramiko
transport = paramiko.Transport(('10.37.2.2', 22))
transport.connect(username='root', password='***')
sftp = paramiko.SFTPClient.from_transport(transport)
# 将123.txt 上传至服务器 /vrfct_test/test/123.txt
sftp.put('file/123.txt', '/vrfct_test/test/123.txt')
# 将 abc.txt 下载到本地 local_path
sftp.get('/vrfct_test/test/abc.txt', 'file/abc.txt')
transport.close()
# 2. 基于公钥秘钥上传下载
def transport_rsa_put_get():
private_key = paramiko.RSAKey.from_private_key_file('C:/Users/**/.ssh/id_rsa')
transport = paramiko.Transport(('123.57.2.2', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将123.txt 上传至服务器 /vrfct_test/test/123.txt
sftp.put('file/123.txt', '/vrfct_test/test/123.txt')
# 将 abc.txt 下载到本地 local_path
sftp.get('/vrfct_test/test/abc.txt', 'file/abc.txt')
transport.close()
class SSHConnection(object):
def __init__(self, host='10.37.2.2', port=22, username='root',pwd='***'):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.__k = None
def run(self):
self.connect() # 连接远程服务器
self.upload('file/123.txt', '/vrfct_test/test/23.txt')
# 将本地的123.txt文件上传到远端服务器的remote_service/目录下并改名为23.txt
self.cmd('df') # 执行df 命令
self.close() # 关闭连接
def connect(self):
transport = paramiko.Transport((self.host, self.port))
transport.connect(username=self.username, password=self.pwd)
self.__transport = transport
def close(self):
self.__transport.close()
def upload(self,local_path,target_path):
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(local_path,target_path)
def cmd(self, command):
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令结果
files = stdout.readlines()
for i in files:
# 打印执行反馈结果
print(i.encode().decode('utf-8').split()[0])
return files
if __name__ == '__main__':
# 1. 基于用户名密码上传下载
transport_user_put_get()
# 2. 基于公钥秘钥上传下载
transport_rsa_put_get()
# 3. 实现远程命令执行和文件上传
obj = SSHConnection()
obj.run()
网友评论