我的团队管理着许多服务器,公司政策规定这些服务器上的密码必须每隔几周更改一次。有时,我们的官方密码数据库会因某种原因而过时(人们通常会忘记更新它),但有时我们要到几个月后才能识别这一点,因为我们并不总是使用每台服务器。
我想编写一个脚本,从数据库中抓取密码,并使用这些密码每晚尝试 (ssh) 登录每台服务器,并将包含结果的电子邮件发送给团队。我可以从数据库中抓取登录信息,但是我不知道如何在expect中检查ssh登录是否成功.
我无法使用公钥身份验证来执行此任务. I want密码验证,以便我可以验证密码。
我通过指定以下文件来禁用公钥身份验证:
PasswordAuthentication=yes
PubkeyAuthentication=no
我对期望脚本的尝试:
# $1 = host, $2 = user, $3 = password, $4 = config file
expect -c "spawn ssh $2@$1 -F $4
expect -re \".*?assword.*?\"
send \"$3\n\"
...
send \'^D\'"
我想也许退出状态可以表明成功?但在手册页中找不到任何内容。
我一直在使用类似下面的脚本的东西来完成类似的任务。
#!/bin/sh
# Run using expect from path \
exec expect -f "$0" "$@"
# Above line is only executed by sh
set i 0; foreach n $argv {set [incr i] $n}
set pid [ spawn -noecho ssh $1@$3 $4 ]
set timeout 30
expect {
"(yes/no)" {
sleep 1
send "yes\n"
exp_continue
}
"(y/n)" {
sleep 1
send "y\n"
exp_continue
}
password {
sleep 1
send "$2\n"
exp_continue
}
Password {
sleep 1
send "$2\n"
exp_continue
}
"Last login" {
interact
}
"Permission denied" {
puts "Access not granted, aborting..."
exit 1
}
timeout {
puts "Timeout expired, aborting..."
exit 1
}
eof {
#puts "EOF reached."
}
}
set status [split [wait $pid]]
set osStatus [lindex $status 2]
set procStatus [lindex $status 3]
if { $osStatus == 0 } {
exit $procStatus
} else {
exit $procStatus
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)