从Bash调用的Expect脚本的退出状态代码
我制作了一个Bash脚本,它使用一个expect脚本来自动化ssh登录。 bash脚本会提示输入一次登录凭据 我想加入一个功能,如果第一台服务器登录失败,脚本将终止,以避免脚本检查下一台服务器,从而导致用户帐户被锁定。如果连续3次登录失败且脚本尝试连接的服务器数超过3,则会发生帐户锁定 这是bash脚本中调用expect脚本的代码段从Bash调用的Expect脚本的退出状态代码,bash,login,ssh,tcl,expect,Bash,Login,Ssh,Tcl,Expect,我制作了一个Bash脚本,它使用一个expect脚本来自动化ssh登录。 bash脚本会提示输入一次登录凭据 我想加入一个功能,如果第一台服务器登录失败,脚本将终止,以避免脚本检查下一台服务器,从而导致用户帐户被锁定。如果连续3次登录失败且脚本尝试连接的服务器数超过3,则会发生帐户锁定 这是bash脚本中调用expect脚本的代码段 countu=0 for servername in $(cat $linux_host_list) do ./script.expect $LUSERNAME $
countu=0
for servername in $(cat $linux_host_list)
do
./script.expect $LUSERNAME $LPASS $servername Linux >> linux_log_file.txt & < /dev/null
let countl=countl+1
done
我尝试获取bash命令输出($?
),假设如果expect脚本中的密码不正确导致登录失败,bash命令将返回非零值,但没有成功。
任何建议都将不胜感激。您应该认真看一看。我不太喜欢脚本和所有内容,因此我无法编写确切的步骤或脚本来证明我的想法-请原谅 我读到bash提供了一种称为退出状态的东西 退出状态是0表示真,1表示假,或任何其他状态 您可以通过执行一个命令,然后键入“echo$?”检查其退出状态来看到这一点 我的建议是,当您尝试使用ssh连接到一台服务器,但身份验证失败时,应该有一个非0的退出状态
在此处获取if-then-else循环,并检查0的状态以执行脚本,以及检查任何其他值以完全退出脚本,并显示适当的错误消息对于expect脚本中的错误检查,在 你应该这样做:
proc do_exit {msg} {
puts stderr $msg
exit 1
}
switch -exact -- $case {
Linux {
spawn ssh ...
expect {
-re {assword: $} {
send -- "$SPASS\r"
exp_continue
# remain in this expect block and look for the next matching pattern
}
"some message about incorrect password" {
do_exit "incorrect password"
}
timeout {do_exit "timed out waiting for prompt"}
default {do_exit "something else happened"}
-re $prompt
}
# ... rest of your script
}
}
我假设您不需要知道“opcagt…”系列命令的退出状态(您只想查看watch.cf文件的内容。如果您真的在意,您需要让shell告诉您:
send -- "opcagt -status 2>&1 || echo "non-zero return from opcagt: $?"
expect {
"non-zero return" { handle error and exit? }
-re $prompt
}
# ... continue
您正在后台运行expect脚本(
&
),因此在继续之前无法获得第一个脚本的结果
按照编写expect脚本的方式,如果第一个密码失败,它将在第二个密码提示时超时30秒。相反,您可以执行expect
替代操作,查看是否收到另一个assword
提示,然后立即退出
然后将shell脚本更改为不将expect调用放在后台,而是使用$?
捕获输出并对其进行测试。部分:
expect {
"assword:" {
send "$SPASS\r"
expect -re "$prompt"
}
expect -re "$prompt"
}
看起来我非常怀疑。特别是,我真的希望这会导致事情变得混乱。一种更惯用的写作方式是:
expect {
"assword:" {
send "$SPASS\r"
exp_continue
}
-re "$prompt"
}
如果你读了我的问题,我说我已经尝试过($?),但没有成功。老实说,我会犹豫是否要做任何超出预期的事情。多年来,Expect一直是自动化系统任务的主要工具之一,而这些任务并不期望自动化。它做了许多其他此类工具无法比拟的事情(例如,它几乎完美地模拟tty/用户的能力)。这并不是说织物不好,因为我对它一无所知……只是Expect有一些非常大的鞋要穿。我只是建议这样做,因为织物只是为这些任务而制的。没有害处!
expect {
"assword:" {
send "$SPASS\r"
exp_continue
}
-re "$prompt"
}