簡體   English   中英

帶引號的 rsync 的期望腳本

[英]Expect script for rsync with quotation marks

我想將文件夾同步到另一台機器。 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 ../.. pi@10.0.1.2:~/OberonHAP

不知何故, -e 選項周圍的引號消失了,但 exclude 仍然有它們。

所以我逃避了引號

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!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM