Python操作遠程服務器paramiko模塊介紹


    paramiko模塊是基於Python實現的SSH遠程安全連接,可以提供在遠程服務器上執行命令、上傳文件到服務器或者從指定服務器下載文件的功能。

paramiko模塊安裝方法

    paramiko模塊不是python自帶的標准庫,需要自行下載安裝,建議使用pip自動安裝。方法如下:

  (1)配置pip命令和鏡像源路徑。參考<python工具安裝和pip工具配置>完成配置。如果已配置,跳過。

  (2)執行pip install paramiko進行安裝。出現successful字樣表示安裝完成。

paramiko常用函數介紹

SSHclient類

(1)ssh遠程連接服務器,格式為:connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, ...)。其中hostname表示主機IP,port表示ssh服務端口號,默認是22,username和password表示登錄用戶名和密碼,timeout表示設置連接超時時長。

(2)遠程主機沒有本地主機密鑰或HostKeys對象時的連接方法。格式為:set_missing_host_key_policy(policy)。其中policy參數常見取值有3種,分別如下:

 AutoAddPolicy:自動添加主機名及主機密鑰到本地的known_hosts,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認。最為常用。

WarningPolicy 用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy類似,但是會提示是新連接。

RejectPolicy 自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此為默認選項

(3)遠程執行命令,函數格式:exec_command(command, bufsize=-1, timeout=None, get_pty=False, environment=None),該命令的輸入與輸出流為標准輸入、標出輸出、標准錯誤輸出。

(4)在遠程服務器上生成新的交互式shell。函數格式為:invoke_shell(term='vt100', width=80, height=24, width_pixels=0, height_pixels=0, environment=None)。

  上述只是介紹了SSHclient類常用的幾個函數。SSHclient類函數詳細介紹參考SSHClient

SFTPClient類

(1)創建一個已連通的SFTP客戶端通道,格式為:from_transport(cls,t)

(2)將本地文件上傳到服務器,格式為:put(localpath, remotepath, callback=None, confirm=True)

(3)從服務器下載文件到本地,格式為:get(remotepath, localpath, callback=None)

(4)在服務器上創建目錄,格式為:mkdir() 

(5)在服務器上刪除目錄,格式為:remove() 

(6)在服務器上重命名目錄,格式為:rename() 

(7) 查看服務器文件狀態,格式為:stat() 

(8)列出服務器目錄下的文件,格式為:listdir() 

paramiko常用場景

(1)在遠程服務器執行命令,並獲取命執行命令輸出結果

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!') stdin, stdout, stderr = ssh.exec_command('df -k') print stdout.read() ssh.close()

(2)在遠程服務器執行命令,並獲取執行命令的結果碼

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!') stdin, stdout, stderr = ssh.exec_command('df -k') channel = stdout.channel ret = channel.recv_exit_status() if ret == 0: print stdout.read() else: print stderr.read()

(3)在遠程服務器執行命令,需要生成子進程並交互執行命令

import paramiko,time ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!') interact = conn.invoke_shell() stdin, stdout, stderr = ssh.exec_command('df -k') interact = conn.invoke_shell() interact.send("sed -i '/192.168.0.2/d' /root/.ssh/known_hosts" + '\n') time.sleep(1) interact.send('ssh root@172.16.128.2' + '\n') time.sleep(2) interact.send('yes' + '\n') time.sleep(2) interact.send('Aa12345!' + '\n') time.sleep(2) interact.send('df -k!' + '\n') result = interact.recv(65535) print result

(4)上傳文件到遠程服務器

import paramiko scp = paramiko.Transport(('192.168.0.1',22)) scp.connect(username='root',password='Aa12345!') sftp=paramiko.SFTPClient.from_transport(scp) local_path = "D:\\temp\\cc.txt" remote_path = "/tmp/cc.txt" sftp.put(local_path, remote_path) scp.close()

(5)從遠程服務器下載文件

import paramiko scp = paramiko.Transport(('192.168.0.1',22)) scp.connect(username='root',password='Aa12345!') sftp=paramiko.SFTPClient.from_transport(scp) remote_path = "/tmp/aaaa.txt" local_path = "D:\\temp\\aaaa.txt" sftp.get(remote_path, local_path) scp.close()

paramiko使用完整實例

import paramiko def ssh_con(ip, username, password): try: con = paramiko.SSHClient() con.set_missing_host_key_policy(paramiko.AutoAddPolicy()) con.connect(ip=ip, username=username, password=password, timeout=5) except: return None else: return con def exec_cmd(conn, cmd): interact = conn.invoke_shell() interact.send(cmd) result = interact.recv(65535) return result def exec_cmd2(conn,cmd): stdin, stdout, stderr = conn.exec_command(cmd) channel = stdout.channel ret = channel.recv_exit_status() if ret == 0: return (ret, stdout.read()) else: return (ret, stderr.read()) if __name__ == '__main__': ip = '192.168.0.1' user = 'root' passwd = 'root' con = ssh_con(ip, user, passwd) if not con: print "Connect %s fail,please check." % (ip,) cmd = 'df -k' ret, result = exec_cmd2(con,cmd) print result 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM