当使用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 -v或rsync -vv或rsync -vvv 。 它会给你额外的debugging信息。
另外两个愚蠢的build议:
-a或-r选项吗?
你可以把你的path用引号括起来。
答案是:
使用-s(保护参数)并用引号括住你的path:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
与空格或破折号一起使用。