paramiko是一個基於SSH用於連接遠程服務器並執行相關操作(SSHClient和SFTPClinet,即一個是遠程連接,一個是上傳下載服務),使用該模塊可以對遠程服務器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來實現的。
Paramiko模塊是基於Python實現的SSH遠程安全連接,用於SSH遠程執行命令、文件傳輸等功能。
默認Python沒有自帶,需要手動安裝:pip install paramiko。如果安裝失敗,可以嘗試yum安裝:yum install python-paramiko。
除了Paramiko模塊,還有相同作用的fabric和pexpect模塊。
SSH客戶端實現方案一,遠程執行命令(密碼認證)
# -*- coding:utf-8 -*- import paramiko # 先安裝pycrypto,再安裝paramiko # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在~/.ssh/known_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname="106.15.88.182", port=22, username="root", password="123456") # 執行命令,不要執行top之類的在不停的刷新的命令(可以執行多條命令,以分號來分隔多條命令) # stdin, stdout, stderr = ssh.exec_command("cd %s;mkdir %s" % ("/www/wwwroot", "aa")) stdin, stdout, stderr = ssh.exec_command("python /www/wwwroot/test.py") stdin.write("終端等待輸入...\n") # test.py文件有input()函數,如果不需要與終端交互,則不寫這兩行 stdin.flush() # 獲取命令結果 res, err = stdout.read(), stderr.read() result = res if res else err res = result.decode() res = result.decode("utf-8") res = result.decode(encoding="utf-8") print res # 關閉服務器連接 ssh.close()
SSH客戶端實現方案二,遠程執行命令(密碼認證)
import paramiko transport = paramiko.Transport(("106.15.88.182", 22)) transport.connect(username="root", password="123456") # 建立連接 # transport.connect(username="root", password="口令", hostkey="密鑰") # 創建SSH對象,SSHClient是定義怎么傳輸命令、怎么交互文件 ssh = paramiko.SSHClient() ssh._transport = transport # 執行命令,不要執行top之類的在不停的刷新的命令 stdin, stdout, stderr = ssh.exec_command("df") # 獲取命令結果 res, err = stdout.read(), stderr.read() result = res if res else err print result.decode() # 關閉服務器連接 transport.close()
SSH客戶端實現方案三,遠程執行命令(密碼認證)
import paramiko client = paramiko.SSHClient() # 創建SSH對象 client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 允許連接不在known_hosts文件中的主機 # 連接服務器,以用戶名和密碼進行認證 client.connect(hostname="106.15.88.182", port=22, username="root", password="123456") #實例化Transport,並建立會話Session ssh_session = client.get_transport().open_session() if ssh_session.active: ssh_session.exec_command("df") print ssh_session.recv(1024) # 關閉服務器連接 client.close()
SSH客戶端實現方案四,遠程執行命令(密鑰認證)
import paramiko ssh = paramiko.SSHClient() # 創建SSH對象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允許連接不在know_hosts文件中的主機 #這里寫我們的密鑰文件 private_key = paramiko.RSAKey.from_private_key_file("key.poem") # 連接服務器,這里我們用pkey參數設置為私鑰登陸 ssh.connect(hostname="106.15.88.182", port=22, username="root", pkey=private_key) stdin, stdout, stderr = ssh.exec_command('df') # 執行命令 res, err = stdout.read(), stderr.read() # stdout.readline() result = res if res else err print result.decode() ssh.close() # 關閉連接
封裝之后的使用
import sys,logging from paramiko.client import SSHClient, AutoAddPolicy from paramiko import AuthenticationException from paramiko.ssh_exception import NoValidConnectionsError class SshClient(): def __init__(self): self.ssh_client = SSHClient() def ssh_login(self, host_ip, username, password): try: # 設置允許連接known_hosts文件中的主機(默認連接不在known_hosts文件中的主機會拒絕連接拋出SSHException) self.ssh_client.set_missing_host_key_policy(AutoAddPolicy()) self.ssh_client.connect(host_ip, port=22, username=username, password=password) except AuthenticationException: logging.warning('username or password error') return 1001 except NoValidConnectionsError: logging.warning('connect time out') return 1002 except: print("Unexpected error:", sys.exc_info()[0]) return 1003 return 1000 def execute_some_command(self, command): stdin, stdout, stderr = self.ssh_client.exec_command(command) print stdout.read().decode() def ssh_logout(self): self.ssh_client.close() if __name__ == "__main__": command = "whoami" # 自己使用ssh時,命令怎么敲的command參數就怎么寫 ssh = SshClient() if ssh.ssh_login(host_ip="106.15.88.188", username="root", password="abc0506") == 1000: ssh.execute_some_command(command) ssh.ssh_logout()
https://www.cnblogs.com/breezey/p/6663546.html