我想将文件夹同步到另一台计算机。 sshpass 不是一个选项,证书也不是。所以我一直在期待。
到目前为止,我已经有了这个 bash 脚本(最小化)。
read -p "Enter remote IP: " IP
read -p "Enter remote user: " USER
read -s -p "Enter remote password: " PASSWORD
expect <<EOF
set timeout -1
spawn rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
-aHv --exclude=".*/" --delete ../.. ${USER}@${IP}:~/destination
expect "password: "
send "${PASSWORD}\n"
expect eof
EOF
问题是 rsync 不尊重“--exclude”选项。 在标准输出中,我看到:
spawn rsync -e ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -aHv --exclude=".*/" --delete ../.. <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e6e775e2f2e302e302f302c" rel="noreferrer noopener nofollow">[email protected]</a>:~/OberonHAP
不知何故,-e 选项周围的引号消失了,但排除仍然有它们。
所以我避开了引号
expect <<EOF
set timeout -1
spawn rsync -e \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" \
-aHv --exclude=".*/" --delete ../.. ${USER}@${IP}:~/destination
expect "password: "
send "${PASSWORD}\n"
expect eof
EOF
但现在我明白
Missing trailing-" in remote-shell command.
请注意,当直接输入终端时,该命令本身可以完美运行。
我也尝试过不同的事情,例如“EOF”heredoc并通过环境传递变量,但总是收到不同类型的错误消息:-)
如何转义 rsync 命令才能正常工作?
最佳答案
Tcl 的语法(以及 Expect 的语法)与 shell 的语法不同。特别是报价规则不同;您不需要在单词中间放置双引号,因为 Tcl 不会为您扩展 glob 字符(如果需要,您需要显式调用 glob
)。这意味着您的 spawn
命令实际上最好写为:
spawn rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
-aHv --exclude=.*/ --delete ../.. ${USER}@${IP}:~/destination
# ☝☝☝☝☝☝ LOOK HERE!
关于linux - 期望带有引号的 rsync 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39489598/