无法从ruby脚本运行shopt rm -rf

时间:2015-03-09 16:57:15

标签: ruby

我有一个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块未捕获的rescueputs "#{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\),但它也可以工作。有人可以帮助我进行更多调试并使其工作吗?谢谢!

1 个答案:

答案 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}})