2012-10-05 2 views
2

서버로 SSH를 호출하고 문자열을 에코하려고합니다. 문자열은 루비에 의해 정의되고 그것에 달러 기호가 있습니다.Ruby 시스템 콜을 통해 SSH를 통해 달러 기호를 보내십시오.

#!/usr/bin/env ruby 
string = '$$%%$#@%$#@%325dg345345' 

puts %x(ssh server "echo \'#{string}\'") 

실행하면 반환되는 문자열은 문자열이 아닙니다. 원격 서버는 달러 기호를 변수로 해석합니다. 이것을 막기 위해 내가 할 수있는 영리한 도피의 형태가 있습니까? 문자는 무작위이므로 달러 기호를 이스케이프 처리하기위한 문자열 편집은 작동하지 않습니다.

escaped_string = string.gsub('$', '\$') 
puts %x(ssh server "echo \'#{escaped_string}\'") 

출력 :

답변

7
당신은뿐만 아니라 달러 기호뿐만 아니라 공간과 "다른 탈출하기 위해 다음 stdlib의 Shellwords 라이브러리를 사용할 수 있습니다

위험한 "문자가있을 수 있습니다.

require 'shellwords' 

string = '$$%%$#@%$#@%325dg345345' 
escaped_string = Shellwords.escape(string) 
# "\\$\\$\\%\\%\\$\\\#@\\%\\$\\\#@\\%325dg345345" 

puts %x(ssh server "echo #{string}") 
+2

쉘에 URL 인코딩과 같은 것이 있어야한다고 생각했지만 stdlib에있을 것으로 기대하지 않았습니다. +1 –

+0

아주 좋습니다. 이것은 완벽하게 작동했습니다. 고맙다. – awojo

2

나는 그것이 문자열이 임의인지 여부를 완벽하게 해 드리겠습니다 된대로 $의 탈출에 반대있어 확실하지 않다

$$ %% $ # @ % $ # % @ 325dg345345

+0

내가 원하는 것만 큼 우아하지는 않지만, 전체 문자열을 벗어날 수있는 방법이있을 것이라고 생각했지만 ... 나는 그것을 가져갈 것입니다! – awojo

관련 문제