在 stderr 上使用 expect(以 sshuttle 为例)

Using expect on stderr (sshuttle as an example)

有一个名为 sshuttle 的程序可以连接到服务器并创建隧道。

我希望创建一个 bash 函数,顺序地:

一个基本的想法(可行,但 5 秒的延迟是个问题)就像 sshuttle -r myhost 0/0 & ; sleep 5 ; mycommand ; kill -s TERM $(pgrep sshuttle)

可以 expect 来期待字符串“c : Connected to server”。这是从 stderr 收到的吗?作为新手,我的尝试全都失败了,手册页令人印象深刻。

当您使用 expect 控制另一个程序时,它通过 pseudo-terminal (pty) 连接到该程序,因此 expect 会看到与您在终端上相同的程序输出,特别是 stdout 和 stderr 之间没有区别。假设你的 mycommand 将在本地机器上执行,你可以使用类似这样的东西作为期望(不是 bash)脚本:

#!/usr/bin/expect

spawn sshuttle -r myhost 0/0
expect "Connected to server."
exec mycommand
exec kill [exp_pid]
close

如果 sshuttle 在其 stdin 关闭时退出,则可能不需要 exec kill,这将在下一行发生。