python之paramiko 遠程執行命令
阿新 • • 發佈:2017-12-04
問題 命令 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 = r‘D:\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 遠程執行命令