rye 0.8.19 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +17 -1
- data/README.rdoc +2 -29
- data/bin/try +42 -13
- data/lib/rye/box.rb +318 -224
- data/lib/rye/cmd.rb +156 -78
- data/lib/rye/rap.rb +10 -6
- data/lib/rye.rb +32 -5
- data/rye.gemspec +4 -7
- metadata +68 -49
- data/bin/rye +0 -147
data/CHANGES.txt
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
RYE, CHANGES
|
2
2
|
|
3
|
+
|
4
|
+
#### 0.9.0 (2010-08-19) #############################
|
5
|
+
|
6
|
+
* FIXED: Pubkeys correctly added for first connection.
|
7
|
+
(NOTE: some state seems to be maintained by ssh-agent)
|
8
|
+
* ADDED: Interactive and non-interactive shell support (via Net::SSH)
|
9
|
+
* ADDED: Basic readline support for interactive mode
|
10
|
+
* ADDED: New hook for printing STDOUT as it is returned
|
11
|
+
* CHANGE: Removed bin/rye
|
12
|
+
* CHANGE: Removed authorize_keys_remote and authorize_keys_local
|
13
|
+
|
14
|
+
|
15
|
+
#### 0.8.20 (2010-08-17) #############################
|
16
|
+
|
17
|
+
* ADDED: string_append, template_write, template_upload, file_modify
|
18
|
+
|
3
19
|
#### 0.8.19 (2010-06-28) #############################
|
4
20
|
|
5
21
|
* ADDED: Rye::Box#root?
|
@@ -307,7 +323,7 @@ Rye.shell and Rye::Box.run_command (SSH) commands.
|
|
307
323
|
* ADDED: Command switches can now be sent as Symbols (rbox.ls(:h))
|
308
324
|
* ADDED: Rye.host_keys
|
309
325
|
* ADDED: bin/rye
|
310
|
-
* ADDED: commands now raise a Rye::
|
326
|
+
* ADDED: commands now raise a Rye::Err exception
|
311
327
|
when the command returns an exit code greater than 0.
|
312
328
|
* CHANGE: Box.add_command renamed to Box.run_command
|
313
329
|
|
data/README.rdoc
CHANGED
@@ -11,33 +11,6 @@ Rye is a Ruby abstraction for executing shell commands via SSH. By default, Rye
|
|
11
11
|
|
12
12
|
Rye does not require anything to be installed on the server side (other than an SSH daemon) so it can be run from any machine with Ruby, OpenSSL, and OpenSSH.
|
13
13
|
|
14
|
-
=== SSH keys
|
15
|
-
|
16
|
-
You need SSH keys to use Rye. After installing Rye, you can check if you have any by running:
|
17
|
-
|
18
|
-
$ rye
|
19
|
-
|
20
|
-
If you get the message <i>"The agent has no identities"</i> you will need to generate a keypair.
|
21
|
-
|
22
|
-
$ ssh-keygen
|
23
|
-
|
24
|
-
|
25
|
-
=== Passwordless SSH authorization
|
26
|
-
|
27
|
-
The easiest way to work with Rye is to authorize your remote accounts for passwordless logins (otherwise you'll be prompted for a password for every connection).
|
28
|
-
|
29
|
-
Enable passwordless logins to remote HOST1 and HOST2:
|
30
|
-
|
31
|
-
$ rye authorize HOST1 HOST2
|
32
|
-
|
33
|
-
This will copy your public SSH keys to the <tt>~/.ssh/authorized_keys</tt> and <tt>~/.ssh/authorized_keys2</tt> files on the remote machine(s).
|
34
|
-
|
35
|
-
Enable passwordless logins to the local machine:
|
36
|
-
|
37
|
-
$ rye authorize-local
|
38
|
-
|
39
|
-
See <tt>rye -h</tt> for more info.
|
40
|
-
|
41
14
|
|
42
15
|
== Example 1 -- Execute commands on a remote machine
|
43
16
|
|
@@ -53,7 +26,7 @@ The return value for a command is a modified Array containing the contents of ST
|
|
53
26
|
|
54
27
|
ret = rbox.uptime # => "11:02 up 16:01, 3 users"
|
55
28
|
ret.stderr # => []
|
56
|
-
ret.
|
29
|
+
ret.exit_status # => 0
|
57
30
|
ret.stdout # => "11:02 up 16:01, 3 users"
|
58
31
|
ret.stdout.class # => Array
|
59
32
|
ret.class # => Rye::Rap
|
@@ -161,7 +134,7 @@ The first argument must be the command name and the remaining arguments are sent
|
|
161
134
|
The return value is a Rye::Rap object (just like with Rye::Box) so you have access to the exit code and STDERR output:
|
162
135
|
|
163
136
|
ret = Rye.shell :ls, 'nofile'
|
164
|
-
ret.
|
137
|
+
ret.exit_status # => 1
|
165
138
|
ret.stderr # => "sh: nofile: No such file or directory"
|
166
139
|
ret.class # => Rye::Rap
|
167
140
|
|
data/bin/try
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
+
# encoding: UTF-8
|
2
3
|
|
3
4
|
# Rye -- A working example
|
4
5
|
#
|
@@ -61,8 +62,8 @@ rbox_wild = Rye::Box.new('localhost', :safe => false)
|
|
61
62
|
# arguments are thoroughly escaped. This prevents access to
|
62
63
|
# environment variables and file globs (among other things).
|
63
64
|
p rbox_safe.echo('$HOME') # => "$HOME"
|
64
|
-
p rbox_safe['/etc'].ls('host*') rescue Rye::
|
65
|
-
p rbox_safe.ls('-l | wc -l') rescue Rye::
|
65
|
+
p rbox_safe['/etc'].ls('host*') rescue Rye::Err # Doesn't exist
|
66
|
+
p rbox_safe.ls('-l | wc -l') rescue Rye::Err # => '|' is not a valid ls arg
|
66
67
|
|
67
68
|
# Here's the same commands with safe-mode disabled:
|
68
69
|
p rbox_wild.echo('$HOME') # => "/home/rye"
|
@@ -82,7 +83,7 @@ rbox = Rye::Box.new('localhost')
|
|
82
83
|
rbox.add_keys('/private/key/path') # Specify additional private keys
|
83
84
|
|
84
85
|
# There's currently no rye900 command
|
85
|
-
p rbox.
|
86
|
+
p rbox.command?('rye9000') # => false
|
86
87
|
|
87
88
|
# But we can add our own commands to the Rye::Cmd class. They
|
88
89
|
# automatically become available to all Rye::Box objects.
|
@@ -97,7 +98,7 @@ end
|
|
97
98
|
|
98
99
|
# We can now run rye9000 (with arguments)
|
99
100
|
p rbox.rye9000('-a') # => [".", "..", ".bashrc", ...]
|
100
|
-
p rbox.
|
101
|
+
p rbox.command?('rye9000') # => true
|
101
102
|
|
102
103
|
|
103
104
|
puts %Q(
|
@@ -146,12 +147,12 @@ puts %Q(
|
|
146
147
|
rbox = Rye::Box.new('localhost', :safe => false) # Note: safe mode is off
|
147
148
|
|
148
149
|
# Rye follows the standard convention of taking exception to a non-zero
|
149
|
-
# exit code by raising a Rye::
|
150
|
+
# exit code by raising a Rye::Err. In this case, rye9000.test
|
150
151
|
# is not found by the ls command.
|
151
152
|
begin
|
152
153
|
rbox.ls('rye.test')
|
153
|
-
rescue Rye::
|
154
|
-
puts ex.
|
154
|
+
rescue Rye::Err => ex
|
155
|
+
puts ex.exit_status # => 1
|
155
156
|
puts ex.stderr # => ls: rye.test: No such file or directory
|
156
157
|
end
|
157
158
|
|
@@ -164,7 +165,7 @@ puts rbox.uname('-a 1>&2').stdout # =>
|
|
164
165
|
puts rbox.uname('-a 1>&2').stderr # => Darwin ryehost 9.6.0 ...
|
165
166
|
|
166
167
|
# There were no actual errors so the exit code should be 0.
|
167
|
-
puts rbox.uname('-a 1>&2').
|
168
|
+
puts rbox.uname('-a 1>&2').exit_status # => 0
|
168
169
|
|
169
170
|
|
170
171
|
puts %Q(
|
@@ -172,10 +173,10 @@ puts %Q(
|
|
172
173
|
# EXAMPLE 6 -- FILE TRANSFERS
|
173
174
|
#)
|
174
175
|
|
175
|
-
dir_upload = "#{Rye.sysinfo.tmpdir}
|
176
|
-
dir_download = "#{Rye.sysinfo.tmpdir}
|
176
|
+
dir_upload = "#{Rye.sysinfo.tmpdir}rye-upload"
|
177
|
+
dir_download = "#{Rye.sysinfo.tmpdir}rye-download"
|
177
178
|
|
178
|
-
rbox = Rye::Box.new("localhost", :info =>
|
179
|
+
rbox = Rye::Box.new("localhost", :info => STDOUT)
|
179
180
|
|
180
181
|
# Rye ships without an rm method (for safety!). Here
|
181
182
|
# we add the rm method only to this instance of rbox.
|
@@ -201,7 +202,33 @@ p filecontent.read
|
|
201
202
|
|
202
203
|
puts %Q(
|
203
204
|
# ------------------------------------------------------------------
|
204
|
-
# EXAMPLE 7 --
|
205
|
+
# EXAMPLE 7 -- FILE TRANSFERS w/ VARIABLE INTERPOLATION
|
206
|
+
#)
|
207
|
+
|
208
|
+
dir_upload = "#{Rye.sysinfo.tmpdir}rye-upload"
|
209
|
+
dir_download = "#{Rye.sysinfo.tmpdir}rye-download"
|
210
|
+
|
211
|
+
rbox = Rye::Box.new("localhost", :info => STDOUT)
|
212
|
+
|
213
|
+
# Rye ships without an rm method (for safety!). Here
|
214
|
+
# we add the rm method only to this instance of rbox.
|
215
|
+
def rbox.rm(*args); __allow('rm', args); end
|
216
|
+
|
217
|
+
rbox.rm(:r, :f, dir_upload) # Silently delete test dirs
|
218
|
+
rbox.rm(:r, :f, dir_download)
|
219
|
+
|
220
|
+
template = StringIO.new("Can we use templates? <%= 'Yes!' %>")
|
221
|
+
rbox.mkdir dir_upload
|
222
|
+
|
223
|
+
rbox.template_write("#{dir_upload}/template.txt", template)
|
224
|
+
|
225
|
+
p rbox.ls(dir_upload) # => [template.txt]
|
226
|
+
p rbox.cat("#{dir_upload}/template.txt") # => "Can we use templates? Yes!"
|
227
|
+
|
228
|
+
|
229
|
+
puts %Q(
|
230
|
+
# ------------------------------------------------------------------
|
231
|
+
# EXAMPLE 8 -- LOCAL PROCESSES
|
205
232
|
#)
|
206
233
|
|
207
234
|
p Rye.shell :uptime
|
@@ -210,8 +237,10 @@ p Rye.shell :ls, '*'
|
|
210
237
|
p Rye.shell :ls, '-l $HOME'
|
211
238
|
p Rye.shell :ls, :l, '$HOME > crazy.txt'
|
212
239
|
|
240
|
+
Rye.shell :rm, 'crazy.txt'
|
241
|
+
|
213
242
|
ret = Rye.shell :ls, 'nofile'
|
214
|
-
p ret.
|
243
|
+
p ret.exit_status # => 1
|
215
244
|
p ret.stderr # => "sh: nofile: No such file or directory"
|
216
245
|
p ret.class # => Rye::Rap
|
217
246
|
|