首先安裝模塊:pip install paramiko
參考官方文檔用法:http://docs.paramiko.org/en/2.0/api/client.html
獲取linux服務器的ip,代碼如下:
import paramiko import re class GetLinuxIp(): '''獲取linux服務器ip''' def __init__(self, hostname, port, username, password, cmds): ''' :param hostname: linux主機的ip :param port: linux主機的端口 :param username: linux主機登錄用戶名 :param password: linux主機登錄密碼 :param cmds: 需要執行的linux命令 ''' self.ip = hostname self.port = port self.user = username self.password = password self.cmds = cmds try: self.client = paramiko.SSHClient() # 實例化客戶端 # 保存服務器的主機名和密鑰信息 self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務端,進行身份驗證 self.client.connect(self.ip, self.port, self.user, self.password, timeout=10) print("連接成功...") except Exception as e: # raise e print("連接失敗,錯誤是{}".format(e)) raise e def excute_command(self): '''執行命令''' # todo stdin是標准輸入文件,stdout是標准輸出文件,stderr標准出錯文件,應用在輸出的重新定位上。 self.stdin, self.stdout, self.stderr = self.client.exec_command(self.cmds) def get_result(self): '''獲取結果''' result = self.stdout.read().decode() pattern = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}') self.ip = pattern.search(result).group() print("獲取到linux服務器的ip是:{}".format(self.ip)) def __del__(self): '''關閉連接''' self.client.close() print("連接關閉...") if __name__ == '__main__': linux = GetLinuxIp("121.196.120.113", 22, "root", "123_Xiaohaikun", "ifconfig") linux.excute_command() linux.get_result()
運行結果如圖:
執行多條linux命令,多條命令放在一個單引號下面,各命令之間用分號隔開,如:cmd_str = "cd /;cd etc;ls -l;" 且在末尾加上get_pty=True
demo如下:
import paramiko def remot_connect(hostname, port, username, password, cmd_str): # 創建SSHClient 實例對象 ssh = paramiko.SSHClient() # 調用方法,表示沒有存儲遠程機器的公鑰,允許訪問 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接遠程機器,地址,端口,用戶名密碼 ssh.connect(hostname, port, username, password, timeout=10) # 輸出命令執行結果 stdin, stdout, stderr = ssh.exec_command(cmd_str, get_pty=True) result = stdout.read() print(result.decode()) # 關閉連接 ssh.close() if __name__ == '__main__': hostname = "121.196.120.113" port = 22 username = "root" password = "123_Xiaohaikun" cmd_str = "cd /;cd etc;ls -l;" remot_connect(hostname, port, username, password, cmd_str)
代碼運行結果如圖:
xshell上顯示如圖:
上傳文件:
demo如下:
import paramiko import datetime import os def upload(hostname, username, password, port, local_file_path, remote_path): ''' :param hostname: :param username: :param password: :param port: :param local_file_path: 本地文件路徑 :param remote_path: linux保存路徑 :return: ''' try: t = paramiko.Transport((hostname, port)) t.connect(username=username, password=password) sftp = paramiko.SFTPClient.from_transport(t) print('開始上傳文件{}'.format(datetime.datetime.now())) try: sftp.put(local_file_path, remote_path) except Exception as e: sftp.mkdir(os.path.split(remote_path)[0]) sftp.put(local_file_path, remote_path) print("從本地: {} 上傳到linux目錄下: {}".format(local_file_path, remote_path)) print('文件上傳成功 {} '.format(datetime.datetime.now())) t.close() except Exception as e: print(repr(e)) if __name__ == '__main__': hostname = '121.196.120.113' username = 'root' password = '123_Xiaohaikun' port = 22 local_file_path = r'D:\Video\1.mp4' remote_path = os.path.join('/root/temp/', "1.mp4") upload(hostname, username, password, port, local_file_path, remote_path)
運行結果: