2012-10-17 150 views
3

我需要從100個遠程服務器收集用戶信息。我們有用於身份驗證的公鑰/私鑰基礎結構,並且我配置了ssh-agent命令來轉發密鑰,這意味着我可以在沒有密碼提示(自動登錄)的情況下在任何服務器上登錄。通過SSH遠程運行腳本

現在我想在所有服務器上運行腳本來收集用戶信息(我們在所有服務器上有多少用戶帳戶)。

這是我的腳本來收集用戶信息。

#!/bin/bash 
_l="/etc/login.defs" 
_p="/etc/passwd" 

## get mini UID limit ## 
l=$(grep "^UID_MIN" $_l) 

## get max UID limit ## 
l1=$(grep "^UID_MAX" $_l) 

awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ($3 >= min && $3 <= max && $7 != "/sbin/nologin") print $0 }' "$_p" 

我不知道如何使用ssh運行這個腳本而沒有交互?

回答

3

由於您需要登錄到遠程機器有AFAICT沒有辦法做到這一點「沒有SSH」。但是,ssh接受一個命令在遠程計算機上執行一次登錄(而不是啓動的shell)。因此,如果您可以將腳本保存在遠程機器上,例如作爲〜/ script.sh你可以用

$ ssh remote_machine ~/script.sh 

一個腳本終止的連接將被自動關閉執行它,而無需啓動一個交互的shell(如果未配置遠故意)。

+0

啊!我怎麼錯過scp :(我可以不用密碼就做scp,把這個腳本推送到所有遠程服務器的/ tmp目錄並運行ssh來執行它們......多數民衆贊成在提醒我 – Satish

+0

如果你打算在每個系統上安裝東西無論如何,爲什麼不能一路走下去並使用像Munin這樣的完整工具呢?您可以添加自定義信息,隨着時間的推移繪製您的結果圖,如果主機變得無法訪問,則設置通知。監控很好。:-)有說明在[在Munin文檔中]使用yum在Linux系統上安裝Munin(http://munin-monitoring.org/wiki/LinuxInstallation#InstallationonCentOS5)。 – ghoti

3

聽起來像你可以使用期望做的事情。

http://linux.die.net/man/1/expect

想到的是,「會談」,與其它交互式程序按照一個腳本程序。在腳本之後,Expect知道程序可以預期什麼,以及正確的響應應該是什麼。

+0

更換ssh_port,ssh_username,ssh_server_host和your_passwd我知道我們可以用Expect編。但我想如果我能找到簡單的方法來簡化它。 – Satish

+0

我給你+投票UP :) – Satish

+1

很酷。我知道我有一些用於從多個服務器中獲取信息的Expect腳本......只要我找到它們,我就會在這裏發佈一個示例。 – andrux

0

(注:「正確」的方式沒有密碼手動輸入驗證是使用SSH密鑰,即使在您的本地腳本存儲明文密碼是一個潛在的安全漏洞)

您可以運行預期的部分你的bash腳本。這裏有一個簡單的例子,你可以入侵到你現有的腳本:

login=user 
IP=127.0.0.1 
password='your_password' 

expect_sh=$(expect -c " 
spawn ssh [email protected]$IP 
expect \"password:\" 
send \"$password\r\" 
expect \"#\" 
send \"./$remote_side_script\r\" 
expect \"#\" 
send \"cd /lib\r\" 
expect \"#\" 
send \"cat file_name\r\" 
expect \"#\" 
send \"exit\r\" 
") 

echo "$expect_sh" 

您還可以使用PSCP來回複製文件作爲腳本的一部分,所以你並不需要爲部分手動提供密碼互動:

安裝膩子工具:

$ sudo apt-get install putty-tools 

在腳本中使用PSCP:

pscp -scp -pw $password file_to_copy [email protected]$IP:$dest_dir 
+0

不幸的是我有RedHat系統(yum)。無法編譯或安裝第三方工具:( – Satish

2

如果您在每臺計算機上都有一個密鑰,並且您的監測主機可以登錄ssh remotehost,那麼您就有了收集所需信息所需的全部功能。

#!/bin/bash 

servers=(wopr gerty mother) 

fmt="%s\t%s\t%s\n" 
printf "$fmt" "Host" "UIDs" "Highest" 
printf "$fmt" "----" "----" "-------" 

count='awk "END {print NR}" /etc/passwd' # avoids whitespace problems from `wc` 
highest="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print n}' /etc/passwd" 

for server in ${servers[@]}; do 
    printf "$fmt" "$server" "$(ssh "$server" "$count")" "$(ssh "$server" "$highest")" 
done 

結果對我來說:

$ ./doit.sh 
Host UIDs Highest 
---- ---- ------- 
wopr 40  2020 
gerty 37  9001 
mother 32  534 

注意,這使得兩個SSH連接到每個服務器收集每個數據。如果您想更有效地做到這一點,你可以捆綁的信息集成到一個稍微複雜的收集腳本:(相同的結果)

#!/usr/local/bin/bash 

servers=(wopr gerty mother) 

fmt="%s\t%s\t%s\n" 
printf "$fmt" "Host" "UIDs" "Highest" 
printf "$fmt" "----" "----" "-------" 

gather="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print NR,n}' /etc/passwd" 

for server in ${servers[@]}; do 
    read count highest < <(ssh "$server" "$gather") 
    printf "$fmt" "$server" "$count" "$highest" 
done 

0

也許你想嘗試expect命令如下

#!/usr/bin/expect 
set timeout 30 
spawn ssh -p ssh_port -l ssh_username ssh_server_host 
expect "password:" 
send "your_passwd\r" 
interact 

expect命令將捕獲「密碼:」,然後自動填寫您的發送上面的密碼。

請記住,你自己的配置

2

SSH remoteserver.example /斌/慶典< localscript.bash