在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)
|