首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python paramiko 执行命令

python paramiko 执行命令

作者头像
py3study
发布2020-01-14 15:00:59
1.1K0
发布2020-01-14 15:00:59
举报
文章被收录于专栏:python3python3

参考

http://wangwei007.blog.51cto.com/blog/68019/1058726

http://youzao.blog.51cto.com/3946111/1348903

在node1上想对node2执行命令,标准的答案

1.比较直观

#!/usr/bin/env python 
import paramiko   
hostname='192.168.0.102'  
username='root'  
password='abc'   
port=22     
paramiko.util.log_to_file('paramiko.log')          
s=paramiko.SSHClient()                 
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())          
s.connect(hostname = hostname,port=port,username=username, password=password)          
stdin,stdout,stderr=s.exec_command('free;df -h')          
print stdout.read()

2.类的形式

#!/usr/bin/python
# coding=utf8
import paramiko,datetime,os,threading
#class run_cmd(threading.Thread):
class run_cmd():
      def __init__(self,hostname=None,password=None,username=None,port=None,echo_cmd=None):
          #threading.Thread.__init__(self)
          self.hostname=hostname
          self.password=password
          self.username=username
          self.port=port
          self.echo_cmd=echo_cmd
          #self.thread_stop=False
      def run(self):
          paramiko.util.log_to_file('paramiko.log')
          s=paramiko.SSHClient()
          s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
          s.connect(hostname = self.hostname,username=self.username, password=self.password)
          stdin,stdout,stderr=s.exec_command(self.echo_cmd)
          return stdout.read()
          s.close()
      def stop(self):
           self.thread_stop=True
if __name__=='__main__':
    f = file('/home/python/filelist1','r')
    port=22
    c = f.readlines()
    for x in c:
        hostname = x.split('::')[0]
        password = x.split('::')[1]
        username = x.split('::')[2]    
        remote = x.split('::')[4].strip('\n')
        echo_cmd='/bin/find  %s -maxdepth 1 -type d -mmin -1200' %(remote)
        #echo_cmd='free;df -h'
        cmd_thread=run_cmd(hostname,password,username,port,echo_cmd)
        result=cmd_thread.run()
        print result
    f.close()

如果运行有错误,请参考python 增量同步远程文件夹

2.Python 利用pexpect和paramiko模块进行远程服务器的监控

#!/usr/bin/python# encoding=utf-8# Filename: paramiko_test.pyimport datetimeimport threadingimport paramikodef sshCmd(ip, username, passwd, cmds):
    try:
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        client.connect(ip, 22, username, passwd, timeout=5)        for cmd in cmds:
            stdin, stdout, stderr = client.exec_command(cmd)
            lines = stdout.readlines()            # print out
            for line in lines:                print line,        print '%s\t 运行完毕\r\n' % (ip)    except Exception, e:        print '%s\t 运行失败,失败原因\r\n%s' % (ip, e)    finally:
        client.close()#上传文件def uploadFile(ip,username,passwd):
    try:
        t=paramiko.Transport((ip,22))
        t.connect(username=username,password=passwd)
        sftp=paramiko.SFTPClient.from_transport(t)
        remotepath='/root/main.py'
        localpath='/home/data/javawork/pythontest/src/main.py'
        sftp.put(localpath,remotepath)        print '上传文件成功'
    except Exception, e:        print '%s\t 运行失败,失败原因\r\n%s' % (ip, e)    finally:
        t.close()#下载文件def downloadFile(ip,username,passwd):
    try:
        t=paramiko.Transport((ip,22))
        t.connect(username=username,password=passwd)
        sftp=paramiko.SFTPClient.from_transport(t)
        remotepath='/root/storm-0.9.0.1.zip'
        localpath='/home/data/javawork/pythontest/storm.zip'
        sftp.get(remotepath,localpath)        print '下载文件成功'
    except Exception, e:        print '%s\t 运行失败,失败原因\r\n%s' % (ip, e)    finally:
        t.close()  

if __name__ == '__main__':    # 需要执行的命令列表
    cmds = ['ls /root', 'ifconfig']    # 需要进行远程监控的服务器列表
    servers = ['xxx.xxx.xxx.xxx']

    username = "root"
    passwd = "xxxxxx"
    threads = []    print "程序开始运行%s" % datetime.datetime.now()    # 每一台服务器创建一个线程处理
    for server in servers:
        th = threading.Thread(target=sshCmd, args=(server, username, passwd, cmds))
        th.start()
        threads.append(th)    # 等待线程运行完毕
    for th in threads:
        th.join()    print "程序结束运行%s" % datetime.datetime.now()    #测试文件的上传与下载
    uploadFile(servers[0],username,passwd)
    downloadFile(servers[0],username,passwd)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档