如何从expect中生成的进程中获取PID?

如何从expect中生成的进程中获取PID?

示例:在 shell 脚本中,我使用以下命令打开 SSH 隧道:

/usr/bin/expect <<EOD
set timeout -1
spawn ssh -fNL localhost:1873:localhost:873 HOST
expect "*?assword:" { send "$SSHPASS\r"}
sleep 2
exit [exp_pid]
EOD

export SSH_PID=$?
echo $SSH_PID

现在 $SSH_PID 有一些数字,但它不是生成的 ssh 的 PID。我尝试了不同的方法,但没有成功。任何想法?

答案1

退出状态是 8 位整数(尽管大多数 shell(ksh93 是一个例外)会将其截断为 7 位,因为它们将第 8 位用于有信号的进程),因此仅当 pid 介于 0 和 127 之间时它才有效。从管道而不是退出状态:

SSH_PID=$(
expect <<EOD
...
spawn -noecho ssh ...
puts [exp_pid]
...
EOF
)

相关内容