paramiko模塊

1)paramiko模塊簡介

  paramiko是一個基於SSH用於鏈接遠程服務器並執行相關操做(SSHClient和SFTPClinet,即一個是遠程鏈接,一個是上傳下載服務),使用該模塊能夠對遠程服務器進行命令或文件操做,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。python

 

2)使用paramiko模塊作SSHClient

用於鏈接遠程服務器並執行基本命令,server上要啓動ssh程序bash

2.1 SSHClient沒有封裝Transport的用法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2018/7/30 17:43
# @Author  : zhouyuyao
# @File    : demon2.py
import paramiko

# 建立SSH對象
ssh = paramiko.SSHClient()
# 容許鏈接不在~/.ssh/known_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 鏈接服務器
ssh.connect(hostname='xxx.xxx.xxx.xxx', port=22, username='username', password='password')
# 執行命令,不要執行top之類的在不停的刷新的命令
stdin, stdout, stderr = ssh.exec_command('df -h')
# 獲取命令結果
result = stdout.read()
# 獲取的命令結果是bytes類型
print(result.decode(encoding="utf-8"))
# 關閉鏈接
ssh.close()

運行以後得出執行命令的結果服務器

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   27G   11G  71% /
/dev/vdb1        99G   81G   14G  86% /mnt/vdbdata

2.2 SSHClient 封裝 Transport 的用法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2018/7/30 17:50
# @Author  : zhouyuyao
# @File    : demon3.py
import paramiko
transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))      # 創建鏈接
transport.connect(username='username', password='password')  # 創建鏈接
# 建立SSH對象
ssh = paramiko.SSHClient()  # SSHClient是定義怎麼傳輸命令、怎麼交互文件
ssh._transport = transport
# 執行命令,不要執行top之類的在不停的刷新的命令
stdin, stdout, stderr = ssh.exec_command('w')
# 獲取命令結果
result = stdout.read()
# 獲取的命令結果是bytes類型
print(result.decode(encoding="utf-8"))
# 關閉鏈接
transport.close()

運行以後得出執行命令的結果ssh

08:47:47 up 220 days, 23:29,  1 user,  load average: 0.05, 0.06, 0.09
USER        TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
loguser     pts/1    xx.xx.xx.xx      08:47   31.00s  0.01s  0.01s  -bash

2.3 基於ssh免密登入的私鑰鏈接

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2018/7/30 17:56
# @Author  : zhouyuyao
# @File    : demon4.py
import paramiko

# 指定使用ssh免密登入的私鑰
private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')

transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))
transport.connect(username='username', pkey=private_key)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('uptime')

transport.close()

 

3)使用 paramiko 模塊作 SFTPClient

用於鏈接遠程服務器並執行上傳下載,server上要啓動ssh程序spa

3.1 基於用戶名密碼上傳下載

此處使用 SFTPClient 封裝 Transport 的用法,僅適用於文件,不支持目錄。線程

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2018/7/31 8:54
# @Author  : zhouyuyao
# @File    : demon5.py
import paramiko

transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))      # 創建鏈接
transport.connect(username='username', password='password')  # 創建鏈接
# 建立sftp對象
sftp = paramiko.SFTPClient.from_transport(transport)  # SFTPClient是定義怎麼傳輸文件、怎麼交互文件
# 將location.py 上傳至服務器 /tmp/test.py
sftp.put('E:/GitHub/Python-Learning/work/2018-07-27/auto_task.yml', '/tmp/auto_task.yml')
# 將remove_path 下載到本地 local_path
sftp.get('/root/nohup.out', 'E:/GitHub/Python-Learning/work/2018-07-27/nohup.out')
# 關閉鏈接
transport.close()

3.2 基於 ssh 免密登入的私鑰上傳下載

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
 
# 指定使用ssh免密登入的私鑰
private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')
  
transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))
transport.connect(username='username', pkey=private_key )
  
sftp = paramiko.SFTPClient.from_transport(transport)
# 將location.py 上傳至服務器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 將remove_path 下載到本地 local_path
sftp.get('remove_path', 'local_path')
  
transport.close()

 

 

參考資料

1. paramiko模塊、進程、線程code

相關文章
相關標籤/搜索