Paramiko簡介
Paramiko它是Python 2.7 / 3.4+ 的一個模塊,它實現了SSH2協議,用於與遠程機器的安全(加密和認證)連接。與SSL不同,SSH2不需要強大的中央權威機構簽署的分層證書。SSH2協議是替換Telnet和rsh以便更安全的訪問遠程shell的協議 ,但該協議還包括通過加密隧道向遠程服務器打開任意通道的功能(例如:SFTP的工作方式)。
Github:https://github.com/paramiko/paramiko
ssh基本原理與特點
SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。傳統的網絡服務程序,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網絡上用明文傳送口令和數據,別有用心的人非常容易就可以截獲這些口令和數據。而且,這些服務程序的安全驗證方式也是有其弱點的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。
ssh另一項優點就是對傳輸的數據進行加密,可以加快傳輸速度,SSH有很多功能,它既可以代替Telnet,又可以為FTP、POP、甚至為PPP提供一個安全的“通道”。
ssh使用
使用ssh登陸到服務器
不指定用戶
ssh 192.168.0.11
指定用戶
ssh -l root 192.168.0.11
ssh root@192.168.0.11
指定端口、用戶
ssh -p 12333 root@216.230.230.114
Paramiko的安裝
pip install paramiko virtualenv source venv/bin/activate pip install paramiko
Paramiko遠程執行Linux命令
基於用戶名密碼方式連接:
import paramiko # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname='192.168.1.1', port=22, username='weiheng', password='weiheng123') # 執行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結果 result = stdout.read() # 關閉連接 ssh.close()
基於公鑰密鑰方式連接:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/.ssh/id_rsa') # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname='192.168.1.1', port=22, username='weiheng', key=private_key) # 執行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結果 result = stdout.read() # 關閉連接 ssh.close()
Paramiko遠程上傳和下載文件
paramiko遠程上傳和下載
import paramiko transport = paramiko.Transport(('192.168.1.1',22)) transport.connect(username='weiheng',password='weiheng123') sftp = paramiko.SFTPClient.from_transport(transport) # 將HelloWorld.py 上傳至服務器 /tmp/1.py sftp.put('/tmp/HelloWorld.py', '/tmp/1.py') # 將1.py 下載到本地 HelloWorld sftp.get('/tmp/1.py', '/tmp/HelloWorld') transport.close()
使用SSHClient封裝Transport
我們可能會遇到 需要傳輸文件,有需要執行Linux命令的情況, 因為Transport對象只能傳輸文件,不能執行Linux命令,所以我們只需要創建一個SSHClient,然后通過SSHClient的 get_transport() 來創建Transport對象
import paramiko # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname='192.168.1.1', port=22, username='weiheng', password='weiheng123') # 獲取Transport對象 trans_obj = ssh_client.get_transport() sftp_obj = paramiko.SFTPClient.from_transport(trans_obj) sftp_obj.get_channel() # 使用sftp_obj上傳和下載文件 sftp_obj.put('source','target') sftp_obj.get('source','target') # 執行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結果 result = stdout.read() # 關閉連接 ssh.close()