我想从多个服务器收集信息,无论他们的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
我不想每次都给密码,并且由于我的环境中不存在无密码身份验证且不可能,我必须在脚本中传递密码,这真的不会打扰我,我可以做到这一点。我知道它可以通过预期完成,但每次我尝试使用它时都会搞砸所有内容。
我尝试使用期望它在第一个答案中被告知的方式,但我失败了。
答案 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会发出警告,理论上你应该验证指纹与您预期的指纹相匹配,以验证主机是否是主机声称的主机。
希望这有助于=)