Bash - 转义SSH命令

Dan*_*Dan 7 ssh bash

我有一组脚本用于通过FTP下载文件,然后从服务器中删除它们.

它的工作原理如下:

for dir in `ls /volume1/auto_downloads/sync-complete`
do
if [ "x$dir" != *"x"* ]
then
echo "DIR: $dir"

echo "Moving out of complete"
        # Soft delete from server so they don't get downloaded again
        ssh dan@172.19.1.15 mv -v "'/home/dan/Downloads/complete/$dir'" /home/dan/Downloads/downloaded
Run Code Online (Sandbox Code Playgroud)

现在$ dir可能是"这是一个文件",工作正常.

我遇到的问题是特殊字符,例如:

  • "这是(a)档案"
  • 这是一个文件和东西"

倾向于错误:

bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `mv -v '/home/dan/Downloads/complete/This is (a) file' /home/dan/Downloads/downloaded'
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何逃避它,因此变量得到评估并且命令被正确转义.我尝试了各种转义字符,字面引号,正常引号等组合

Wil*_*mer 17

如果双方都在使用bash,你可以使用printf '%q '例如:

ssh dan@172.19.1.15 "$(printf '%q ' mv -v "/home/dan/Downloads/complete/$dir" /home/dan/Downloads/downloaded)"
Run Code Online (Sandbox Code Playgroud)

  • 根据Bash的逃避规则,`%q`逃脱了.如果bash不是远程shell,则无法保证转义有效. (5认同)