我正在尝试使用 gnu parallel 生成多个 rsync 实例,以便通过中间服务器进行下载。这是我使用的命令 -
cat ~/filelist | parallel --will-cite -j 5 --verbose --progress --line-buffer --keep-order rsync -avrhP -e "ssh -J intermediateUserID@intermediateIP" sourceUserID@sourceIP:{} ~/scratch/quicktest/
但我收到以下错误 -
rsync 错误:语法或使用错误(代码 1)在 main.c(1354) [sender=3.1.3] 本地:0/728/100%/0.0s rsync -avrhP -e ssh -J middleUserID@intermediateIP sourceUserID@sourceIP:/source/directory/path /destination/path/ local:1/728/100%/0.0s 意外的远程参数:sourceUserID@sourceIP:/source/directory/path
似乎 gnu parallel 出于某种原因删除了 -e 后的引号。我怎样才能让它包含引号,并使代理跳转与 GNU parallel 和 rsync 一起工作?
答案1
Bash 正在解析您的命令行,并将其ssh -J intermediateUserID@intermediateIP
作为第 11 个参数传递给parallel
。反过来,parallel
它将不带引号的字符串作为几个参数传递给rsync
。您可能想要的是使用内部引号传递该参数。
例如:
cat ~/filelist \
| parallel --will-cite -j 5 --verbose --progress --line-buffer --keep-order \
rsync -avrhP \
-e "'ssh -J intermediateUserID@intermediateIP'" \
sourceUserID@sourceIP:{} \
~/scratch/quicktest/
作为参考,您的命令行是:cat ~/filelist | parallel --will-cite -j 5 --verbose --progress --line-buffer --keep-order rsync -avrhP -e "ssh -J intermediateUserID@intermediateIP" sourceUserID@sourceIP:{} ~/scratch/quicktest/
。
PS 如果您使用无密码公钥身份验证(并且已经接受和/或绕过已知主机文件),则您的命令应该可以工作。否则,您将遇到并行化进程(即rsync
/ ssh
)需要输入的挑战,并且使用--tty
,parallel
还假设-j1 -u
。为了克服这一挑战,请考虑使用pssh
而不是parallel
w。rsync
或考虑集成sshpass
到您现有的命令行中。