9

我的团队管理着许多服务器,公司政策规定这些服务器上的密码必须每两周更改一次。有时,无论出于何种原因,我们的官方密码数据库都会过时(人们通常会忘记更新它),但有时我们要到几个月后才能确定这一点,因为我们不会一直使用每台服务器。

我想编写一个脚本,从数据库中抓取密码,并使用这些密码每晚尝试(ssh)登录到每台服务器,并将结果发送给团队的电子邮件。我能够从数据库中抓取登录信息,但我不确定如何在 expect 中检查 ssh 登录是否成功

我不能为此任务使用公钥身份验证。我想要密码验证,所以我可以验证密码。

我通过指定以下文件禁用公钥身份验证:

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\'"

我想也许退出状态可以表明成功?但是在手册页中找不到任何内容。

4

4 回答 4

7

我一直在使用类似下面的脚本来完成类似的任务。

#!/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
}
于 2012-09-05T14:55:02.050 回答
1

您是否特别需要检查是否可以获得 shell 或者是否正在尝试执行命令也可以?

如果您只想检查身份验证,您可能需要ssh asimplecommand(使用echohostname或类似的东西)并检查您是否得到预期的结果。

您可能还想使用-v选项启动 ssh,并查找Authentication succeeded(在 debug1 日志级别)。

于 2012-09-05T13:20:28.657 回答
1

crowbent 为您提供了一个期望脚本来测试 ssh 登录,但是我建议使用非交互式 ssh 密码验证来测试 ssh/sftp。sshpass 比预期的更安全,更不容易出错。

于 2012-09-05T15:47:09.303 回答
0

潜在问题(密码数据库不同步)的解决方案是使用公钥身份验证。给大家。当涉及到 SSH 时,不要为密码烦恼。

登录成功可以这样检查:

ssh -o PasswordAuthentication=no USER@HOST 'exit' || echo "SSH login failed."
于 2012-09-05T13:33:34.320 回答