在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模块进行远程服务器的监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/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)