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
|