1
1
require 'digest/sha1'
2
2
require 'securerandom'
3
+ require 'shellwords'
3
4
4
5
# @author Lee Hambley
5
6
module SSHKit
@@ -145,7 +146,7 @@ def should_map?
145
146
146
147
def within ( &_block )
147
148
return yield unless options [ :in ]
148
- sprintf ( "cd #{ options [ :in ] } && %s" , yield )
149
+ "cd #{ options [ :in ] . shellescape } && #{ yield } "
149
150
end
150
151
151
152
def environment_hash
@@ -155,8 +156,7 @@ def environment_hash
155
156
def environment_string
156
157
environment_hash . collect do |key , value |
157
158
key_string = key . is_a? ( Symbol ) ? key . to_s . upcase : key . to_s
158
- escaped_value = value . to_s . gsub ( /"/ , '\"' )
159
- %{#{ key_string } ="#{ escaped_value } "}
159
+ "#{ key_string } =#{ value . shellescape } "
160
160
end . join ( ' ' )
161
161
end
162
162
@@ -167,7 +167,7 @@ def with(&_block)
167
167
168
168
def user ( &_block )
169
169
return yield unless options [ :user ]
170
- "sudo -u #{ options [ :user ] } #{ environment_string + " " unless environment_string . empty? } -- sh -c ' #{ yield } ' "
170
+ "sudo -u #{ options [ :user ] . shellescape } #{ environment_string + " " unless environment_string . empty? } -- sh -c #{ yield } "
171
171
end
172
172
173
173
def in_background ( &_block )
@@ -177,12 +177,12 @@ def in_background(&_block)
177
177
178
178
def umask ( &_block )
179
179
return yield unless SSHKit . config . umask
180
- sprintf ( "umask #{ SSHKit . config . umask } && %s" , yield )
180
+ "umask #{ SSHKit . config . umask } && #{ yield } "
181
181
end
182
182
183
183
def group ( &_block )
184
184
return yield unless options [ :group ]
185
- %Q( sg #{ options [ :group ] } -c " #{ yield } ")
185
+ " sg #{ options [ :group ] . shellescape } -c #{ yield } "
186
186
# We could also use the so-called heredoc format perhaps:
187
187
#"newgrp #{options[:group]} <<EOC \\\"%s\\\" EOC" % %Q{#{yield}}
188
188
end
@@ -213,7 +213,9 @@ def with_redaction
213
213
214
214
def to_s
215
215
if should_map?
216
- [ SSHKit . config . command_map [ command . to_sym ] , *Array ( args ) ] . join ( ' ' )
216
+ arguments = Array ( args )
217
+ arguments = ( arguments . any? ? arguments . shelljoin : [ ] )
218
+ [ SSHKit . config . command_map [ command . to_sym ] , *arguments ] . join ( " " )
217
219
else
218
220
command . to_s
219
221
end
0 commit comments