用于从多个服务器获取信息的脚本

时间:2012-10-20 11:40:06

标签: bash expect remote-access

我想从多个服务器收集信息,无论他们的grub.conf是否包含“电梯”参数。

现在,无密码密钥身份验证是我目前无法做到的。我可以在脚本中指定密码。

有人可以帮助我实现这个目标吗?

这就是我所做的:

#!/bin/bash

GRUB="/etc/grub.conf"
_pair="$(</home/wadhwaso/login.txt)"
Server_info="/tmp/server_info"
for e in $_pair
do
             # extract user and ips for each $e in $_pair
        IFS='@'
        set -- $e
        _user="$1"
        _ip="$2"

        sleep 2
        echo "Connecting to server '${_ip}' via SSH..."
        ssh ${_user}@${_ip} "sudo grep -q "elevator=noop" "$GRUB" >/dev/null"
        if [ $? -eq 0 ]; then
        echo "Present on ${_ip}" | tee -a "${Server_info}"
        else
        echo "not present on ${_ip}" | tee -a "${Server_info}"
        fi
done

我不想每次都给密码,并且由于我的环境中不存在无密码身份验证且不可能,我必须在脚本中传递密码,这真的不会打扰我,我可以做到这一点。我知道它可以通过预期完成,但每次我尝试使用它时都会搞砸所有内容。

我尝试使用期望它在第一个答案中被告知的方式,但我失败了。

1 个答案:

答案 0 :(得分:0)

“expect”工具听起来非常适合您的需求:http://expect.sourceforge.net/

要安装expect(例如,在ubuntu上),请执行:

sudo apt-get install expect

这是一段代码片段,向您展示如何将expect用作bash脚本的一部分:

#!/bin/bash

IP="111.111.11.1"
login="root"
password="some_password"
dest_dir="/etc/"

expect_sh=$(expect -c "
    spawn ssh $login@$IP
    expect \"password:\"
    send \"$password\r\"
    expect \"#\"
    send \"cd $dest_dir\r\"
    expect \"#\"
    send \"chmod +x $server_side_script"
    expect \"#\"
    send \"./$server_side_script\r\"
    expect \"#\"
    send \"cd /lib\r\"
    send \"cat $file_count\r\" 
    expect \"#\"
    send \"exit\r\"
")

echo "$expect_sh"

或者,您可以将逻辑放在单独的expect脚本中以获得更整洁的语法,并从bash脚本中获取它:

#!/usr/bin/expect

set login "root"
set addr "111.111.1.1"
set pw "root"

spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "cd /etc\r"
# Then other things you need to do

对于带有RSA密钥指纹的“第三件事”:如果连接到之前没有见过的主机(由于中间人攻击的可能性),SSH会发出警告,理论上你应该验证指纹与您预期的指纹相匹配,以验证主机是否是主机声称的主机。

希望这有助于=)