博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之paramiko 远程执行命令
阅读量:7089 次
发布时间:2019-06-28

本文共 4081 字,大约阅读时间需要 13 分钟。

有时会需要在远程的机器上执行一个命令,并获得其返回结果。对于这种情况,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 %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.46'      port = 22      username = 'root'      password = 'P@ssw0rd'      cmd = "ip a"      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()

如果执行脚本成功,会成功返回以下结果。

['1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \n', ' link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n', ' inet 127.0.0.1/8 scope host lo\n', ' inet6 ::1/128 scope host \n', ' valid_lft forever preferred_lft forever\n', '2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n', ' link/ether 00:50:56:b3:6c:03 brd ff:ff:ff:ff:ff:ff\n', 'inet 192.168.1.46/24 brd 192.168.1.255 scope global eth0\n', ' inet6 fe80::250:56ff:feb3:6c03/64 scope link \n', ' valid_lft forever preferred_lft forever\n']

 在实际的开发中,每次更新模块的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 = '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 paramikoserverIp = '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 + 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 = '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()

 

转载于:https://www.cnblogs.com/chillax1314/p/7976624.html

你可能感兴趣的文章
使用 Laravel 5.5+ 更好的来实现 404 响应
查看>>
PHP 网络编程小白系列 —— Accept 阻塞模型
查看>>
流畅的python读书笔记-第十六章-携(协)程
查看>>
Python学到什么程度才可以去找工作?掌握这4点足够了!
查看>>
用状态机写轮播
查看>>
【379天】每日项目总结系列116(2018.02.19)
查看>>
人工智能在搜索中的应用
查看>>
Vue2从0到1(一):用webpack打包vue
查看>>
【Vue样式绑定】
查看>>
leetcode75. Sort Colors
查看>>
React 可视化开发工具 Shadow Widget 非正经入门(之一:React 三宗罪)
查看>>
Spring Boot QuickStart (3) - Web & Restful
查看>>
实现一个spring webservice服务端四:服务端、客户端以及httpclient调用spring-ws服务...
查看>>
使用 nexus 2 搭建 maven 私服及常见配置
查看>>
发布 Android Library 到 JCenter 从入门到放弃
查看>>
FileReader基础
查看>>
QConf搭建配置中心
查看>>
CSS Flexbox学习笔记
查看>>
js删除元素方法
查看>>
yum和apt-get的区别
查看>>