python之paramiko 遠程執行命令

來源:互聯網
上載者:User

標籤:實現   toad   pip   col   rod   rmi   charge   launch   pat   

有時會需要在遠端機器上執行一個命令,並獲得其返回結果。對於這種情況,python 可以很容易的實現。

1 、工具

Python paramiko

1) Paramiko模組安裝

  在Linux的Terminal中,直接輸入pip install paramiko 命令安裝。

2)確定paramiko安裝成功

  在python命令列輸入import paramiko,確認是否安裝成功,沒報錯就沒問題。

2、步驟

1 、匯入 paramiko 模組

#!/usr/bin/pythonimport paramiko

2 、建立 ssh 串連函數

def ssh_connect( _host, _username, _password ):    try:        _ssh_fd = paramiko.SSHClient()        _ssh_fd.set_missing_host_key_policy( paramiko.AutoAddPolicy() )        _ssh_fd.connect( _host, username = _username, password = _password )    except Exception, e:        print( ‘ssh %[email protected]%s: %s‘ % (_username, _host, e) )        exit()    return _ssh_fd

3、 建立命令執行函數

def ssh_exec_cmd( _ssh_fd, _cmd ):    return _ssh_fd.exec_command( _cmd )

4 、建立關閉 ssh 函數

def ssh_close( _ssh_fd ):    _ssh_fd.close()

5、使用樣本

def main():     hostname = ‘192.168.1.222‘      port = 22      username = ‘root‘      password = ‘[email protected]‘      cmd = "ps -ef|grep java"      sshd = ssh_connect( hostname , username , password )    stdin, stdout, stderr = ssh_exec_cmd( sshd, cmd )    err_list = stderr.readlines()    if len( err_list ) > 0:        print ‘ERROR:‘ + err_list[0]        exit()    for item in stdout.readlines():        print item,    ssh_close( sshd )       if __name__ == "__main__":      main()

如果執行指令碼成功,會成功返回以下結果。

root      2540  2536  2 14:13 pts/4    00:01:21 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.resource.Approot      3442  3387  0  2016 ?        01:09:00 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.product.Approot      3451  3390  0  2016 ?        01:04:54 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.report.Approot      3452  3388  0  2016 ?        00:51:00 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.workflow.launcher.Approot      3892  3886  0  2016 ?        00:29:59 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.charge.Approot      4509  4507  0 15:09 ?        00:00:00 bash -c ps -ef|grep javaroot      4519  4509  0 15:09 ?        00:00:00 grep javaroot     12861 12857  0 Jan06 ?        00:09:06 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.workorder.Approot     16484 16480  0  2016 ?        00:45:27 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.billing.Approot     18699 18694  0 Jan06 ?        00:09:30 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.order.Approot     21902 21898  0 Jan05 ?        00:18:46 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.user.launcher.App

 在實際的開發中,每次更新模組的jar包時,都需要使用 ps -ef | grep java, 查看模組的進程號,然後使用使用命令 kill -9 進程號,處理掉進程,然後重新啟動 模組。

下面嘗試使用python指令碼來代替手工輸入代碼。

3、執行個體

1) 啟動模組

# -*- coding: utf-8 -*-import paramikossh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(‘192.168.1.222‘, username = ‘root‘, password = ‘[email protected]‘, timeout = 5)cmd = ‘nohup /csdp/charge_launcher-1.0-release/bin/run.sh > /csdp/charge_launcher-1.0-release/bin/nohup.out 2>&1 & \r\n‘password= ‘[email protected]‘stdin, stdout, stderr = ssh.exec_command( cmd )##stdin, stdout, stderr = ssh.exec_command(‘sudo -S %s\n‘ % cmd )##stdin.write(‘%s\r\n‘ % password)##stdin.flush()print "------------------------"##print stdout.readlines() ##print stderr.read() print "------------------------"cmd = ‘pwd‘stdin, stdout, stderr = ssh.exec_command(cmd )print stdout.readlines() ssh.close()

2) 遠程上傳檔案

# -*- coding: utf-8 -*-import paramikoserverIp = ‘192.168.55.243‘serverUser = ‘root‘serverPwd = ‘[email protected]‘localFile = ‘user-1.0-release.jar‘localpath = r‘D:\workspace\csdp201512041\csdp-ningxia\csdp_user\user\target‘ + os.sep + localFileremotepath = ‘/csdp/user_launcher-1.0-dev/lib/‘ + localFiledef ftpModuleFile():    t = paramiko.Transport(( serverIp ,22))    t.connect(username = serverUser , password = serverPwd)    sftp = paramiko.SFTPClient.from_transport(t)   # remotepath=‘/csdp/user_launcher-1.0-dev/user-1.0-release.jar‘   # localpath= r‘D:\workspace\csdp201512041\csdp-ningxia\csdp_user\user\target\user-1.0-release.jar‘    sftp.put(localpath,remotepath)    t.close()    print(":) 成功上傳%s檔案。" % remotepath)  if __name__ == ‘__main__‘:   ftpModuleFile()

3) 執行遠程linux命令

# -*- coding: utf-8 -*-import paramiko    if __name__ == "__main__":      hostname = ‘192.168.55.243‘      port = 22      username = ‘root‘      password = ‘[email protected]‘      cmd = "ps -ef|grep java"      ssh = paramiko.SSHClient()    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())    #ssh.connect( hostname ,22, username , password )    ssh.connect(hostname,username=username,password=password,allow_agent=False,look_for_keys=False)    stdin, stdout, stderr = ssh.exec_command(cmd )    list = stdout.readlines()         print( list )          ssh.close()

 

python之paramiko 遠程執行命令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.