返回顶部

python的paramiko模块

一. 简介

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。

有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

由于paramiko属于第三方库,所以需要使用如下命令先行安装:

pip3 install paramiko

 

paramiko包含两个核心组件:SSHClient和SFTPClient

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
  • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。
# Paramiko中的几个基础名词:
 
1、Channel:是一种类Socket,一种安全的SSH传输通道;
2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

 

 

二. 基本使用

2.1 基于用户名密码:

import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.153.132', port=22, username='root', password='1234')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -h')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
print(result)

 

2.2 基于公钥和私钥

"""
连接服务器的两种方法:
    - 用户名和密码
    - 公钥和私钥(公司)
        - 在自己电脑生成一对密钥(公钥+私钥),命令:ssh-keygen (powershell)
            私钥:/c/Users/oldboy/.ssh/id_rsa.
            公钥:/c/Users/oldboy/.ssh/id_rsa.pub
        - 查看公钥私钥
            cd ~/.ssh
        - 将自己的公钥放到服务器上。
            ssh-copy-id  -i 本地公钥路径  用户名@服务器IP
"""

import paramiko

private_key = paramiko.RSAKey.from_private_key_file(r'c:/Users/Administrator.DESKTOP-2F1QLD1/.ssh/id_rsa')

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.153.132', port=22, username='root', pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -h')
# 获取命令结果
result = stdout.read()

# 关闭连接
ssh.close()

print(result.decode('utf-8'))

 

2.3 paramiko下载上传文件

import paramiko

transport = paramiko.Transport(('192.168.153.132', 22))
# 也可以通过pkey指定私钥 transport.connect(username
='root',password='1234') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py # sftp.put('hello.txt', '/tmp/hello.txt') # 将remove_path 下载到本地 local_path sftp.get('/tmp/hello.txt', 'newhello.txt') transport.close()

 

posted @ 2020-10-17 11:56  muguangrui  阅读(221)  评论(0编辑  收藏  举报