脚本实现功能:批量或单个SSH免交互登录认证

脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作。

脚本支持系统:Ubuntu和CentOS


#!/bin/bash
# Description: configuration local host and remote host ssh keypair authentication, Support Ubuntu and CentOS operation system.
# Blog: http://lizhenliang.blog.51cto.com function color_echo() {
if [ $ == "green" ]; then
echo -e "\033[32;40m$2\033[0m"
elif [ $ == "red" ]; then
echo -e "\033[31;40m$2\033[0m"
fi
}
function os_version() {
local OS_V=$(cat /etc/issue |awk 'NR==1{print $1}')
if [ $OS_V == "\S" -o $OS_V == "CentOS" ]; then
echo "CentOS"
elif [ $OS_V == "Ubuntu" ]; then
echo "Ubuntu"
fi
}
function check_ssh_auth() {
if $(grep "Permission denied" $EXP_TMP_FILE >/dev/null); then
color_echo red "Host $IP SSH authentication failure! Login password error."
exit
elif $(ssh $INFO 'echo yes >/dev/null'); then
color_echo green "Host $IP SSH authentication successfully."
fi
rm $EXP_TMP_FILE >/dev/null
}
function check_pkg() {
local PKG_NAME=$
if [ $(os_version) == "CentOS" ]; then
if ! $(rpm -ql $PKG_NAME >/dev/null >&); then
echo no
else
echo yes
fi
elif [ $(os_version) == "Ubuntu" ]; then
if ! $(dpkg -l $PKG_NAME >/dev/null >&); then
echo no
else
echo yes
fi
fi
}
function install_pkg() {
local PKG_NAME=$
if [ $(os_version) == "CentOS" ]; then
if [ $(check_pkg $PKG_NAME) == "no" ]; then
yum install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "The $PKG_NAME installation failure! Try to install again."
yum makecache
yum install $PKG_NAME -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit
fi
fi
elif [ $(os_version) == "Ubuntu" ]; then
if [ $(check_pkg $PKG_NAME) == "no" ]; then
apt-get install $PKG_NAME -y
if [ $(check_pkg $PKG_NAME) == "no" ]; then
color_echo green "$PKG_NAME installation failure! Try to install again."
apt-get autoremove && apt-get update
apt-get install $PKG_NAME --force-yes -y
[ $(check_pkg $PKG_NAME) == "no" ] && color_echo red "The $PKG_NAME installation failure!" && exit
fi
fi
fi
}
function generate_keypair() {
if [ ! -e ~/.ssh/id_rsa.pub ]; then
color_echo green "The public/private rsa key pair not exist, start Generating..."
expect -c "
spawn ssh-keygen
expect {
\"ssh/id_rsa):\" {send \"\r\";exp_continue}
\"passphrase):\" {send \"\r\";exp_continue}
\"again:\" {send \"\r\";exp_continue}
}
" >/dev/null 2>&1
if [ -e ~/.ssh/id_rsa.pub ]; then
color_echo green "Generating public/private rsa key pair successfully."
else
color_echo red "Generating public/private rsa key pair failure!"
exit
fi
fi
} EXP_TMP_FILE=/tmp/expect_ssh.tmp if [[ $ =~ ^[a-z]+@[-]{,}\.[-]{,}\.[-]{,}\.[-]{,}@.* ]]; then
install_pkg expect ; generate_keypair
for i in $@; do
USER=$(echo $i|cut -d@ -f1)
IP=$(echo $i|cut -d@ -f2)
PASS=$(echo $i|cut -d@ -f3)
INFO=$USER@$IP
expect -c "
spawn ssh-copy-id $INFO
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$PASS\r\";exp_continue}
}
" > $EXP_TMP_FILE # if login failed, login error info append temp file
check_ssh_auth
done
elif [[ $ =~ ^[a-z]+@[-]{,}\.[-]{,}\.[-]{,}\.[-]{,}-[-]{,}@.* ]]; then
install_pkg expect ; generate_keypair
START_IP_NUM=$(echo $|sed -r 's/.*\.(.*)-(.*)@.*/\1/')
END_IP_NUM=$(echo $|sed -r 's/.*\.(.*)-(.*)@.*/\2/')
for ((i=$START_IP_NUM;i<=$END_IP_NUM;i++)); do
USER=$(echo $|cut -d@ -f1)
PASS=$(echo $|cut -d@ -f3)
IP_RANGE=$(echo $|sed -r 's/.*@(.*\.).*/\1/')
IP=$IP_RANGE$i
INFO=$USER@$IP_RANGE$i
expect -c "
spawn ssh-copy-id $INFO
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$PASS\r\";exp_continue}
}
" > $EXP_TMP_FILE
check_ssh_auth
done
else
echo "Example1: $0 <root@192.168.1.10-15@password>"
echo "Example2: $0 <root@192.168.1.10@password>"
echo "Example3: $0 [root@192.168.1.10@password root@192.168.1.11@password root@192.168.1.12@password ...]"
fi

 

Shell批量SSH免交互登录认证的更多相关文章

  1. shell编程-ssh免交互批量分发公钥脚本

    脚本基本原理 1.控制端免交互创建秘钥和公钥: 1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" 2.免交互发送公钥 1 sshpass ...

  2. Linux的SSH免密登录认证过程研究

    一.先看下SSH免密登录使用到的工具和生成的文件 工具:ssh-keygen用于生成秘钥文件,其中秘钥分为公钥和私钥.ssh-copy-id用于复制公钥文件到被控制机. 文件:ssh-keygen生成 ...

  3. ssh 免交互登录 ,远程执行命令脚本。

    ##免交互SSH登录auto_login_ssh () {    expect -c "set timeout -1;                spawn -noecho ssh -o ...

  4. 8.shell编程之免交互

    shell编程之免交互 目录 shell编程之免交互 Here Document免交互 免交互定义 Here Document变量设定 多行的注释 expect expect 定义 expect基本命 ...

  5. Shell脚本实现SSH免密登录及批量配置管理

    本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们 ...

  6. 批量实现ssh免密登录

    本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们 ...

  7. SSH免密登录(并且免yes交互)

    问题描述:主机A使用ssh协议远程主机B,默认会开启口令认证,即输入主机B对应用户的登录密码,并且第一次登录时,主机A需验证是否接受来自主机B的公钥,输入"yes/no"完成交互. ...

  8. ssh 免密码登录实现批量处理

    搭建集群的时候ssh 免密码登录是一个问题以下脚本将实现批量处理 文件1主机名:host 17.19.18.11:12317.19.18.12:123 文件2:ssh_setup.py #!/usr/ ...

  9. linux上ssh免密登录原理及实现

    因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录.关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理. scp 传输文件 scp( ...

随机推荐

  1. [Python Basics]引用系统(The Import System)

    欲上高楼去避愁,愁还随我上高楼.经行几处江山改,多少亲朋尽白头. 归休去,去归休.不成人总要封侯?浮云出处元无定,得似浮云也自由. 我从短暂的Python工作当中学到一件事,越是模块化,就越会发现py ...

  2. nmap扫描、信息收集(网安全实训第一天)

    本期内容:网站信息收集.nmap扫描 1. 信息收集 2. nmap扫描1.信息收集 (1)确定目标 首先,我们确定攻击目标,在这里,我们随便找一个网站做测试,我以码云为例. (2)nslookup查 ...

  3. 【JS】369- 20个常用的JavaScript字符串方法

    点击上方"前端自习课"关注,学习起来~ 作者:前端小智 https://segmentfault.com/a/1190000020204425 本文主要介绍一些最常用的JS字符串函 ...

  4. rails 中各种去重查询操作

    Table.select("DISTINCT name").map(&:name) : DISTINCT name去重查询name Table.active.map{|x| ...

  5. 16个Spring注解,你知道的有几个?

    @Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.   @RestController Spring4之后加入的注解,原来在@Co ...

  6. native C++ 动态调用.NET DLL

    关于这个问题找了好多地方,都只有第二种解决办法,可是我要返回一个字符串,没办法,继续找,最后还是在http://blogs.msdn.com/b/msdnforum/archive/2010/07/0 ...

  7. Poco的介绍和入门教学

    版权声明:该文章为AirtestProject原创文章:允许转载,但转载必须注明“转载”并保留原链接 前言 前面我们已经介绍了基于图像识别的测试框架Airtest,通过图像识别,已经可以编写大部分的测 ...

  8. Delphi解析修改Json文件,基于superobject.pas(ISuperObject)

    在经过一系列的波折后,还是觉得delphi读取并修改json文件来的方便: 在网络上找到一个delphi的三方库ISuperObject,添加到项目后直接引用就行: 下载地址 ISuperObject ...

  9. WPF 3D足球导览

    根据博文:https://www.cnblogs.com/duel/p/regular3dpoints.html获取足球的3D坐标后,在每一个坐标位置创建一个ModelVisual3D元素,既能实现炫 ...

  10. JS---封装getScroll函数 & 案例:固定导航栏

    封装getScroll函数 1. 获取页面向上或者向左卷曲出去的距离的值 2. 浏览器的滚动事件 function getScroll() { return { left: window.pageXO ...