Expect 脚本:在使用 zenity 生成后定义新变量
Expect Script: Define new variable after spawn with zenity
我正在开发一个 bash 脚本,该脚本使用 openconnect 连接 VPN 与智能卡或使用 Zenity(最终用户友好)的 RSA 令牌,它会在调用 expect 之前提示用户输入所需的变量产卵过程。它工作得很好,除非 RSA 令牌不同步,要求用户输入下一个令牌代码。
有谁知道启动spawn进程后如何成功调用zenity?我需要用 zenity 定义一个新变量 ($token) 并将其应用到正在处理的 expect 脚本中。由于它正在请求下一个令牌代码,因此我无法在调用 spawn 进程之前预定义变量。下面是 bash 脚本的一部分。此外,此脚本在后台运行。用户在终端中看不到脚本 运行。
function rsa() {
while [ -z "$user" ]; do
user
if [[ $? -eq 1 ]]; then
exit 1
fi
done
while [ -z "$pin" ]; do
pin
if [[ $? -eq 1 ]]; then
exit 1
elif [ -n "$pin" ]; then
notify-send -t 10000 "Starting VPN" "Attempting connection to the network."
expect -c "
spawn sudo openconnect https://***removed*** -g ***removed*** -u $user --no-dtls --no-cert-check --no-xmlpost
expect {
\"Failed to obtain WebVPN cookie\" {
puts [exec notify-send -t 10000 \"Connection Unsuccessful\" \"Connection attempt halted.\"]
exit
}
\"Password:\" {
send $pin\r
expect {
\"TOKENCODE:\" {
***need to call zenity and define $token here***
send $token\r
interact
}
\"Login failed\" {
puts [exec notify-send -t 10000 \"Incorrect PIN\" \"Connection attempt halted.\"]
exit
}
\"Failed to obtain WebVPN cookie\" {
puts [exec notify-send -t 10000 \"Connection Unsuccessful\" \"Connection attempt halted.\"]
exit
}
\"Connected tun0\" {
puts [exec notify-send -t 10000 \"Connection Successful\" \"VPN Connected\"]
interact
}
}
}
}"
fi
done
exit
}
您不需要使用spawn
:因为expect是建立在Tcl之上的,您可以使用exec
来调用zenity:
# the quoting for the --text option looks funny, but Tcl requires that
# the quote appear at the start of a word
# (otherwise a quote is just a regular character)
set status [catch {exec zenity --entry "--text=Enter the current RSA token"} token]
如果用户单击“确定”,输入的文本将在 $token 中并且 $status 将为 0。
如果用户单击取消或按 Esc,则 $status 将为 1,并且 $token 包含字符串 "child process exited abnormally"。估计用户不想继续,那么你可以这样做:
if {$status != 0} exit
我正在开发一个 bash 脚本,该脚本使用 openconnect 连接 VPN 与智能卡或使用 Zenity(最终用户友好)的 RSA 令牌,它会在调用 expect 之前提示用户输入所需的变量产卵过程。它工作得很好,除非 RSA 令牌不同步,要求用户输入下一个令牌代码。
有谁知道启动spawn进程后如何成功调用zenity?我需要用 zenity 定义一个新变量 ($token) 并将其应用到正在处理的 expect 脚本中。由于它正在请求下一个令牌代码,因此我无法在调用 spawn 进程之前预定义变量。下面是 bash 脚本的一部分。此外,此脚本在后台运行。用户在终端中看不到脚本 运行。
function rsa() {
while [ -z "$user" ]; do
user
if [[ $? -eq 1 ]]; then
exit 1
fi
done
while [ -z "$pin" ]; do
pin
if [[ $? -eq 1 ]]; then
exit 1
elif [ -n "$pin" ]; then
notify-send -t 10000 "Starting VPN" "Attempting connection to the network."
expect -c "
spawn sudo openconnect https://***removed*** -g ***removed*** -u $user --no-dtls --no-cert-check --no-xmlpost
expect {
\"Failed to obtain WebVPN cookie\" {
puts [exec notify-send -t 10000 \"Connection Unsuccessful\" \"Connection attempt halted.\"]
exit
}
\"Password:\" {
send $pin\r
expect {
\"TOKENCODE:\" {
***need to call zenity and define $token here***
send $token\r
interact
}
\"Login failed\" {
puts [exec notify-send -t 10000 \"Incorrect PIN\" \"Connection attempt halted.\"]
exit
}
\"Failed to obtain WebVPN cookie\" {
puts [exec notify-send -t 10000 \"Connection Unsuccessful\" \"Connection attempt halted.\"]
exit
}
\"Connected tun0\" {
puts [exec notify-send -t 10000 \"Connection Successful\" \"VPN Connected\"]
interact
}
}
}
}"
fi
done
exit
}
您不需要使用spawn
:因为expect是建立在Tcl之上的,您可以使用exec
来调用zenity:
# the quoting for the --text option looks funny, but Tcl requires that
# the quote appear at the start of a word
# (otherwise a quote is just a regular character)
set status [catch {exec zenity --entry "--text=Enter the current RSA token"} token]
如果用户单击“确定”,输入的文本将在 $token 中并且 $status 将为 0。
如果用户单击取消或按 Esc,则 $status 将为 1,并且 $token 包含字符串 "child process exited abnormally"。估计用户不想继续,那么你可以这样做:
if {$status != 0} exit