期望rsync的脚本带引号

时间:2016-09-14 11:44:35

标签: linux bash tcl expect rsync

我想将文件夹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命令才能正常工作?

1 个答案:

答案 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!