我有一个ruby脚本需要运行bash builtin command - shopt
来删除除少数文件和文件夹之外的所有文件和文件夹。下面是我遇到问题的代码。
class Test1
def initialize(hostname, user, password)
begin
@hostname = hostname
@username = user
@password = password
@ssh = Net::SSH.start(@hostname, @username, :password => @password)
@rm_cmd = "shopt -s extglob; rm -rf !(file1.zip|dir1|dir2|dir3)"
cmd = @ssh.exec!(@rm_cmd)
puts "#{cmd}"
rescue => e
puts e
end
end
end
#initailizing the object
Test1.new("ABC", "user1", pass1")
它能够建立与服务器的连接,但看起来无法执行@rm_cmd
块未捕获的rescue
。 puts "#{cmd}"
输出以下错误消息:
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `shopt -s extglob; rm -rf !((file1.zip|dir1|dir2|dir3)'
我试图在括号之前给出转义字符,即shopt -s extglob; rm -rf !\(file1.zip|dir1|dir2|dir3\)
,但它也可以工作。有人可以帮助我进行更多调试并使其工作吗?谢谢!
答案 0 :(得分:2)
尝试从Ruby标准库中转义命令use shellwords
扩展名,并将extglob
指定为bash选项(因为远程用户可以拥有其他shell,所以更好):
require 'net/ssh'
require 'shellwords'
ssh = Net::SSH.start('remote-server', 'user', password: 'password')
command = Shellwords.escape('ls !(Projects|Downloads)')
p ssh.exec!(%Q{/bin/bash -O extglob -c #{command}})