sshwitch 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/sshwitch +174 -0
- metadata +47 -0
data/bin/sshwitch
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
include FileUtils
|
6
|
+
|
7
|
+
HOME_PATH = File.expand_path('~')+'/'
|
8
|
+
SSH_PATH = HOME_PATH + '.ssh/'
|
9
|
+
SWITCH_FILE = SSH_PATH+'.sshwitch'
|
10
|
+
|
11
|
+
def get_current
|
12
|
+
begin
|
13
|
+
File.open(SWITCH_FILE).first
|
14
|
+
rescue
|
15
|
+
File.new(SWITCH_FILE, 'w')
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def list
|
21
|
+
begin
|
22
|
+
Dir[SSH_PATH+'*/'].map { |a| File.basename(a) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def switch(name)
|
27
|
+
if File.readable?(SSH_PATH+name+"/id_rsa") && File.readable?(SSH_PATH+name+"/id_rsa.pub")
|
28
|
+
begin
|
29
|
+
cp(SSH_PATH+name+"/id_rsa", SSH_PATH+"id_rsa", :verbose => true)
|
30
|
+
cp(SSH_PATH+name+"/id_rsa.pub", SSH_PATH+"id_rsa.pub", :verbose => true)
|
31
|
+
File.open(SWITCH_FILE, 'w') {|f| f.write(name) }
|
32
|
+
puts "Changed key pair to: " + name
|
33
|
+
rescue => e
|
34
|
+
puts "Could not copy, check if you have permission to write on #{SSH_PATH}"
|
35
|
+
puts e.message
|
36
|
+
end
|
37
|
+
else
|
38
|
+
puts "Could not read key pair in #{SSH_PATH+name}"
|
39
|
+
puts "Check if key pair exists in #{SSH_PATH+name}\n\n"
|
40
|
+
puts "If not you can create a new one with: \"sshwitch -n #{name}\""
|
41
|
+
puts "Or backup the current key pair in #{SSH_PATH} with: \"sshwitch -b #{name}\""
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def new(name)
|
46
|
+
if File.directory? SSH_PATH+name
|
47
|
+
puts "#{SSH_PATH+name} already exists, skipping"
|
48
|
+
else
|
49
|
+
puts "Creating key pair in #{SSH_PATH+name}"
|
50
|
+
begin
|
51
|
+
mkdir SSH_PATH+name
|
52
|
+
`ssh-keygen -t rsa -f #{SSH_PATH+name}/id_rsa`
|
53
|
+
rmdir SSH_PATH+name
|
54
|
+
rescue => e
|
55
|
+
puts "Could not create key pair, check if you have permission to write on #{SSH_PATH+name}"
|
56
|
+
puts e.message
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def backup(name)
|
62
|
+
if File.directory? SSH_PATH+name
|
63
|
+
puts "#{SSH_PATH+name} already exists, skipping"
|
64
|
+
else
|
65
|
+
puts "Copying current key pair in #{SSH_PATH} to #{SSH_PATH+name}"
|
66
|
+
begin
|
67
|
+
mkdir SSH_PATH+name
|
68
|
+
cp(SSH_PATH+"/id_rsa", SSH_PATH+name+"id_rsa", :verbose => true)
|
69
|
+
cp(SSH_PATH+"/id_rsa.pub", SSH_PATH+name+"id_rsa.pub", :verbose => true)
|
70
|
+
rescue => e
|
71
|
+
puts "Could not backup key pair, check if you have permission to write on #{SSH_PATH+name}"
|
72
|
+
puts e.message
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def rename(oldname, newname)
|
78
|
+
if File.directory? SSH_PATH+newname
|
79
|
+
puts "#{SSH_PATH+newname} already exists, cannot rename"
|
80
|
+
else
|
81
|
+
begin
|
82
|
+
mv SSH_PATH+oldname, SSH_PATH+newname, :verbose => true
|
83
|
+
if get_current == oldname
|
84
|
+
File.open(SWITCH_FILE, 'w') {|f| f.write(newname) }
|
85
|
+
puts "Renamed the current key"
|
86
|
+
end
|
87
|
+
rescue => e
|
88
|
+
puts e.message
|
89
|
+
puts "Could not rename"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def delete(name)
|
95
|
+
begin
|
96
|
+
Dir.glob(File.join(SSH_PATH+name, "*")).each {|file| rm file, :verbose => true}
|
97
|
+
rmdir SSH_PATH+name, :verbose => true
|
98
|
+
rescue => e
|
99
|
+
puts e.message
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
options = {}
|
104
|
+
|
105
|
+
option_parser = OptionParser.new do |opts|
|
106
|
+
exec_name = File.split($0)[1]
|
107
|
+
opts.banner = "Switch and manage key pairs in #{SSH_PATH} \n\n"
|
108
|
+
opts.banner += "Default usage: #{exec_name} key_pair_name \n\n"
|
109
|
+
opts.banner += "Advanced usage: #{exec_name} [option]\n"
|
110
|
+
|
111
|
+
opts.on("-c", "--current", "Get name of current key pair") do
|
112
|
+
options[:current] = true
|
113
|
+
end
|
114
|
+
|
115
|
+
opts.on("-n NEW", "--new", "New key pair name") do |new|
|
116
|
+
options[:new] = new
|
117
|
+
end
|
118
|
+
|
119
|
+
opts.on("-b BACKUP", "--backup", "Backup key pair in #{SSH_PATH}") do |backup|
|
120
|
+
options[:backup] = backup
|
121
|
+
end
|
122
|
+
|
123
|
+
opts.on("-r OLDNAME,NEWNAME", "--rename", Array, "Rename a key pair") do |rename_names|
|
124
|
+
if rename_names.count == 2
|
125
|
+
puts "Rename #{rename_names[0]} to #{rename_names[1]}"
|
126
|
+
options[:oldname] = rename_names[0]
|
127
|
+
options[:newname] = rename_names[1]
|
128
|
+
else
|
129
|
+
puts "Wrong number of arguments for Rename (#{rename_names.count} for 2)"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
opts.on("-l", "--list", "Get list of key pairs in #{SSH_PATH} \n\n") do
|
134
|
+
options[:list] = true
|
135
|
+
end
|
136
|
+
|
137
|
+
opts.on("-d DELETE", "--delete", "Delete key pair \n\n") do |delete|
|
138
|
+
options[:delete] = delete
|
139
|
+
end
|
140
|
+
end.parse!
|
141
|
+
|
142
|
+
#If no options and no name param print current key
|
143
|
+
if options.empty? && ARGV.empty?
|
144
|
+
puts get_current
|
145
|
+
#If no options and name param use default behavior switch()
|
146
|
+
elsif options.empty? && ARGV.count > 0
|
147
|
+
name = ARGV.shift
|
148
|
+
if get_current.nil?
|
149
|
+
puts "WARNING! This will overwrite the key pair in #{SSH_PATH}, press Y to confirm"
|
150
|
+
if (gets.chr.upcase == 'Y')
|
151
|
+
switch(name)
|
152
|
+
end
|
153
|
+
elsif get_current == name
|
154
|
+
puts "#{name} is the current key pair"
|
155
|
+
else
|
156
|
+
switch(name)
|
157
|
+
end
|
158
|
+
#If other options...
|
159
|
+
elsif options[:current]
|
160
|
+
puts get_current
|
161
|
+
elsif options[:list]
|
162
|
+
puts list
|
163
|
+
elsif options[:new]
|
164
|
+
new(options[:new])
|
165
|
+
elsif options[:backup]
|
166
|
+
backup(options[:backup])
|
167
|
+
elsif options[:delete]
|
168
|
+
puts "WARNING! This will delete the directory and all files in #{SSH_PATH+options[:delete]}, press Y to confirm"
|
169
|
+
if (gets.chr.upcase == 'Y')
|
170
|
+
delete(options[:delete])
|
171
|
+
end
|
172
|
+
elsif options[:oldname] && options[:newname]
|
173
|
+
rename(options[:oldname], options[:newname])
|
174
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sshwitch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Agustín Leñero
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-29 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Manage different sets of keys in your home folder
|
15
|
+
email: agush@roca9.com
|
16
|
+
executables:
|
17
|
+
- sshwitch
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/sshwitch
|
22
|
+
homepage: http://rubygems.org/gems/sshwitch
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 1.8.24
|
44
|
+
signing_key:
|
45
|
+
specification_version: 3
|
46
|
+
summary: Manage your ssh keys
|
47
|
+
test_files: []
|