paramiko是一個基於SSH用於鏈接遠程服務器並執行相關操做(SSHClient和SFTPClinet,即一個是遠程鏈接,一個是上傳下載服務),使用該模塊能夠對遠程服務器進行命令或文件操做,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。python
用於鏈接遠程服務器並執行基本命令,server上要啓動ssh程序bash
#!/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
#!/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
#!/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()
用於鏈接遠程服務器並執行上傳下載,server上要啓動ssh程序spa
此處使用 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()
#!/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