我制作了一个 Bash 脚本,它使用 Expect 脚本来自动进行 ssh 登录。该脚本连接到多个服务器并运行一些命令。
bash 脚本会提示输入一次登录凭据。
我想合并一个功能,其中如果第一个服务器登录失败,脚本将终止,以避免脚本检查下一个服务器,从而导致用户帐户被锁定。连续 3 次登录失败且脚本尝试连接的服务器数量超过 3 时会发生帐户锁定。
这是 bash 脚本中调用 Expect 脚本的代码片段。
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
这是期望脚本(script.expect
) 片段
#!/usr/bin/expect -f
set timeout 30
set username [lindex $argv 0]
set SPASS [lindex $argv 1]
set servername [lindex $argv 2]
set case [lindex $argv 3]
set prompt "(%|#|\\$|%\]) $"
switch $case {
Linux {
log_user 0
spawn ssh -o StrictHostKeyChecking=no $username@$servername
expect {
"assword:" {
send "$SPASS\r"
expect -re "$prompt"
}
expect -re "$prompt"
}
send "sudo su -\r"
expect {
"assword:" { send "$SPASS\r" }
}
expect -re "$prompt"
log_user 1
send "opcagt -status ; opctemplate -l ; cat watch.cf 2> /dev/null\r"
expect -re "$prompt"
log_user 0
send "exit\r"
expect -re "$prompt"
log_user 1
}
我尝试获取 bash 命令输出($?
)假设如果期望脚本中的密码不正确导致登录失败,bash 命令将返回非零值,但这并没有成功。
任何建议将不胜感激。
对于期望脚本中的错误检查,有一个不错的例子http://systeminetwork.com/article/handle-errors-expect-scripts http://systeminetwork.com/article/handle-errors-expect-scripts
你应该做的是这样的:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)