ssh-config 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGES +10 -1
- data/README.rdoc +15 -2
- data/bin/ssh-config +14 -5
- data/lib/config_file.rb +60 -24
- data/lib/config_section.rb +27 -13
- data/lib/ssh-config.rb +0 -1
- metadata +25 -40
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7e2019230b1e51982769d29450d10d98ba7c0b92
|
4
|
+
data.tar.gz: 71cd2369a39509b6d623fd50e3ced45dbdc30d15
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f71ad2cd574d6f86a97f7aad4ebf18833067d659c7a59613b0854ec8eecc58f0dafc6da2f611ea459487a6fed3cdc67b943f6d610df399afe20d09e058e61abf
|
7
|
+
data.tar.gz: 3902d9a8d5a979793b5fbd9d9cee7bda0c73bfc9a9b790c844ffa0c9ada72dc37df587539dea66a86fad5a7fb058a4116270926c1cd28490478d9a59a5258e3d
|
data/CHANGES
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
CHANGES
|
2
2
|
----------------------------------------------------------------------
|
3
3
|
|
4
|
+
2013-07-03:
|
5
|
+
-----------
|
6
|
+
|
7
|
+
- Version 0.1.3
|
8
|
+
|
9
|
+
- add 'alias' and 'unalias' commands, and generally support for aliases.
|
10
|
+
(changes by David Lindes.)
|
11
|
+
- fix compatibility by using FileUtils#copy instead of File#copy
|
12
|
+
(changes by Jason Lewis.)
|
13
|
+
|
4
14
|
2010-03-29:
|
5
15
|
-----------
|
6
16
|
|
@@ -16,4 +26,3 @@ CHANGES
|
|
16
26
|
|
17
27
|
- Search strings are highlighted
|
18
28
|
- Fixed usage/comments to say 'search' instead of 'find'
|
19
|
-
|
data/README.rdoc
CHANGED
@@ -56,14 +56,16 @@ rails-02.example.com User dbrady" would emit
|
|
56
56
|
Hostname rails-02.example.com
|
57
57
|
User dbrady
|
58
58
|
|
59
|
+
Note: If you just want another short name for a host, use alias instead
|
59
60
|
|
60
61
|
=== dump
|
61
62
|
|
62
63
|
Dumps the entire file.
|
63
64
|
|
64
|
-
=== show <host>
|
65
|
+
=== show <host> [<host> ...]
|
65
66
|
|
66
|
-
Dumps one section. (Similar to ssh-what.)
|
67
|
+
Dumps one section. (Similar to ssh-what.) <host> may be the main name
|
68
|
+
for a host or an alias.
|
67
69
|
|
68
70
|
=== search <pattern>
|
69
71
|
|
@@ -74,3 +76,14 @@ pattern. (Similar to ssh-what.)
|
|
74
76
|
|
75
77
|
Lists all section names (just the Host line)
|
76
78
|
|
79
|
+
=== alias <host> <alias> [<alias> ...]
|
80
|
+
|
81
|
+
Adds one or more aliases to a host definition (to show up on the Host line).
|
82
|
+
|
83
|
+
=== unalias [<host>] <alias> [<alias> ...]
|
84
|
+
|
85
|
+
With 2 or more arguments, looks up host by <host> (must be the first
|
86
|
+
name on the Host line), and removes any <alias>es from the list of
|
87
|
+
alternate names. With only 1 argument, looks for an entry by that
|
88
|
+
alias (must NOT be the first name on the Host line), and removes the
|
89
|
+
alias from the entry, if found.
|
data/bin/ssh-config
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require '
|
2
|
+
require 'fileutils'
|
3
3
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'ssh-config'))
|
4
4
|
|
5
5
|
# ssh-config - Manipulate config values in the .ssh/config file.
|
@@ -12,7 +12,9 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'ssh-con
|
|
12
12
|
# ssh-config set <host-nickname> <setting> <value> [<setting> <value> [...]]
|
13
13
|
# Note: "<setting> -" deletes a setting
|
14
14
|
# ssh-config rm <host-nickname> # delete config settings for that host
|
15
|
-
# ssh-config copy <host-nickname> <new-host-nickname> # copy settings from one to the other.
|
15
|
+
# ssh-config copy <host-nickname> <new-host-nickname> # copy settings from one to the other.
|
16
|
+
# ssh-config alias <host-nickname> <alternate-host-nickname> # add an alias
|
17
|
+
# ssh-config unalias [<host-nickname>] <alias-to-remove>
|
16
18
|
|
17
19
|
config = ConfigFile.new
|
18
20
|
argv = ARGV
|
@@ -49,10 +51,11 @@ when 'help'
|
|
49
51
|
when 'list'
|
50
52
|
puts config.list
|
51
53
|
when 'show'
|
52
|
-
puts config.show(argv
|
54
|
+
puts config.show(*argv)
|
53
55
|
when 'search'
|
54
56
|
search = argv.shift
|
55
|
-
|
57
|
+
result = config.search(search).gsub(search, "\033[43m#{search}\033[0m")
|
58
|
+
puts result unless result.empty?
|
56
59
|
when 'cp', 'copy'
|
57
60
|
config.copy! argv.shift, argv.shift, *argv
|
58
61
|
when 'unset'
|
@@ -60,8 +63,14 @@ when 'unset'
|
|
60
63
|
when 'set'
|
61
64
|
config.set!(*argv)
|
62
65
|
when 'rm', 'del', 'delete'
|
63
|
-
config.rm! argv.shift
|
66
|
+
config.rm! argv.shift
|
64
67
|
when 'dump'
|
65
68
|
puts config.dump
|
69
|
+
when 'alias'
|
70
|
+
config.alias!(*argv)
|
71
|
+
when 'unalias'
|
72
|
+
config.unalias!(*argv)
|
73
|
+
else
|
74
|
+
$stderr.puts "Sorry, don't know how to handle command '#{command}'"
|
66
75
|
end
|
67
76
|
|
data/lib/config_file.rb
CHANGED
@@ -6,14 +6,14 @@ class ConfigFile
|
|
6
6
|
@sections_by_name = {}
|
7
7
|
read_config
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def add_section(name)
|
11
11
|
section = ConfigSection.new(name)
|
12
12
|
@sections << section
|
13
|
-
@sections_by_name[name] = section
|
13
|
+
@sections_by_name[section.name] = section
|
14
14
|
section
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def read_config
|
18
18
|
current_section = nil
|
19
19
|
IO.readlines(File.expand_path("~/.ssh/config")).each_with_index do |line, i|
|
@@ -25,19 +25,23 @@ class ConfigFile
|
|
25
25
|
current_section.lines << line
|
26
26
|
else
|
27
27
|
@header_lines << line
|
28
|
-
end
|
28
|
+
end
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
33
|
-
def show(
|
34
|
-
|
32
|
+
|
33
|
+
def show(*host_nicks)
|
34
|
+
items = host_nicks.map {|nick|
|
35
|
+
sections = @sections.select {|section| section.matches_exactly?(nick)}
|
36
|
+
sections.empty? ? "# No entry found for: #{nick}" : sections
|
37
|
+
}
|
38
|
+
items.flatten.uniq * "\n"
|
35
39
|
end
|
36
|
-
|
40
|
+
|
37
41
|
def list()
|
38
|
-
to_text(@sections_by_name.keys.sort.map {|name|
|
42
|
+
to_text(@sections_by_name.keys.sort.map {|name| @sections_by_name[name].header})
|
39
43
|
end
|
40
|
-
|
44
|
+
|
41
45
|
def search(text)
|
42
46
|
to_text(@sections.find_all {|section| section.matches?(text)}.sort_by {|section| section.name})
|
43
47
|
end
|
@@ -51,12 +55,12 @@ class ConfigFile
|
|
51
55
|
save
|
52
56
|
section
|
53
57
|
end
|
54
|
-
|
58
|
+
|
55
59
|
def set(host_nick, key, value)
|
56
60
|
section = @sections_by_name[host_nick] || add_section(host_nick)
|
57
61
|
section[key] = value
|
58
62
|
end
|
59
|
-
|
63
|
+
|
60
64
|
def unset!(host_nick, *keys)
|
61
65
|
backup if @make_backups
|
62
66
|
while keys.length > 0
|
@@ -65,13 +69,13 @@ class ConfigFile
|
|
65
69
|
save
|
66
70
|
section
|
67
71
|
end
|
68
|
-
|
72
|
+
|
69
73
|
def unset(host_nick, key)
|
70
74
|
if section = @sections_by_name[host_nick]
|
71
75
|
section.unset(key)
|
72
76
|
end
|
73
77
|
end
|
74
|
-
|
78
|
+
|
75
79
|
def dump
|
76
80
|
to_text([@header_lines, @sections].flatten)
|
77
81
|
end
|
@@ -81,49 +85,81 @@ class ConfigFile
|
|
81
85
|
rm(host_nick)
|
82
86
|
save
|
83
87
|
end
|
84
|
-
|
88
|
+
|
85
89
|
def rm(host_nick)
|
86
90
|
if @sections_by_name.key?(host_nick)
|
87
91
|
@sections_by_name.delete host_nick
|
88
92
|
@sections.delete_at(@sections.index{|s| s.name == host_nick})
|
89
93
|
end
|
90
94
|
end
|
91
|
-
|
95
|
+
|
92
96
|
def copy!(old_host_nick, new_host_nick, *args)
|
93
97
|
backup if @make_backups
|
94
98
|
copy(old_host_nick, new_host_nick, *args)
|
95
99
|
save
|
96
100
|
end
|
97
|
-
|
101
|
+
|
98
102
|
def copy(old_host_nick, new_host_nick, *args)
|
99
103
|
if @sections_by_name.key?(old_host_nick)
|
100
104
|
old_section = @sections_by_name[old_host_nick]
|
101
105
|
new_section = @sections_by_name[new_host_nick] || add_section(new_host_nick)
|
102
106
|
new_section.lines = old_section.lines.dup
|
103
|
-
|
107
|
+
|
104
108
|
if old_section["Hostname"]
|
105
109
|
new_section["Hostname"] = old_section["Hostname"].gsub(old_host_nick, new_host_nick)
|
106
110
|
end
|
107
|
-
|
111
|
+
|
108
112
|
while args.length > 0
|
109
113
|
key, value = args.shift, args.shift
|
110
114
|
section = set(new_host_nick, key, value)
|
111
115
|
end
|
112
116
|
end
|
113
117
|
end
|
114
|
-
|
118
|
+
|
119
|
+
def alias!(host_nick, *args)
|
120
|
+
backup if @make_backups
|
121
|
+
while args.length > 0
|
122
|
+
new_alias = args.shift
|
123
|
+
section = add_alias(host_nick, new_alias)
|
124
|
+
end
|
125
|
+
save
|
126
|
+
section
|
127
|
+
end
|
128
|
+
|
129
|
+
def add_alias(host_nick, new_alias)
|
130
|
+
section = @sections_by_name[host_nick] || add_section(host_nick)
|
131
|
+
section.aliases.push(new_alias) unless section.aliases.member?(new_alias)
|
132
|
+
end
|
133
|
+
|
134
|
+
def unalias!(*args)
|
135
|
+
if(args.size >= 2)
|
136
|
+
name = args.shift
|
137
|
+
section = @sections_by_name[name]
|
138
|
+
else
|
139
|
+
section = @sections.select {|section| section.has_alias?(args[0])}.first
|
140
|
+
end
|
141
|
+
|
142
|
+
if(section) then
|
143
|
+
section.aliases -= args
|
144
|
+
else
|
145
|
+
$stderr.puts "Failed to find section named #{name || args[0]}"
|
146
|
+
end
|
147
|
+
save
|
148
|
+
section
|
149
|
+
end
|
150
|
+
|
115
151
|
def save
|
116
152
|
File.open(File.expand_path("~/.ssh/config"), "w") do |file|
|
117
153
|
file.puts dump
|
118
154
|
end
|
119
155
|
end
|
120
|
-
|
156
|
+
|
121
157
|
def backup
|
122
|
-
|
158
|
+
FileUtils.copy(File.expand_path("~/.ssh/config"), File.expand_path("~/.ssh/config~"))
|
123
159
|
end
|
124
|
-
|
160
|
+
|
125
161
|
private
|
126
|
-
|
162
|
+
|
127
163
|
def to_text(ray)
|
128
164
|
ray.map {|s| s.to_s } * "\n"
|
129
165
|
end
|
data/lib/config_section.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
class ConfigSection
|
2
|
-
attr_accessor :name, :lines, :settings
|
2
|
+
attr_accessor :name, :aliases, :lines, :settings
|
3
3
|
|
4
4
|
def initialize(name)
|
5
|
-
|
5
|
+
all_names = name.split(/\s+/)
|
6
|
+
@name = all_names.shift
|
7
|
+
@aliases = all_names
|
6
8
|
@settings = {}
|
7
9
|
@lines = []
|
8
10
|
end
|
9
|
-
|
11
|
+
|
10
12
|
def [](setting)
|
11
13
|
unless @settings.key? setting
|
12
14
|
if line = lines[setting_index(setting)]
|
@@ -16,18 +18,23 @@ class ConfigSection
|
|
16
18
|
end
|
17
19
|
@settings[setting]
|
18
20
|
end
|
19
|
-
|
21
|
+
|
20
22
|
def unset(setting)
|
21
23
|
if line_num = setting_index(setting)
|
22
24
|
@settings.delete setting
|
23
25
|
@lines.delete_at line_num
|
24
26
|
end
|
25
27
|
end
|
26
|
-
|
28
|
+
|
29
|
+
def header
|
30
|
+
name_with_aliases = [@name, *aliases].join(" ")
|
31
|
+
"Host #{name_with_aliases}"
|
32
|
+
end
|
33
|
+
|
27
34
|
def to_s
|
28
|
-
[
|
35
|
+
[header, *lines] * "\n"
|
29
36
|
end
|
30
|
-
|
37
|
+
|
31
38
|
def []=(setting, value)
|
32
39
|
if value != '-'
|
33
40
|
line_num = setting_index(setting) || lines.length
|
@@ -37,21 +44,28 @@ class ConfigSection
|
|
37
44
|
@lines.delete_at(setting_index(setting))
|
38
45
|
end
|
39
46
|
end
|
40
|
-
|
47
|
+
|
41
48
|
def matches?(text)
|
42
49
|
r = Regexp.new text
|
43
|
-
name =~ r || lines.any? {|line| line =~ r}
|
50
|
+
name =~ r || aliases.any? {|a| a =~ r} || lines.any? {|line| line =~ r}
|
44
51
|
end
|
45
|
-
|
52
|
+
|
53
|
+
def matches_exactly?(text)
|
54
|
+
name == text || has_alias?(text)
|
55
|
+
end
|
56
|
+
|
57
|
+
def has_alias?(text)
|
58
|
+
aliases.member?(text)
|
59
|
+
end
|
60
|
+
|
46
61
|
protected
|
47
|
-
|
62
|
+
|
48
63
|
def format_line(setting, value)
|
49
64
|
" #{setting} #{value}"
|
50
65
|
end
|
51
|
-
|
66
|
+
|
52
67
|
def setting_index(setting)
|
53
68
|
r = Regexp.new(setting)
|
54
69
|
lines.index {|line| line =~ r}
|
55
70
|
end
|
56
71
|
end
|
57
|
-
|
data/lib/ssh-config.rb
CHANGED
metadata
CHANGED
@@ -1,34 +1,26 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssh-config
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
version: 0.1.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- David Brady
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2010-03-29 00:00:00 -06:00
|
18
|
-
default_executable:
|
11
|
+
date: 2011-02-09 00:00:00.000000000 Z
|
19
12
|
dependencies: []
|
20
|
-
|
21
|
-
|
13
|
+
description: Ssh-Config, a tool that lets you quickly add, update, remove, and copy
|
14
|
+
ssh config file entries.
|
22
15
|
email: github@shinybit.com
|
23
|
-
executables:
|
16
|
+
executables:
|
24
17
|
- ssh-config
|
25
18
|
extensions: []
|
26
|
-
|
27
|
-
extra_rdoc_files:
|
19
|
+
extra_rdoc_files:
|
28
20
|
- README.rdoc
|
29
21
|
- MIT-LICENSE
|
30
22
|
- CHANGES
|
31
|
-
files:
|
23
|
+
files:
|
32
24
|
- CHANGES
|
33
25
|
- MIT-LICENSE
|
34
26
|
- README.rdoc
|
@@ -36,40 +28,33 @@ files:
|
|
36
28
|
- lib/config_file.rb
|
37
29
|
- lib/config_section.rb
|
38
30
|
- lib/ssh-config.rb
|
39
|
-
has_rdoc: true
|
40
31
|
homepage: http://github.com/dbrady/ssh-config/
|
41
32
|
licenses: []
|
42
|
-
|
33
|
+
metadata: {}
|
43
34
|
post_install_message:
|
44
|
-
rdoc_options:
|
35
|
+
rdoc_options:
|
45
36
|
- --line-numbers
|
46
37
|
- --inline-source
|
47
38
|
- --main
|
48
39
|
- README.rdoc
|
49
40
|
- --title
|
50
41
|
- Ssh-Config - A Tool for ssh config files
|
51
|
-
require_paths:
|
42
|
+
require_paths:
|
52
43
|
- lib
|
53
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
segments:
|
65
|
-
- 0
|
66
|
-
version: "0"
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
67
54
|
requirements: []
|
68
|
-
|
69
55
|
rubyforge_project:
|
70
|
-
rubygems_version:
|
56
|
+
rubygems_version: 2.0.3
|
71
57
|
signing_key:
|
72
|
-
specification_version:
|
58
|
+
specification_version: 4
|
73
59
|
summary: Ssh-Config - tool for managing your .ssh/config file
|
74
60
|
test_files: []
|
75
|
-
|