通过远程SSH连接使用rsync时,在远程path中转义空间

当使用SSH将rsync连接到远程服务器时,如何在远程path中转义空格等? 一个简单的反斜杠转义本地bash提示符的空间,但在远程计算机上,空间被读取为path中断,从而标记该path的结束。

所以当我做rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/会发生什么情况是远程服务器正在读取/path/to/dest/some/ ,因为它不能远程find目的地,因为实际的目的地是“一些目录”而不是“一些”。

如果我尝试使用相同的命令,并且使用反斜杠和空格来避开本地bash提示符并保留远程服务器的反斜杠(总共三个反斜杠: /path/to/dest/some\\\ dir/ ),的确将反斜杠发送到远程服务器,但是远程服务器然后将该path解释为/path/to/dest/some\/而不是/path/to/dest/some\ dir/仍然将空间和字符。

如果我试图用引号包装path,它的行为几乎是一样的,有效地切断了在这个空间的path。 所以它也只能通过本地bash提示符。

最初我使用的path中有一个“ – ”(空格连字符空格)段,远程服务器rsync: on remote machine: -: unknown option返回一个错误rsync: on remote machine: -: unknown option ,这是启动整个空间的原因 – 转义努力摆在首位。

那么我必须做什么才能使远程服务器正常工作,而不必从远程path中删除空格或连字符等其他错误字符?

在启动器机器上,rsyncbuild立一个调用远程机器上的rsync目标的命令行,然后使用ssh … 作为单个string发送该命令行。 这个单一的string被传递给shellparsing,分裂成参数并执行rsync 。 我不知道为什么这样做,而不是打包在一些二进制安全的容器(已拆分,扩大和不加引号)的参数在远程rsync。

这意味着你的参数将被两个不同的shell分析,相应地引用和重新报价。 通常,我用双引号包装每个参数,然后用单引号将整个expression式包装起来。 有时还不够,或者如果你想要在本地和远程使用相同的expression式,这可能会很复杂。

在这种情况下,我通常使用简单的,无空格,全ASCII的名称来设置一些软链接,并使用它。

当你说:你走在正确的轨道上:

如果我尝试使用相同的命令并转义反斜杠和空格以通过本地bash提示符并保留远程服务器的反斜线

这是我find最简单的方法:

 rsync -av dir\ with\ spaces/ server.tld:"dir\ with\ spaces" 

这种方式也起作用。

 rsync -av dir\ with\ spaces/ server.tld:dir\\\ with\\\ spaces 

你能发布确切的输出和你看到的任何错误吗?

你能用一个包装脚本来replace双方的rsync吗?

 $ sudo su - # cd /usr/bin # mv rsync rsync.real # cat <<'EOF' >rsync #!/bin/bash logfile=/home/yourname/rsync.log date >> "$logfile" i=1 for arg in "$@"; do echo "arg $i: $arg" >> "$logfile" i=$((i+1)) done rsync.real "$@" EOF # chmod +x rsync 

然后再次运行你的rsync,它应该certificate这种逃避工作的方式,例如

客户端:

 Sun Feb 13 13:48:12 EST 2011 1: -av 2: dir with spaces/ 3: server:dir\ with\ spaces 

服务器端:

 Sun Feb 13 13:48:13 EST 2011 1: --server 2: -vlogDtpre.iL 3: . 4: dir with spaces 

在上面的例子中,服务器上的第四个参数( dir with spaces )全部在同一行上的事实表明引用工作正常。

如果这没有帮助,请尝试重新运行rsync -vrsync -vvrsync -vvv 。 它会给你额外的debugging信息。

另外两个愚蠢的build议:

  • 另一台服务器是Linux服务器,那你的默认shell是什么?
    • 也许它是扩大文件名称不同于你的期望
  • 你忘了添加-a-r选项吗?
    • 没有看到你的输出,我不知道

你可以把你的path用引号括起来。

答案是:

使用-s(保护参数)并用引号括住你的path:

rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"

与空格或破折号一起使用。