2012-09-05 32 views
9

我的團隊管理着許多服務器,而且公司政策規定必須每隔幾周更改這些服務器上的密碼。有時,我們的官方密碼數據庫無論出於何種原因都會過時(人們通常會忘記更新它),但直到幾個月後我們才能識別出這種情況,因爲我們並沒有持續使用每臺服務器。如何使用bash/expect檢查SSH登錄是否有效

我想編寫一個腳本,它將從數據庫中提取密碼,並使用這些密碼來每晚嘗試(ssh)登錄每臺服務器,並將結果發送給團隊。我能夠抓取數據庫的登錄信息,但我不知道如何檢查ssh登錄是否成功或沒有預計

我無法對此任務使用公鑰驗證。我密碼認證,所以我可以驗證密碼。

我禁用通過指定下列文件公鑰認證:

PasswordAuthentication=yes 
PubkeyAuthentication=no 

我嘗試在expect腳本:

# $1 = host, $2 = user, $3 = password, $4 = config file 
expect -c "spawn ssh [email protected]$1 -F $4 
expect -re \".*?assword.*?\" 
send \"$3\n\" 
... 
send \'^D\'" 

我想,也許退出狀態可以指示是否成功?儘管在手冊頁中找不到任何東西。

+0

誰更改密碼?也許他們也應該負責更新數據庫。將密碼放入這種腳本似乎無法經常更改密碼。 – chepner

+1

密碼不會進入腳本。密碼是從數據庫中獲取的,並作爲命令行參數傳遞給腳本,這對我來說非常合適。即使人們有責任更新數據庫,但他們通常不會。這是一個健全的檢查,以確保數據庫中的所有密碼都是正確的。 – BlackSheep

回答

6

我一直在使用類似下面類似的任務腳本。

#!/bin/sh 
# Run using expect from path \ 
exec expect -f "$0" "[email protected]" 
# Above line is only executed by sh 
set i 0; foreach n $argv {set [incr i] $n} 
set pid [ spawn -noecho ssh [email protected]$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 
} 
+0

我無法運行您的腳本 - 我收到諸如「沒有這樣的命令foreach」和大括號問題的錯誤。你在運行什麼外殼? – BlackSheep

+0

這在RHEL5上運行(expect-5.43.0)。 – crowbent

+0

在頂部,你有類似#!/ usr/bin/expect -F的東西嗎?我在Ubuntu上預計5.45。 – BlackSheep

0

你特別需要檢查一下你是否可以獲得一個shell或者試圖執行一個命令嗎?

如果你只是想檢查驗證,你可能想要做ssh asimplecommand(使用echohostname,或類似的東西),並檢查是否得到預期的結果。

您可能還想用-v選項啓動ssh,並查找Authentication succeeded(在debug1日誌級別)。

0

底層問題(密碼數據庫不同步)的解決方案是使用公鑰認證。爲了所有人。談到SSH時,不要打擾密碼。

成功登錄,可以檢查這樣的:

ssh -o PasswordAuthentication=no [email protected] 'exit' || echo "SSH login failed." 
+4

請參閱帖子頂部的註釋 – BlackSheep

+1

此命令的問題在於 - 它將要求密碼3次,這是在腳本中的粘滯點。 –

相關問題