1. 程式人生 > >python paramiko模組使用介紹

python paramiko模組使用介紹

原文:http://xpleaf.blog.51cto.com/9315560/1701040

在第五篇的最後本來還應該有個ftp軟體開發的作業的,但對比自己寫的和師兄寫的,感覺自己寫的太爛了,所以就不上傳了,等以後技術學好些再開發些小工具吧,現在還差好遠,還得非常非常努力啊!

    先說Paramiko模組是為了以後做監控軟體的開發做準備,所以這裡先說用Paramiko模組連線遠端主機,再介紹用Paramiko模組作遠端檔案傳送。

    主要內容是下面幾項:

1 2 3 4 1.Paramiko SSH連線遠端主機 1)使用使用者名稱密碼連線遠端主機 2)使用key連線遠端主機 2.Paramiko SFTP傳送檔案

    Paramiko模組是第三方庫,所以需要先進行安裝,安裝的過程可以看一位網友的文章http://www.cnblogs.com/xia520pi/p/3805043.html,這裡就不作記錄了。

1.Paramiko SSH連線遠端主機

(1)使用使用者名稱密碼連線遠端主機    

    程式程式碼及註釋如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/usr/bin/env python import paramiko    #匯入paramiko模組 import sys,os host = sys.argv[
1] #通過sys下的argv來獲取命令列的輸入,這裡為獲取命令的第一個引數 user = 'oldboy'    #需要連線的遠端主機的使用者名稱 password = '123456'    #需要連線的遠端主機的密碼 cmd = sys.argv[2]  #通過sys下的argv來獲取命令列的輸入,這裡為獲取命令的第二個引數  s = paramiko.SSHClient()    #呼叫paramiko模組下的SSHClient() s.load_system_host_keys()   #載入本地的known_hosts檔案,該檔案是紀錄連到對方時,對方給的 host key。每次連線時都會檢查目前對方給的 host key 與紀錄的 host key 是否相同,可以簡單驗證連結是否又被詐騙等相關事宜。
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())  #加上這句話不用擔心選yes的問題,會自動選上(用ssh連線遠端主機時,第一次連線時會提示是否繼續進行遠端連線,選擇yes) s.connect(host,22,user,password,timeout=5)    #連線遠端主機,SSH埠號為22 stdin,stdout,stderr=s.exec_command(cmd)       #執行命令 cmd_result = stdout.read(),stderr.read()      #讀取命令結果,讀取命令結果時,一個是空,一個不是空,有錯就不會有結果,有結果就沒錯。 for line in cmd_result: print line, s.close()

    下面演示一下執行結果,這裡我有一臺同網段的主機,IP地址為:192.168.1.124,如下:

1 2 3 4 5 6 7 8 9 10 11 [email protected]:/mnt/hgfs/Python/day6# python ssh1.py 192.168.1.124 df Filesystem     1K-blocks    Used Available Use% Mounted on /dev/sda3        9602276 3538300   5576196  39% / tmpfs             959228       0    959228   0% /dev/shm /dev/sda1         198337   34143    153954  19% /boot [email protected]:/mnt/hgfs/Python/day6# python ssh1.py 192.168.1.124 'df -h' Filesystem      Size  Used Avail Use% Mounted on /dev/sda3       9.2G  3.4G  5.4G  39% / tmpfs           937M     0  937M   0% /dev/shm /dev/sda1       194M   34M  151M  19% /boot

    返回的資料即是遠端主機的命令執行結果。

(2)使用key連線遠端主機

    與(1)並沒有多大區別,只是認證方式為使用key,因此程式碼中不需要寫密碼,先給出程式碼及註釋:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/usr/bin/env python import paramiko import sys,os host = sys.argv[1] user = 'oldboy' pkey_file = '/home/xpleaf/.ssh/id_rsa'   #指定用來解密的私鑰的路徑,這個需要手動生成,下面會講如何生成 key = paramiko.RSAKey.from_private_key_file(pkey_file)    #使用私鑰解密 cmd = sys.argv[2] s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) s.connect(host,22,user,pkey=key,timeout=5) stdin,stdout,stderr=s.exec_command(cmd) cmd_result = stdout.read(),stderr.read() for line in cmd_result: print line, s.close()

    使用上面的程式前,先說說如何生成私鑰和公鑰(對稱與非對稱加密,公鑰加密,私鑰解密等的原理,這裡就不說了),同時也把公鑰傳送給認證方(遠端主機):

1)被認證方生成私鑰和公鑰

1 2 3 [email protected]:/mnt/hgfs/Python/day6$ ssh-keygen  [email protected]:/mnt/hgfs/Python/day6$ ls /home/xpleaf/.ssh/ id_rsa  id_rsa.pub  known_hosts

2)將公鑰傳送給認證方(遠端主機)

1 [email protected]:/mnt/hgfs/Python/day6$ ssh-copy-id [email protected]192.168.1.124

    完成了上面的步驟後,就可以連線遠端主機並執行命令了:

1 2 3 4 5 6 7 8 9 10 11 [email protected]:/mnt/hgfs/Python/day6# python ssh_key2.py 192.168.1.124 df Filesystem     1K-blocks    Used Available Use% Mounted on /dev/sda3        9602276 3538304   5576192  39% / tmpfs             959228       0    959228   0% /dev/shm /dev/sda1         198337   34143    153954  19% /boot [email protected]:/mnt/hgfs/Python/day6# python ssh_key2.py 192.168.1.124 'df -h' Filesystem      Size  Used Avail Use% Mounted on /dev/sda3       9.2G  3.4G  5.4G  39% / tmpfs           937M     0  937M   0% /dev/shm /dev/sda1       194M   34M  151M  19% /boot

2.Paramiko SFTP傳送檔案

    程式碼及註釋如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/usr/bin/env python import paramiko import sys,os host = sys.argv[1] user = 'oldboy' password='123456' t = paramiko.Transport((host,22)) t.connect(username=user,password=password)    #連線方式也可以用key,這裡只需要將password=password改為pkey=key,其餘的key程式碼與前面的一樣 sftp = paramiko.SFTPClient.from_transport(t)  #使用t的設定方式連線遠端主機 sftp.get('/tmp/hello.txt','hello.txt')        #下載檔案 sftp.put('ssh1.py','/tmp/ssh1.py')            #上傳檔案 t.close()

    演示如下:

    這裡FTP客戶端有檔案ssh1.py,FTP服務端(192.168.1.124的主機)的/tmp目錄下有hello.txt檔案,需要將ssh1.py上傳到服務端,將hello.txt下載到客戶端的當前目錄。

1)執行程式

1 [email protected]:/mnt/hgfs/Python/day6$ python ssh_sftp3.py 192.168.1.124

如果沒有錯誤就不會有任何提示。

2)客戶端下檢視下載的檔案

1 2 3 4 5 6 7 [email protected]:/mnt/hgfs/Python/day6$ ls -l 總用量 7 -rwxrwxrwx 1 root root   19 10月  8 23:49 hello.txt drwxrwxrwx 1 root root 4096 10月  8 22:40 sorftwares -rwxrwxrwx 1 root root  435 10月  8 11:36 ssh1.py -rwxrwxrwx 1 root root  544 10月  8 15:07 ssh_key2.py -rwxrwxrwx 1 root root  331 10月  8 23:42 ssh_sftp3.py

3)服務端下檢視上傳的檔案

1 2 3 4 5 [[email protected] tmp]$ ls -l total 12 drwxrwxrwt. 3 root   root   4096 May 13 09:35 etc -rw-rw-r--  1 oldboy oldboy   19 Oct  8 12:11 hello.txt -rw-rw-r--  1 oldboy oldboy  435 Oct  8 20:31 ssh1.py