annotate scripts-java/sshandcmd.py @ 80:04bd4ae97e7c

RingTopology is finished.
author one
date Sun, 22 Nov 2009 13:59:05 +0900
parents cdc08d4722ec
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
cdc08d4722ec scripts
fuchita
parents:
diff changeset
1 #!/usr/bin/env python
cdc08d4722ec scripts
fuchita
parents:
diff changeset
2 '''This runs a COMMAND on a remote host using SSH.
cdc08d4722ec scripts
fuchita
parents:
diff changeset
3 At the prompts enter password.
cdc08d4722ec scripts
fuchita
parents:
diff changeset
4 '''
cdc08d4722ec scripts
fuchita
parents:
diff changeset
5 import pexpect
cdc08d4722ec scripts
fuchita
parents:
diff changeset
6 import getpass
cdc08d4722ec scripts
fuchita
parents:
diff changeset
7
cdc08d4722ec scripts
fuchita
parents:
diff changeset
8 import getopt
cdc08d4722ec scripts
fuchita
parents:
diff changeset
9 import sys
cdc08d4722ec scripts
fuchita
parents:
diff changeset
10 import os
cdc08d4722ec scripts
fuchita
parents:
diff changeset
11 import re
cdc08d4722ec scripts
fuchita
parents:
diff changeset
12
cdc08d4722ec scripts
fuchita
parents:
diff changeset
13 def ssh_command (user, host, password, command):
cdc08d4722ec scripts
fuchita
parents:
diff changeset
14 """This runs a command on the remote host. This returns a
cdc08d4722ec scripts
fuchita
parents:
diff changeset
15 pexpect.spawn object. This handles the case when you try
cdc08d4722ec scripts
fuchita
parents:
diff changeset
16 to connect to a new host and ssh asks you if you want to
cdc08d4722ec scripts
fuchita
parents:
diff changeset
17 accept the public key fingerprint and continue connecting.
cdc08d4722ec scripts
fuchita
parents:
diff changeset
18 """
cdc08d4722ec scripts
fuchita
parents:
diff changeset
19 ssh_newkey = 'Are you sure you want to continue connecting.*'
cdc08d4722ec scripts
fuchita
parents:
diff changeset
20
cdc08d4722ec scripts
fuchita
parents:
diff changeset
21 child = pexpect.spawn('ssh -l %s %s'%(user, host),
cdc08d4722ec scripts
fuchita
parents:
diff changeset
22 timeout=30)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
23 i = child.expect([pexpect.TIMEOUT, ssh_newkey, '.*ssword:.*'])
cdc08d4722ec scripts
fuchita
parents:
diff changeset
24 while i:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
25 if i == 1: # SSH does not have the public key. Just accept it.
cdc08d4722ec scripts
fuchita
parents:
diff changeset
26 child.sendline ('yes')
cdc08d4722ec scripts
fuchita
parents:
diff changeset
27 i = child.expect([pexpect.TIMEOUT, ssh_newkey, '.*ssword:.*'])
cdc08d4722ec scripts
fuchita
parents:
diff changeset
28 elif i == 2:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
29 # input password
cdc08d4722ec scripts
fuchita
parents:
diff changeset
30 child.sendline(password)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
31 child.sendline(command)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
32 return child
cdc08d4722ec scripts
fuchita
parents:
diff changeset
33 else:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
34 print child.before, child.after
cdc08d4722ec scripts
fuchita
parents:
diff changeset
35
cdc08d4722ec scripts
fuchita
parents:
diff changeset
36 print 'ERROR!'
cdc08d4722ec scripts
fuchita
parents:
diff changeset
37 print 'SSH could not login. Here is what SSH said:'
cdc08d4722ec scripts
fuchita
parents:
diff changeset
38 print child.before, child.after
cdc08d4722ec scripts
fuchita
parents:
diff changeset
39 return None
cdc08d4722ec scripts
fuchita
parents:
diff changeset
40
cdc08d4722ec scripts
fuchita
parents:
diff changeset
41 def gethostlist(hostlistfile):
cdc08d4722ec scripts
fuchita
parents:
diff changeset
42
cdc08d4722ec scripts
fuchita
parents:
diff changeset
43 # get host name list from file
cdc08d4722ec scripts
fuchita
parents:
diff changeset
44 hostlist = re.split('\s+', open(hostlistfile).read())
cdc08d4722ec scripts
fuchita
parents:
diff changeset
45
cdc08d4722ec scripts
fuchita
parents:
diff changeset
46 if hostlist[-1] == '':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
47 hostlist.pop()
cdc08d4722ec scripts
fuchita
parents:
diff changeset
48
cdc08d4722ec scripts
fuchita
parents:
diff changeset
49 if hostlist[0] == '':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
50 hostlist.pop(0)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
51
cdc08d4722ec scripts
fuchita
parents:
diff changeset
52 dellist = []
cdc08d4722ec scripts
fuchita
parents:
diff changeset
53 for h in hostlist:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
54 if h[0] == '#':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
55 print "remove",h
cdc08d4722ec scripts
fuchita
parents:
diff changeset
56 dellist.append(h)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
57
cdc08d4722ec scripts
fuchita
parents:
diff changeset
58 for d in dellist:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
59 hostlist.remove(d)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
60
cdc08d4722ec scripts
fuchita
parents:
diff changeset
61 return hostlist
cdc08d4722ec scripts
fuchita
parents:
diff changeset
62
cdc08d4722ec scripts
fuchita
parents:
diff changeset
63
cdc08d4722ec scripts
fuchita
parents:
diff changeset
64 def main(user, hostlist, command, waitprc=False):
cdc08d4722ec scripts
fuchita
parents:
diff changeset
65 # get password
cdc08d4722ec scripts
fuchita
parents:
diff changeset
66 password = getpass.getpass('Password: ')
cdc08d4722ec scripts
fuchita
parents:
diff changeset
67
cdc08d4722ec scripts
fuchita
parents:
diff changeset
68 childlist = []
cdc08d4722ec scripts
fuchita
parents:
diff changeset
69
cdc08d4722ec scripts
fuchita
parents:
diff changeset
70 if not waitprc:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
71 command = command + ' &'
cdc08d4722ec scripts
fuchita
parents:
diff changeset
72
cdc08d4722ec scripts
fuchita
parents:
diff changeset
73 for host in hostlist:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
74 child = ssh_command(user, host, password, command)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
75 if child is not None:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
76 print "".join([user, '@', host, ' : ', command])
cdc08d4722ec scripts
fuchita
parents:
diff changeset
77 childlist.append(child)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
78 if waitprc:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
79 print child.expect(pexpect.EOF)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
80 print child.before
cdc08d4722ec scripts
fuchita
parents:
diff changeset
81
cdc08d4722ec scripts
fuchita
parents:
diff changeset
82 # end main
cdc08d4722ec scripts
fuchita
parents:
diff changeset
83
cdc08d4722ec scripts
fuchita
parents:
diff changeset
84
cdc08d4722ec scripts
fuchita
parents:
diff changeset
85 def usage(program_name):
cdc08d4722ec scripts
fuchita
parents:
diff changeset
86 print "Usage : %s [-w] [-h hostname] [-l username] [-f hostlist] command" % program_name
cdc08d4722ec scripts
fuchita
parents:
diff changeset
87 sys.exit(1)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
88
cdc08d4722ec scripts
fuchita
parents:
diff changeset
89
cdc08d4722ec scripts
fuchita
parents:
diff changeset
90 if __name__ == "__main__":
cdc08d4722ec scripts
fuchita
parents:
diff changeset
91 if (len(sys.argv) < 2) :
cdc08d4722ec scripts
fuchita
parents:
diff changeset
92 usage(sys.argv)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
93
cdc08d4722ec scripts
fuchita
parents:
diff changeset
94 try:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
95 opts, args = getopt.getopt(sys.argv[1:], "h:l:f:w")
cdc08d4722ec scripts
fuchita
parents:
diff changeset
96 except getopt.GetoptError:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
97 usage(sys.argv[0])
cdc08d4722ec scripts
fuchita
parents:
diff changeset
98
cdc08d4722ec scripts
fuchita
parents:
diff changeset
99 # default
cdc08d4722ec scripts
fuchita
parents:
diff changeset
100 user = os.environ['USER']
cdc08d4722ec scripts
fuchita
parents:
diff changeset
101 hostlist = ["localhost"]
cdc08d4722ec scripts
fuchita
parents:
diff changeset
102 waitprc = False
cdc08d4722ec scripts
fuchita
parents:
diff changeset
103
cdc08d4722ec scripts
fuchita
parents:
diff changeset
104 for o, a in opts:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
105 if o == '-l':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
106 user = a
cdc08d4722ec scripts
fuchita
parents:
diff changeset
107 elif o == '-w':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
108 waitprc = True # show children's output
cdc08d4722ec scripts
fuchita
parents:
diff changeset
109 elif o == '-f':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
110 hostlist = gethostlist(a)
cdc08d4722ec scripts
fuchita
parents:
diff changeset
111 elif o == '-h':
cdc08d4722ec scripts
fuchita
parents:
diff changeset
112 hostlist = [a]
cdc08d4722ec scripts
fuchita
parents:
diff changeset
113 else:
cdc08d4722ec scripts
fuchita
parents:
diff changeset
114 pass
cdc08d4722ec scripts
fuchita
parents:
diff changeset
115
cdc08d4722ec scripts
fuchita
parents:
diff changeset
116 # execute command on remote host
cdc08d4722ec scripts
fuchita
parents:
diff changeset
117 command = args[0]
cdc08d4722ec scripts
fuchita
parents:
diff changeset
118
cdc08d4722ec scripts
fuchita
parents:
diff changeset
119 main(user, hostlist, command, waitprc)