一、paramiko簡介
paramiko是用Python語言寫的一個子產品,遵循SSH2協定,支援以加密和認證的方式,進行遠端伺服器的連接配接。
paramiko主要是通過ssh協定對遠端主機進行管理:包括執行遠端主機CLI、上傳和下載下傳檔案等。
二、快速安裝paramiko子產品
1
2
<code># yum install python-devel</code>
<code># pip install paramiko</code>
三、paramiko指令參數詳解
利用密碼登陸方式批量執行指令
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code>導入子產品</code>
<code>import</code> <code>paramiko</code>
<code>執行個體化一個SSHClient對象</code>
<code>s </code><code>=</code> <code>paramiko.SSHClient()</code>
<code>自動添加政策 </code><code>#首次登陸用互動式确定(允許連接配接不在know_hosts檔案中的主機)</code>
<code>s.set_missing_host_key_policy(paramiko.AutoAddPolicy())</code>
<code>要連接配接的主機位址資訊</code>
<code>s.connect(hostname</code><code>=</code><code>'ip位址'</code><code>, port</code><code>=</code><code>端口号, username</code><code>=</code><code>'使用者名'</code><code>, password</code><code>=</code><code>'密碼'</code><code>)</code>
<code>要執行的指令</code>
<code>stdin, stdout, stderr </code><code>=</code> <code>s.exec_command(</code><code>'執行的指令'</code><code>)</code>
<code>檢視指令的執行結果</code>
<code>print</code> <code>stdout.read()</code>
利用公鑰驗證方式批量執行指令
18
19
20
21
22
23
24
25
26
<code>首先建立公鑰和私鑰檔案</code>
<code># ssh-keygen</code>
<code> </code>
<code>上傳本地的公鑰到遠端主機的.ssh</code><code>/</code><code>authorized_keys檔案中</code>
<code># ssh-copy-id -i .ssh/id_rsa.pub root@ip</code>
<code>執行個體化一個對象</code>
<code>自動添加政策 </code><code>#首次登陸用互動式确定</code>
<code>建立私鑰檔案連接配接</code>
<code>key </code><code>=</code> <code>paramiko.RSAKey.from_private_key_file(</code><code>'/root/.ssh/id_rsa'</code><code>)</code>
<code>通過私鑰驗證的方式登入遠端主機</code>
<code>s.connect(hostname</code><code>=</code><code>'ip位址'</code><code>, port</code><code>=</code><code>端口号, username</code><code>=</code><code>'使用者名'</code><code>, pkey</code><code>=</code><code>key)</code>
<code>print</code> <code>stdout.read()</code>
從遠端主機上傳、下載下傳檔案
<code>#建立一個加密的傳輸管道</code>
<code>s </code><code>=</code> <code>paramiko.Transport((</code><code>'ip位址'</code><code>,端口号))</code>
<code>#建立連接配接</code>
<code>s.connect(username</code><code>=</code><code>'使用者名'</code><code>,password</code><code>=</code><code>'密碼'</code><code>)</code>
<code>#建立一個sftp用戶端對象,通過ssh transport操作遠端檔案</code>
<code>sftp </code><code>=</code> <code>paramiko.SFTPClient.from_transport(s)</code>
<code>#上傳本地檔案到遠端主機</code>
<code>sftp.put(localFile,remoteFile)</code>
<code>#從遠端主機下載下傳檔案到本地</code>
<code>sftp.get(remoteFile,localFile)</code>
<code>#關閉sftp連接配接</code>
<code>s.close()</code>
四、腳本示範
區域網路實體主機批量管理:執行指令
腳本還有很多瑕疵,隻是作為參考練習,前提是所有主機的使用者名、密碼和端口号都要相同
例如:Username:root Password:redhat Port:22
27
28
29
30
31
32
33
34
35
<code>[root@python script]</code><code># cat 02_paramiko_process.py </code>
<code>#!/usr/bin/env python</code>
<code>#coding:utf8</code>
<code>from</code> <code>multiprocessing </code><code>import</code> <code>Process</code>
<code>import</code> <code>sys</code>
<code>Username </code><code>=</code> <code>'root'</code>
<code>Password </code><code>=</code> <code>'redhat'</code>
<code>Port </code><code>=</code> <code>22</code>
<code>def</code> <code>runCmd(ip,cmd):</code>
<code> </code><code>s </code><code>=</code> <code>paramiko.SSHClient()</code>
<code> </code><code>s.set_missing_host_key_policy(paramiko.AutoAddPolicy())</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>s.connect(hostname</code><code>=</code><code>ip, port</code><code>=</code><code>Port, username</code><code>=</code><code>Username, password</code><code>=</code><code>Password)</code>
<code> </code><code>stdin, stdout, stderr </code><code>=</code> <code>s.exec_command(cmd)</code>
<code> </code><code>result </code><code>=</code> <code>stdout.read()</code>
<code> </code><code>print</code> <code>ip,result,</code>
<code> </code><code>except</code><code>:</code>
<code> </code><code>print</code> <code>'%s is not exists'</code> <code>%</code> <code>ip</code>
<code>def</code> <code>ipProcess():</code>
<code> </code><code>cmd </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>2</code><code>,</code><code>255</code><code>):</code>
<code> </code><code>ip </code><code>=</code> <code>'192.168.1.%s'</code> <code>%</code> <code>i</code>
<code> </code><code>p </code><code>=</code> <code>Process(target</code><code>=</code><code>runCmd,args</code><code>=</code><code>(ip,cmd))</code>
<code> </code><code>p.start()</code>
<code> </code><code>except</code> <code>IndexError:</code>
<code> </code><code>print</code> <code>'please input a command.'</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>ipProcess()</code>
執行腳本:
<code>[root@python script]</code><code># python 02_paramiko_process.py uptime</code>
截圖部分傳回結果:
<code>192.168</code><code>.</code><code>1.57</code> <code>10</code><code>:</code><code>48</code><code>:</code><code>49</code> <code>up </code><code>2</code><code>:</code><code>29</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.56</code> <code>10</code><code>:</code><code>50</code><code>:</code><code>25</code> <code>up </code><code>2</code><code>:</code><code>29</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.100</code> <code>10</code><code>:</code><code>48</code><code>:</code><code>50</code> <code>up </code><code>2</code><code>:</code><code>29</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.127</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.210</code> <code>22</code><code>:</code><code>48</code><code>:</code><code>51</code> <code>up </code><code>2</code><code>:</code><code>28</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.51</code> <code>10</code><code>:</code><code>48</code><code>:</code><code>52</code> <code>up </code><code>2</code><code>:</code><code>28</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.55</code> <code>10</code><code>:</code><code>50</code><code>:</code><code>26</code> <code>up </code><code>2</code><code>:</code><code>29</code><code>, </code><code>0</code> <code>users, load average: </code><code>0.00</code><code>, </code><code>0.00</code><code>, </code><code>0.00</code>
<code>192.168</code><code>.</code><code>1.122</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.58</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.52</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.53</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.50</code> <code>is</code> <code>not</code> <code>exists</code>
<code>192.168</code><code>.</code><code>1.215</code> <code>02</code><code>:</code><code>31</code><code>:</code><code>14</code> <code>up </code><code>2</code><code>:</code><code>07</code><code>, </code><code>4</code> <code>users, load average: </code><code>4.75</code><code>, </code><code>1.46</code><code>, </code><code>0.82</code>
區域網路實體主機批量管理:執行上傳、下載下傳檔案
這裡隻對批量上傳做了示範,對于批量下載下傳檔案隻是一行代碼的更換就可以了,我也在腳本中添加了注釋行。
<code>[root@python script]</code><code># cat 03_put_paramiko_process.py </code>
<code>def</code> <code>sftpPut(ip):</code>
<code> </code><code>s </code><code>=</code> <code>paramiko.Transport((ip,Port))</code>
<code> </code><code>s.connect(username</code><code>=</code><code>Username,password</code><code>=</code><code>Password)</code>
<code> </code><code>sftp </code><code>=</code> <code>paramiko.SFTPClient.from_transport(s)</code>
<code> </code><code>localFile </code><code>=</code> <code>'/root/sync.sh'</code>
<code> </code><code>remoteFile </code><code>=</code> <code>'/opt/sync.sh'</code>
<code> </code><code>sftp.put(localFile,remoteFile)</code>
<code> </code><code>#sftp.get(remoteFile,localFile)</code>
<code> </code><code>s.close()</code>
<code> </code><code>print</code> <code>'%s put successful.'</code> <code>%</code> <code>ip</code>
<code> </code><code>print</code> <code>'%s not exists.'</code> <code>%</code> <code>ip</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>2</code><code>,</code><code>255</code><code>):</code>
<code> </code><code>ip </code><code>=</code> <code>'192.168.1.%s'</code> <code>%</code> <code>i</code>
<code> </code><code>p </code><code>=</code> <code>Process(target</code><code>=</code><code>sftpPut,args</code><code>=</code><code>(ip,))</code>
<code> </code><code>p.start()</code>
<code>[root@python script]</code><code># python 03_put_paramiko_process.py</code>
<code>192.168</code><code>.</code><code>1.55</code> <code>put successful.</code>
<code>192.168</code><code>.</code><code>1.181</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.198</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.200</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.207</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.209</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.57</code> <code>put successful.</code>
<code>192.168</code><code>.</code><code>1.51</code> <code>put successful.</code>
<code>192.168</code><code>.</code><code>1.56</code> <code>put successful.</code>
<code>192.168</code><code>.</code><code>1.233</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.127</code> <code>not</code> <code>exists.</code>
<code>192.168</code><code>.</code><code>1.100</code> <code>put successful.</code>
<code>192.168</code><code>.</code><code>1.210</code> <code>put successful.</code>
登陸遠端主機檢視檔案是否上傳完成:
<code>[root@python script]</code><code># ssh 192.168.1.51</code>
<code>Address </code><code>192.168</code><code>.</code><code>1.51</code> <code>maps to localhost, but this does </code><code>not</code> <code>map</code> <code>back to the address </code><code>-</code> <code>POSSIBLE BREAK</code><code>-</code><code>IN ATTEMPT!</code>
<code>root@</code><code>192.168</code><code>.</code><code>1.51</code><code>'s password: </code>
<code>Last login: Wed Mar </code><code>11</code> <code>11</code><code>:</code><code>04</code><code>:</code><code>30</code> <code>2015</code> <code>from</code> <code>192.168</code><code>.</code><code>1.112</code>
<code>[root@naginx ~]</code><code># ifconfig |grep inet |head -1</code>
<code> </code><code>inet addr:</code><code>192.168</code><code>.</code><code>1.51</code> <code>Bcast:</code><code>192.168</code><code>.</code><code>1.255</code> <code>Mask:</code><code>255.255</code><code>.</code><code>255.0</code>
<code>[root@naginx ~]</code><code># ll /opt/sync.sh -d</code>
<code>-</code><code>rw</code><code>-</code><code>r</code><code>-</code><code>-</code><code>r</code><code>-</code><code>-</code> <code>1</code> <code>root root </code><code>333</code> <code>3</code><code>月 </code><code>11</code> <code>11</code><code>:</code><code>05</code> <code>/</code><code>opt</code><code>/</code><code>sync.sh </code><code>#已經成功上傳檔案</code>
注意:
批量上傳檔案腳本隻能滿足單個檔案,如何實作多個檔案上傳和下載下傳呢?可以通過os子產品來實作,下一篇文章中介紹如何以更人性化的方式實作參數上傳下載下傳,那就是os子產品和optparse子產品
本文轉自zys467754239 51CTO部落格,原文連結:http://blog.51cto.com/467754239/1619166,如需轉載請自行聯系原作者