python遠程登錄服務器(paramiko模塊安裝和使用)


轉自:http://www.jb51.net/article/46285.htm

一:簡介

由paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接。

由於使用的是python這樣的能夠跨平台運行的語言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH從一個平台連接到另外一個平台,進行一系列的操作時,paramiko是最佳工 具之一。

舉個常見的例子,現有這樣的需求:需要使用windows客戶端,遠程連接到Linux服務器,查看上面的日志狀態,大家通常使用的方法會是:

1:用telnet

2:用PUTTY

3:用WinSCP

4:用XManager等…

那現在如果需求又增加一條,要從服務器上下載文件,該怎么辦?那常用的辦法可能會是:

1:Linux上安裝FTP並配置

2:Linux上安裝Sambe並配置…

大家會發現,常見的解決方法都會需要對遠程服務器必要的配置,如果遠程服務器只有一兩台還好說,如果有N台,還需要逐台進行配置,或者需要使用代碼進行以上操作時,上面的辦法就不太方便了。

使用paramiko可以很好的解決以上問題,比起前面的方法,它僅需要在本地上安裝相應的軟件(python以及PyCrypto),對遠程服務器沒有配置要求,對於連接多台服務器,進行復雜的連接操作特別有幫助。

二:安裝

安裝paramiko有兩個先決條件,python和另外一個名為PyCrypto的模塊。

通常安裝標准的python模塊,只需要在模塊的根目錄下運行:

復制代碼 代碼如下:

python setup.py build

python setup.py install

以上兩條命令即可,paramiko和PyCrypto也不例外,唯一麻煩的就是安裝PyCrypto時,需要GCC庫編譯,如果沒有GCC庫會報錯,會導致PyCrypto以及paramiko無法安裝。

以下以32 位的windows XP為例,說明paramiko的安裝過程

1:安裝python,2.2以上版本都可以,我使用的是2.5,安裝過程略,並假設安裝目錄是c:\python。

2:判斷本地是否安裝了GCC,並在PATH變量可以找到,如果沒有,可使用windows 版的GCC,即MinGW,下載地址:http://sourceforge.net/projects/mingw/,然后運行下載后的exe文件進行 網絡安裝,假設目錄為C:\mingw,在PATH中加入 C:\mingw\bin,並在c:\python\lib\distutils下新建一個名稱是distutils.cfg的文件,填入:

復制代碼 代碼如下:

[build]
compiler=mingw32
 

3:下載PyCrypto ,地址是

https://www.dlitz.net/software/pycrypto/

安裝PyCrypto:

解壓縮
在dos下進入解壓縮的目錄,運行

復制代碼 代碼如下:

C:\python\python.exe setup.py build
C:\python\python.exe setup.py install
 

安裝測試
運行python.exe,在提示符下輸入:

復制代碼 代碼如下:

Import  Crypto


如果沒有出現錯誤提示,說明Crypto安裝成功

4:下載paramiko,地址是http://www.lag.net/paramiko/

解壓縮
在dos下進 入解壓縮的目錄,運行

復制代碼 代碼如下:

C:\python\python.exe setup.py build
C:\python\python.exe setup.py install


測試paramiko
運行python.exe,在提示符下輸入:

復制代碼 代碼如下:

Import  paramiko


如果沒有出現錯誤提示,說明paramiko安裝成功

 

三: 使用paramiko

如果大家感覺安裝paramiko還是略有麻煩的話,當使用到paramiko提供的方便時便會覺得這是十分值得的。

下面是兩種使用paramiko連接到linux服務器的代碼

方式一:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用戶名", "口令")


上面的第二行代碼的作用是允許連接不在know_hosts文件中的主機。

方式二:

t = paramiko.Transport((“主機”,”端口”))
t.connect(username = “用戶名”, password = “口令”)


如果連接遠程主機需要提供密鑰,上面第二行代碼可改成:

復制代碼 代碼如下:

t.connect(username = “用戶名”, password = “口令”, hostkey=”密鑰”)

下面給出實際的例子:

1.Paramiko SSH連接遠程主機

(1)使用用戶名密碼連接遠程主機

(2)使用key連接遠程主機

2.Paramiko SFTP傳送文件    

  Paramiko模塊是第三方庫,所以需要先進行安裝,

3.1 windows對linux運行任意命令,並將結果輸出

如果linux服務器開放了22端口,在windows端,我們可以使用paramiko遠程連接到該服務器,並執行任意命令,然后通過 print或其它方式得到該結果,


#!/usr/bin/python
import paramiko

ssh = paramiko.SSHClient()         #調用paramiko模塊下的SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #加上這句話不用擔心選yes的問題,會自動選上(用ssh連接遠程主機時,第一次連接時會提示是否繼續進行遠程連接,選擇yes)
ssh.connect('某IP地址',22,'用戶名', '口令')    #連接遠程主機,SSH端口號為22
stdin, stdout, stderr = ssh.exec_command('我的命令')   #執行命令
print stdout.readlines()
ssh.close()

其中的”你的命令”可以任意linux支持的命令,如一些常用的命令:


df:查看磁盤使用情況
uptime:顯示系統運行時間信息
cat:顯示某文件內容
mv/cp/mkdir/rmdir:對文件或目錄進行操作
/sbin/service/ xxxservice start/stop/restart:啟動、停止、重啟某服務
netstat -ntl |grep 8080:查看8080端口的使用情況
 或者 nc -zv localhost :查看所有端口的使用情況
find / -name XXX:查找某文件

這樣一來,對於linux的任何操作幾乎都可以通過windows端完成,如果對該功能進行引申,還可以同時管理多台服務器。

實際使用展示:

        #2#登錄dispatcherTomcat所在服務器,檢查dispatcherTomcat程序是否已啟動,若啟動則進行重啟
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(self.dispatcherTomcat_ip,22,self.dispatcherTomcat_user, self.dispatcherTomcat_pwd)
        stdin, stdout, stderr = ssh.exec_command('ps -ef|grep tomcat|grep /opt/upay3/application/dispatcherTomcat/bin|grep -v grep')
        dispatcherTomcatInfo = stdout.readlines()  #輸出為只有1個元素的列表,內容為查詢的進程信息
        #print 'dispatcherTomcatInfo:',dispatcherTomcatInfo
        if len(dispatcherTomcatInfo)==1:  #若啟動,且進程為單個進程
            dispatcherTomcatProcessId=','.join(filter(lambda x: x, dispatcherTomcatInfo[0].split(' '))).split(',')[1]
            print u'成功獲取對賬服務進程號!進程號為:',dispatcherTomcatProcessId
            ssh.exec_command('kill -9 %s' % dispatcherTomcatProcessId) #執行該命令后系統返回默認的登錄路徑/home/upay3
            print u'成功殺死對賬服務進程!殺死的進程為:',dispatcherTomcatProcessId
            ssh.exec_command('export JAVA_HOME=/usr/jdk1.7.0_67;/opt/upay3/application/dispatcherTomcat/bin/startup.sh')
            print u'成功重啟對賬服務進程!'
        elif len(dispatcherTomcatInfo)==0: #若未啟動,則啟動
            print u'對賬服務進程已停止!'
            ssh.exec_command('export JAVA_HOME=/usr/jdk1.7.0_67;/opt/upay3/application/dispatcherTomcat/bin/startup.sh')
            print u'成功重啟對賬服務進程!'           
        else: #若啟動多個對賬服務進程,則拋出異常
            print u'啟動了多個對賬服務進程,請檢查並確保啟動單個服務進程!'
            raise Exception
        ssh.close()

3.2 從widnows端下載linux服務器上的文件


#!/usr/bin/python
import paramiko

t = paramiko.Transport((“主機”,”端口”))
t.connect(username = “用戶名”, password = “口令”)
sftp = paramiko.SFTPClient.from_transport(t)  #使用t的設置方式連接遠程主機

remotepath='/var/log/system.log'
localpath='/tmp/system.log'

sftp.get(remotepath, localpath)  #下載文件
t.close()



3.3 從widnows端上傳文件到linux服務器


#!/usr/bin/python
import paramiko t = paramiko.Transport((“主機”,”端口”))
t.connect(username = “用戶名”, password = “口令”)
sftp = paramiko.SFTPClient.from_transport(t)


remotepath='/var/log/system.log'
localpath='/tmp/system.log'


sftp.put(localpath,remotepath) #上傳文件
t.close()


免責聲明!

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



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