jssh 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -2
- data/bin/jssh +39 -20
- data/lib/jssh/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 802cfe834425216c50891414dec0f5a71b4c6498
|
4
|
+
data.tar.gz: bca4531307cf24e4c6b654cd7c0a791b0acf8672
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e7e49858f77e2d1d164d257a1197be768bbab91090a4650dbe811663c9b9d8b0bb944f6f16b268654b77f913bd399dd19b6bfc27b5b56a9d472fd226a82413c
|
7
|
+
data.tar.gz: dadbd6e0b570a80dd86568bbd5faccd83a30258a57a086333e5cb57358de33864b4938a418cbd8f8aee22c9df1e4503991bc8306529706ae44328527db03d648
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Jssh
|
2
2
|
|
3
|
-
|
3
|
+
Jssh is a batch ssh tool, which OP would like.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,7 +18,60 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Simple Usage:
|
22
|
+
|
23
|
+
$ jssh -f hosts -u jason -p jason 'hostname'
|
24
|
+
====================172.16.39.139====================
|
25
|
+
localcentos.vm
|
26
|
+
====================192.168.42.136====================
|
27
|
+
localcentos.vm
|
28
|
+
Finished!
|
29
|
+
|
30
|
+
The hosts is a hosts file which lists every host per line like:
|
31
|
+
|
32
|
+
172.16.39.139
|
33
|
+
|
34
|
+
192.168.42.136
|
35
|
+
|
36
|
+
If you have configured the trusted relationship with each host, you can simply use:
|
37
|
+
|
38
|
+
$ jssh -f hosts -u jason 'hostname'
|
39
|
+
|
40
|
+
Go further, if you place a file `~/.jsshrc`,and the content is:
|
41
|
+
|
42
|
+
keyfile: /home/USER/.ssh/id_rsa
|
43
|
+
user: jason
|
44
|
+
|
45
|
+
Then you can get more easier:
|
46
|
+
|
47
|
+
$ jssh -f hosts 'hostname'
|
48
|
+
|
49
|
+
And, if you place multiple commands in a script such as `/path/to/script`, you can use like:
|
50
|
+
|
51
|
+
$ jssh -f hosts -c /path/to/script
|
52
|
+
|
53
|
+
At last, I think this is very charming for OP, we can use a batch tool with pause. Just use the `-b or --break` option:
|
54
|
+
|
55
|
+
$ jssh -f hosts 'hostname' -b
|
56
|
+
|
57
|
+
After the operation of the first host is done, the jssh can auto login to the first host, which lets us can check our operation is ok.
|
58
|
+
|
59
|
+
====================172.16.39.139====================
|
60
|
+
localcentos.vm
|
61
|
+
Now the operations on the first host is completed, we're going to it for a check.
|
62
|
+
Press ENTER to automatic to login 172.16.39.139 ...
|
63
|
+
|
64
|
+
Last login: Sat Mar 29 00:57:07 2014 from 172.16.39.1
|
65
|
+
jason@localcentos:~
|
66
|
+
|
67
|
+
After you finish check, `exit` back to jssh, we can choose to parallel or serial to finish the left operations, or just `Ctrl+C` to exit.
|
68
|
+
|
69
|
+
Continue to finish all the left operations by parallel(p) or serial(s), [p/s] p
|
70
|
+
====================192.168.42.136====================
|
71
|
+
localcentos.vm
|
72
|
+
Finished!
|
73
|
+
|
74
|
+
At last, type `jssh --help` for more help.
|
22
75
|
|
23
76
|
## Contributing
|
24
77
|
|
data/bin/jssh
CHANGED
@@ -42,7 +42,7 @@ OptionParser.new do |opts|
|
|
42
42
|
opts.on("-f file","--hostfile file", "host file, every host occupy a line") do |v|
|
43
43
|
options[:hostfile] = v
|
44
44
|
unless File.exists? v
|
45
|
-
|
45
|
+
puts "host file doesn't exists!".to_red
|
46
46
|
exit
|
47
47
|
end
|
48
48
|
end
|
@@ -58,16 +58,13 @@ OptionParser.new do |opts|
|
|
58
58
|
opts.on("-i keyfile", "the ssh id_rsa file") do |v|
|
59
59
|
options[:key] = v
|
60
60
|
end
|
61
|
-
opts.on("--
|
62
|
-
options[:
|
61
|
+
opts.on("-b","--break", "pause after first operation") do |v|
|
62
|
+
options[:pause] = v
|
63
63
|
end
|
64
|
-
opts.on("-c
|
65
|
-
options[:command] = v
|
66
|
-
end
|
67
|
-
opts.on("-C cmdfile","--cmdfile cmdfile", "script path") do |v|
|
64
|
+
opts.on("-c cmdfile","--cmdfile cmdfile", "script path") do |v|
|
68
65
|
options[:cmdfile] = v
|
69
66
|
unless File.exists? v
|
70
|
-
|
67
|
+
puts "command file doesn't exists!".to_red
|
71
68
|
exit
|
72
69
|
end
|
73
70
|
end
|
@@ -75,7 +72,12 @@ OptionParser.new do |opts|
|
|
75
72
|
puts opts
|
76
73
|
exit
|
77
74
|
end
|
75
|
+
opts.on("--debug", "debug inputs") do |v|
|
76
|
+
options[:debug]=v
|
77
|
+
end
|
78
78
|
end.parse!
|
79
|
+
|
80
|
+
# If neither the rsa file or password specified, go get rsa file in home directory
|
79
81
|
unless options[:key] || options[:password]
|
80
82
|
if File.exists? ENV['HOME']+"/.jsshrc"
|
81
83
|
config=YAML::load_file(ENV['HOME']+"/.jsshrc")
|
@@ -85,6 +87,19 @@ unless options[:key] || options[:password]
|
|
85
87
|
options[:key]||=ENV['HOME']+'/.ssh/id_rsa'
|
86
88
|
end
|
87
89
|
end
|
90
|
+
|
91
|
+
# If no script file, read command from command line
|
92
|
+
options[:command]=ARGV.first if ARGV.size>0 && options[:cmdfile].nil?
|
93
|
+
|
94
|
+
# If no user specified, use current user
|
95
|
+
options[:user]||=ENV["USER"]
|
96
|
+
|
97
|
+
if options[:debug]
|
98
|
+
puts "options: ".to_green+options.to_s
|
99
|
+
puts "ARGV: ".to_green+ARGV.to_s
|
100
|
+
exit
|
101
|
+
end
|
102
|
+
|
88
103
|
lambda{puts "No command or command file specify";exit}.call unless options[:cmdfile] || options[:command]
|
89
104
|
lambda{puts "Please specify the user";exit}.call unless options[:user]
|
90
105
|
lambda{puts "Please specify the rsa file or password";exit}.call unless options[:key] || options[:password]
|
@@ -96,15 +111,11 @@ class Jssh
|
|
96
111
|
@auth_cfg={}
|
97
112
|
self.printer=:on
|
98
113
|
@queue=Queue.new
|
99
|
-
Thread.new(self) do |rssh|
|
100
|
-
while true
|
101
|
-
puts rssh.messages.pop if rssh.printer
|
102
|
-
end
|
103
|
-
end
|
104
114
|
end
|
105
115
|
def messages
|
106
116
|
@queue
|
107
117
|
end
|
118
|
+
|
108
119
|
def go(from=0,len=nil)
|
109
120
|
len||=self.hosts.size
|
110
121
|
to=from+len-1
|
@@ -123,23 +134,31 @@ class Jssh
|
|
123
134
|
end
|
124
135
|
end
|
125
136
|
def execute(from=0,len=nil,group_size=10)
|
137
|
+
pr=start_printer(self)
|
126
138
|
threads=[]
|
127
139
|
len||=self.hosts.size
|
128
140
|
to=from+len-1
|
129
141
|
divider(self.hosts[from..to].size,group_size) do |df,dt|
|
130
142
|
threads<<Thread.new(self,from+df,from+dt) do |rssh,f,t|
|
131
143
|
rssh.go(f,t) do |h,r|
|
132
|
-
output="="*20+h+"="*20+"\n"+r
|
144
|
+
output=("="*20+h+"="*20).to_yellow+"\n"+r
|
133
145
|
rssh.messages.push output
|
134
146
|
end
|
135
147
|
end
|
136
148
|
end
|
137
|
-
|
138
|
-
|
139
|
-
|
149
|
+
threads.each{|t| t.join}
|
150
|
+
loop{ break if self.messages.size==0 } if self.printer
|
151
|
+
Thread.kill pr
|
140
152
|
end
|
141
153
|
|
142
154
|
private
|
155
|
+
def start_printer(jssh)
|
156
|
+
Thread.new(jssh) do |rssh|
|
157
|
+
while true
|
158
|
+
puts rssh.messages.pop if rssh.printer
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
143
162
|
def divider(total,gsize)
|
144
163
|
gcnt=total/gsize
|
145
164
|
gcnt=gcnt+1 if total%gsize!=0
|
@@ -165,7 +184,7 @@ if options[:cmdfile]
|
|
165
184
|
else
|
166
185
|
rs.cmd=options[:command]
|
167
186
|
end
|
168
|
-
|
187
|
+
unless options[:pause]
|
169
188
|
rs.hosts=orig_hosts
|
170
189
|
rs.execute 0,nil,rs.hosts.size
|
171
190
|
puts "Finished!".to_green
|
@@ -175,7 +194,7 @@ rs.hosts=orig_hosts.take 1
|
|
175
194
|
rs.execute
|
176
195
|
puts "Now the operations on the first host is completed, we're going to it for a check.".to_yellow
|
177
196
|
print "Press ENTER to automatic to login #{rs.hosts.first.to_red} ..."
|
178
|
-
gets
|
197
|
+
$stdin.gets
|
179
198
|
if options[:password]
|
180
199
|
login_to_first=%Q|expect -c 'spawn ssh #{rs.user}@#{rs.hosts.first}
|
181
200
|
expect {
|
@@ -190,7 +209,7 @@ else
|
|
190
209
|
end
|
191
210
|
system(login_to_first)
|
192
211
|
print "Continue to finish all the left operations by parallel(p) or serial(s), [p/s] ".to_yellow
|
193
|
-
ans
|
212
|
+
ans=$stdin.gets.chomp
|
194
213
|
rs.hosts=orig_hosts[1..-1]
|
195
214
|
if ans.downcase=='p'
|
196
215
|
rs.execute
|
data/lib/jssh/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- qjpcpu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03
|
11
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|