在 stderr 上使用 expect(以 sshuttle 为例)
Using expect on stderr (sshuttle as an example)
有一个名为 sshuttle
的程序可以连接到服务器并创建隧道。
我希望创建一个 bash 函数,顺序地:
-
- 打开到远程服务器的隧道 (
sshuttle -r myhost 0/0
),
-
- 执行 1 个任意命令行,
-
kill -s TERM <pidOfTheAboveTunnel>
.
一个基本的想法(可行,但 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
,这将在下一行发生。
有一个名为 sshuttle
的程序可以连接到服务器并创建隧道。
我希望创建一个 bash 函数,顺序地:
-
- 打开到远程服务器的隧道 (
sshuttle -r myhost 0/0
),
- 打开到远程服务器的隧道 (
-
- 执行 1 个任意命令行,
-
kill -s TERM <pidOfTheAboveTunnel>
.
一个基本的想法(可行,但 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
,这将在下一行发生。