【问题标题】:find: missing argument to -exec with ssh发现:使用 ssh 的 -exec 缺少参数
【发布时间】:2018-06-14 10:38:49
【问题描述】:

试图从服务器中删除目录:

ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;

我尝试使用 \;\;;;"{}"-exec sh -c 'rm -r "{}"' \;

所有得到的都是错误find: missing argument to "-exec'"

谢谢

【问题讨论】:

    标签: linux bash ssh exec


    【解决方案1】:

    当您想使用特殊字符时,通常很难甚至不可能使用 ssh 直接运行命令。这是因为 ssh 远程调用sh -c "<<COMMAND HERE>>"。这会导致字符被引用/取消引用两次,有时甚至被删除。

    您最好的选择是在远程系统上使用您的命令创建一个临时文件并执行它:

    echo 'find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} \;' > script
    scp script myname@servera:
    ssh myname@servera bash script
    

    在您的情况下,您可以使用 find 的 -delete 命令而不是 -exec

    【讨论】:

    • 不幸的是-delete 只删除空目录。这就是为什么我尝试rm -r
    【解决方案2】:

    不要嵌套调用ssh,而是使用-J 选项并将您的命令作为单个参数发送,而不是ssh 必须连接在一起的参数序列。

    ssh -J myname@servera othername@severb \
      "find /var/lib/jenkins/some/path/to/check -name '2.2.4*' -type d -exec rm -r {} \;"
    

    这样,您只需要担心您的命令会通过单个 shell。

    【讨论】:

    • 使用OpenSSH_6.7p1,说没有-J选项
    • -J-o ProxyJump=... 的快捷方式;不确定是新的捷径还是选项本身。
    • 你的权利,OpenSSH Wikibook 说:In older versions -J is not available. In this case the safest and most straightforward way is to use ssh(1)'s stdio forwarding (-W) mode to "bounce" the connection through an intermediate host. 谢谢 chepner
    【解决方案3】:

    @cbley 是对的,这样做非常棘手。然而,有时人们想避免创建一个额外的文件。如果是这样,你可以这样:

    ssh myname@servera " \"${cmd}\" "  2>&1
    

    其中 $cmd 将是您之前定义的整个命令:

    cmd="find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d -exec rm -r {} ;"
    

    【讨论】:

      【解决方案4】:

      感谢您的帮助。 我的最终解决方案不是使用新脚本,我只是暂时将其保存在一个数组中(对我和我的 bash 技能来说似乎更容易):

      dirArray=( $(ssh myname@servera ssh othername@serverb find /var/lib/jenkins/some/path/to/check -name 2.2.4* -type d) )
      
      for i in "${dirArray[@]}"
      do
        echo "deleting $i"
        ssh myname@servera ssh othername@serverb rm -r $i
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2011-02-27
        • 2014-04-05
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多