预期实用程序是否可以处理它产生的进程也产生子进程的情况?

预期实用程序是否可以处理它产生的进程也产生子进程的情况?

我正在尝试使用 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"

相关内容