tinyssh 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/tinyssh +72 -0
- data/lib/colorize.rb +16 -0
- data/lib/tinyssh.rb +41 -0
- data/lib/tinysshoptparse.rb +62 -0
- metadata +68 -0
data/bin/tinyssh
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'highline/import'
|
7
|
+
require 'net/ssh'
|
8
|
+
require 'net/scp'
|
9
|
+
|
10
|
+
require 'lib/colorize'
|
11
|
+
require 'lib/tinysshoptparse'
|
12
|
+
require 'lib/tinyssh'
|
13
|
+
|
14
|
+
T = []
|
15
|
+
HOST = []
|
16
|
+
OUTPUT = {}
|
17
|
+
OUTPUT_TITLE = "-------------------------- EXECUTE STATUS --------------------------"
|
18
|
+
|
19
|
+
def main(options)
|
20
|
+
if ['run', 'r', 'u', 'up', 'upload', 'd', 'dl', 'download'].include?(ARGV[0])
|
21
|
+
passphrase = ask("Enter passphrash: ") { |q| q.echo = false }
|
22
|
+
|
23
|
+
if options.host_file != nil
|
24
|
+
File.open(options.host_file).each_line do |line|
|
25
|
+
HOST << line.gsub("\n", '')
|
26
|
+
end
|
27
|
+
else
|
28
|
+
TinysshOptparse.parse(['-h'])
|
29
|
+
puts 'ss'
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
|
33
|
+
HOST.each_with_index do |host, index|
|
34
|
+
T << Thread.new {
|
35
|
+
session = Net::SSH.conn(host, options.user, :port => options.port, :keys => options.keys, :timeout => options.timeout, :passphrase => passphrase.chomp)
|
36
|
+
|
37
|
+
if session.class == String
|
38
|
+
OUTPUT[index] = session % host
|
39
|
+
next
|
40
|
+
end
|
41
|
+
|
42
|
+
case ARGV[0]
|
43
|
+
when 'r', 'run' then OUTPUT[index] = session.run(ARGV[1])
|
44
|
+
when 'u', 'up', 'upload' then OUTPUT[index] = session.up(ARGV[1], ARGV[2])
|
45
|
+
when 'd', 'dl', 'download' then OUTPUT[index] = session.dl(ARGV[1], ARGV[2])
|
46
|
+
end
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
T.each do |t|
|
51
|
+
t.join
|
52
|
+
end
|
53
|
+
|
54
|
+
OUTPUT.keys.sort.each do |k|
|
55
|
+
print OUTPUT[k]
|
56
|
+
end
|
57
|
+
|
58
|
+
if options.output_file != nil
|
59
|
+
File.open(options.output_file, 'w') do |f|
|
60
|
+
OUTPUT.keys.sort.each do |k|
|
61
|
+
f.write(OUTPUT[k])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
else
|
67
|
+
TinysshOptparse.parse(['-h'])
|
68
|
+
exit
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
main(TinysshOptparse.parse(ARGV))
|
data/lib/colorize.rb
ADDED
data/lib/tinyssh.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
include Net::SSH
|
2
|
+
|
3
|
+
module Net::SSH
|
4
|
+
def conn(*options)
|
5
|
+
begin
|
6
|
+
return Net::SSH.start(*options)
|
7
|
+
rescue Timeout::Error
|
8
|
+
return "\n#{OUTPUT_TITLE}\nHost : %s [ " + "Connecting Timeout".red + " ] !\n"
|
9
|
+
rescue Errno::EHOSTUNREACH
|
10
|
+
return "\n#{OUTPUT_TITLE}\nHost : %s [ " + "Unreachable".red + " ] !\n"
|
11
|
+
rescue Errno::ECONNREFUSED
|
12
|
+
return "\n#{OUTPUT_TITLE}\nHost : %s [ " + "Connection Refused".red + " ] !\n"
|
13
|
+
rescue Net::SSH::AuthenticationFailed
|
14
|
+
return "\n#{OUTPUT_TITLE}\nHost : %s [ " + "Authentication Failure".red + " ] !\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Net::SSH::Connection::Session
|
20
|
+
def run(cmd)
|
21
|
+
output = self.exec!(cmd)
|
22
|
+
return "\n#{output}#{OUTPUT_TITLE}\nExecute \"#{cmd}\" at #{host}: [ ", "OK".green, " ]\n"
|
23
|
+
rescue
|
24
|
+
return "\n#{OUTPUT_TITLE}\nExecute \"#{cmd}\" at #{host}: [ ", "FAIL".red, " ] !\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def up(src, dst)
|
28
|
+
self.scp.upload!(src, dst, :recursive => true)
|
29
|
+
return "\n#{OUTPUT_TITLE}\nUpload #{host}:#{src} to #{dst}: [ ", "OK".green, " ] !\n"
|
30
|
+
rescue
|
31
|
+
return "\n#{OUTPUT_TITLE}\nUpload #{host}:#{src} to #{dst}: [ ", "FAIL".red, " ] !\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def dl(src, dst)
|
35
|
+
self.scp.download!(src, dst, :recursive => true)
|
36
|
+
return "\n#{OUTPUT_TITLE}\nDownload #{host}:#{src} to #{dst}: [ ", "OK".green, " ] !\n"
|
37
|
+
rescue
|
38
|
+
return "\n#{OUTPUT_TITLE}\nDownload #{host}:#{src} to #{dst}: [ ", "FAIL".red, " ] !\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class TinysshOptparse
|
2
|
+
def self.parse(args)
|
3
|
+
options = OpenStruct.new
|
4
|
+
options.user = 'root'
|
5
|
+
options.port = '59878'
|
6
|
+
options.num = '0'
|
7
|
+
options.keys = ['/root/.ssh/id_rsa']
|
8
|
+
options.timeout = 5
|
9
|
+
options.host_file = nil
|
10
|
+
options.output_file = nil
|
11
|
+
|
12
|
+
opts = OptionParser.new do |opts|
|
13
|
+
opts.banner = "\nUsage: tinyssh.rb run|upload|download <position parameters> [option]"
|
14
|
+
|
15
|
+
opts.separator ""
|
16
|
+
opts.separator "Specific options:"
|
17
|
+
|
18
|
+
opts.on("-u", "--user [user]",
|
19
|
+
"Specify a user for accessing remote hosts.(default: root)") do |user|
|
20
|
+
options.user = user
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on("-p", "--port [port]",
|
24
|
+
"Port to connect to on the remote host(default: 59878)") do |port|
|
25
|
+
options.port = port
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on("-t", "--timeout [time]",
|
29
|
+
"Set the command timeout to seconds(default: 0)") do |timeout|
|
30
|
+
options.timeout = timeout.to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on("-l", "--list-file [file]",
|
34
|
+
"File containing a list of hosts' IP Address") do |file|
|
35
|
+
options.host_file = file
|
36
|
+
end
|
37
|
+
|
38
|
+
opts.on("-o", "--output-file [file]",
|
39
|
+
"Output result to log file") do |output_file|
|
40
|
+
options.output_file = output_file
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on("-i", "--identity-keys [keys]",
|
44
|
+
"identity (private) keys for authentication(default: /root/.ssh/id_rsa)") do |keys|
|
45
|
+
options.keys = keys
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on("-n", "--number-of-thread [number]",
|
49
|
+
"Specify the number of concurrent jobs for each execution") do |num|
|
50
|
+
options.num = num
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
54
|
+
puts opts
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.parse!(args)
|
60
|
+
options
|
61
|
+
end
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tinyssh
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- William Herry
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-08-02 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: run ssh command, upload/download file/directory on/to muti host
|
22
|
+
email: WilliamHerryChina@Gmail.com
|
23
|
+
executables:
|
24
|
+
- tinyssh
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- lib/colorize.rb
|
31
|
+
- lib/tinysshoptparse.rb
|
32
|
+
- lib/tinyssh.rb
|
33
|
+
- bin/tinyssh
|
34
|
+
homepage: https://rubygems.org/gems/tinyssh
|
35
|
+
licenses: []
|
36
|
+
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 3
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
version: "0"
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.8.10
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: Tiny SSH
|
67
|
+
test_files: []
|
68
|
+
|