2012-10-17 152 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