1. 程式人生 > >python之paramiko 遠程執行命令

python之paramiko 遠程執行命令

問題 命令 tpc 示例 bash targe bin gen .sh

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

1 、工具

Python paramiko

1) Paramiko模塊安裝

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

2)確定paramiko安裝成功

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

2、步驟

1 、導入 paramiko 模塊

#!/usr/bin/python
import 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 %s@%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 = P@ssw0rd  
    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.App
root      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.App
root      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.App
root      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.App
root      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.App
root      4509  4507  0 15:09 ?        00:00:00 bash -c ps -ef|grep java
root      4519  4509  0 15:09 ?        00:00:00 grep java
root     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.App
root     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.App
root     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.App
root     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 paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(192.168.1.222, username = root, password = P@ssw0rd, 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= P@ssw0rd

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 paramiko

serverIp = 192.168.55.243
serverUser = root
serverPwd = P@ssw0rd

localFile = user-1.0-release.jar
localpath = rD:\workspace\csdp201512041\csdp-ningxia\csdp_user\user\target + os.sep + localFile

remotepath = /csdp/user_launcher-1.0-dev/lib/ + localFile

def 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 = P@ssw0rd  
    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 遠程執行命令