我正在尝试使用 expect 通过 ssh shell 处理 rsync,但是它卡住了。
如果我运行 rsync 命令,它会起作用(这里简化了):它会提示我输入密码并将文件复制到服务器:
rsync -e ssh -<other_params>
如果我将其包含在期望中:
expect -d -c "spawn rsync -e ssh -<other_params>" -c "expect password:" -c "send mypass\r"
它无法正确执行,程序存在,但没有复制任何文件。甚至调试模式也没有给出太多线索。
我最好的猜测是 rsync 正在生成 ssh 进程,并且 ssh 进程是需要进行交互的,但是 send 正在获取 rsync 进程 id 并将输入发送到那里。
有什么想法吗?
答案1
这个问题的答案是我需要在 expect 脚本的末尾添加一个 wait 命令。正如问题中所示,它正在运行,但它发送了密码,然后立即终止了进程。添加 wait 等待 rsync 进程完成。
修正版本:
expect -d -c "spawn rsync -e ssh -<other_params>" -c "expect password:" -c "send mypass\r" -c "wait"