1

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

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

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

这就是我所做的:

#!/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

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

我尝试使用第一个答案中告诉它的方式,但我失败了。

4

1 回答 1

0

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

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

sudo apt-get install 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"

或者,您可以将逻辑放在单独的期望脚本中以获得更简洁的语法,并从您的 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 会警告您(因为可能存在中间人攻击),理论上您应该验证指纹是否匹配您所期望的验证主机是主机声称的身份。

希望这会有所帮助=)

于 2012-10-20T13:18:03.640 回答