在第五篇的最後原本還應該有個ftp軟件開發的做業的,但對比本身寫的和師兄寫的,感受本身寫的太爛了,因此就不上傳了,等之後技術學好些再開發些小工具吧,如今還差好遠,還得很是很是努力啊!
html
先說Paramiko模塊是爲了之後作監控軟件的開發作準備,因此這裏先說用Paramiko模塊鏈接遠程主機,再介紹用Paramiko模塊做遠程文件傳送。
python
主要內容是下面幾項:
ssh
1.Paramiko SSH鏈接遠程主機 (1)使用用戶名密碼鏈接遠程主機 (2)使用key鏈接遠程主機 2.Paramiko SFTP傳送文件
Paramiko模塊是第三方庫,因此須要先進行安裝,安裝的過程能夠看一位網友的文章http://www.cnblogs.com/xia520pi/p/3805043.html,這裏就不做記錄了。ide
1.Paramiko SSH鏈接遠程主機工具
(1)使用用戶名密碼鏈接遠程主機 加密
程序代碼及註釋以下:
spa
#!/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()
關於sys.argv[]方法的使用,能夠看這裏:http://xpleaf.blog.51cto.com/9315560/1700811命令行
下面演示一下執行結果,這裏我有一臺同網段的主機,IP地址爲:192.168.1.124,以下:
htm
root@xpleaf-machine:/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 root@xpleaf-machine:/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
返回的數據便是遠程主機的命令執行結果。
blog
(2)使用key鏈接遠程主機
與(1)並無多大區別,只是認證方式爲使用key,所以代碼中不須要寫密碼,先給出代碼及註釋:
#!/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)被認證方生成私鑰和公鑰
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ssh-keygen xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ls /home/xpleaf/.ssh/ id_rsa id_rsa.pub known_hosts
2)將公鑰發送給認證方(遠程主機)
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ssh-copy-id oldboy@192.168.1.124
完成了上面的步驟後,就能夠鏈接遠程主機並執行命令了:
root@xpleaf-machine:/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 root@xpleaf-machine:/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傳送文件
代碼及註釋以下:
#!/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)運行程序
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python ssh_sftp3.py 192.168.1.124
若是沒有錯誤就不會有任何提示。
2)客戶端下查看下載的文件
xpleaf@xpleaf-machine:/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)服務端下查看上傳的文件
[oldboy@moban 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