linux - 期望带有引号的 rsync 脚本

标签 linux bash tcl expect 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 不尊重“--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/

相关文章:

linux - 防止Centos 6更新期间恶魔自动启动

linux - 符号链接(symbolic link) "Permission denied"

php - 是否可以通过编程方式从命令行访问 MongoDB 配置文件?

windows - Windows 批处理中 Bash 的 "-"是什么?

linux - 在 tcl exec 命令中使用 Clearfsimport

multithreading - 没有包 Thread,但 tcl_platform(threaded) 为真

字符设备 : choose the device to read/write

C++ 将所有文件从一个目录移动到另一个目录

linux - 使用 du 按顺序检查多个目录大小

regex - 替换文件中的字符串会覆盖所有内容