我想将文件夹rsync到另一台机器。 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不尊重&#34; - 排除&#34;选项。 在stdout中,我看到:
spawn rsync -e ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -aHv --exclude=".*/" --delete ../.. pi@10.0.1.2:~/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&#39; heredoc并通过环境传递变量,但总是得到不同种类的错误消息: - )
如何逃避rsync命令才能正常工作?
答案 0 :(得分:2)
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!