我有一个像这样的期望剧本
#!/usr/bin/expect -f
set timeout 30
log_user 0
set PASSWORD $::env(PASSWORD)
set USERNAME $::env(USERNAME)
set TOKEN $::env(TOKEN)
puts stderr "Generating OTP"
spawn oathtool --totp $TOKEN
expect -re \\d+
set otp $expect_out(0,string)
puts stderr "Connecting to VPN server"
spawn -ignore HUP env openconnect -b https://vpn
expect "GROUP:"
send "Tech\n"
expect "Username:"
send "$USERNAME\n"
expect "Password:"
send "$PASSWORD\n"
expect "Password:"
send "$otp\n"
expect EOF
这个简单的脚本为openconnect提供了用户和密码,以便在后台建立新的VPN连接,但它不会起作用,因为生成的子进程会被期望杀死。你可能知道,期望在完成之前发送SIGHUP信号,我试图解决它但是即使我把-ignore HUP标志,它杀死了底层进程,我想结束我的脚本但底层的openconnect在后台生存。
你知道这里缺少什么吗?
考虑到openconnect -b将自己生成其他PID。
答案 0 :(得分:0)
以下使用2个批处理文件的方法对我有用:
未使用openconnect中的-b标志,而是使用kill命令将openconnect发送到后台。
名为vpn2的文件的内容:
#!/usr/bin/expect -f
set timeout -1
spawn -ignore HUP -noecho /root/bin/v2vpn2
expect "password"
sleep 3
send -- "my_password\r"
expect "SMS OTP"
interact
expect "Established"
expect eof
名为v2vpn2的文件的内容:
rm /var/log/vpn2.log > /dev/null 2>&1
touch /var/log/vpn2.log
# the word password is printed twice and so filtering here
tail -f /var/log/vpn2.log | grep -m2 -wo "password" | sed '2q;d' &
tail -f /var/log/vpn2.log | grep --color=never -wo "SMS OTP" &
while /bin/true; do
grep -q "Established" /var/log/vpn2.log
if (( $? == 0 )); then
kill -STOP `pgrep openconnect`
kill -CONT `pgrep openconnect`
pkill vpn2
exit
fi
done &
openconnect -u "my_user_name" my_vpn_url >> /var/log/vpn2.log 2>&1
答案 1 :(得分:0)
花了很多时间后,我通过添加
解决了这个问题expect -timeout -1 -ex "Client killed"
并使用&
./vpn.exp &