期望带引号的 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!
我想将文件夹同步到另一台机器。 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!