脚本实现功能:批量或单个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. dubbo服务治理框架

    Dubbo的概述 1.1. Dubbo的背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. ...

  2. 菜鸟系列docker——docker网络(8)

    Docker网络 Docker在容器内部运行应用,这些应用之间的交互依赖于大量不同的网络,这意味着Docker需要强大的网络功能. Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多 ...

  3. 简述c和c++的基本区别,你真的懂吗?(面试必学)

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:angry_youth   **1.c和c++的头文件不同:** c的头 ...

  4. Day 04 数据类型基础

    目录 什么是数据类型 为什么对数据分类 整型和浮点型统称为数字类型 整型(int) 作用 定义 使用方法 浮点型(float) 作用 定义 使用方法 强制类型转换 什么是字符串 作用 定义 使用方法 ...

  5. IP地址的配置

    1.右击 网上邻居 → 属性 2.右击 本地连接 → 属性 3.选择Internet协议(TCP/IP) → 属性 配置如下, 默认网关始终是网段的第一个地址 4.打开cmd → 输入 ipconfi ...

  6. Orleans[NET Core 3.1] 学习笔记(三)( 2 )客户端配置

    客户端配置 通过一个ClientBuilder和多个补充选项类,以编程方式配置一个用于连接Silo集群并将请求发送至Grain的客户端. 客户端配置示例: var client = new Clien ...

  7. salt

    更新于 3.25 23:16 salt简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Py ...

  8. NodeJS2-2环境&调试----引用系统内置模块,引用第三方模块

    引用系统内置模块的方法 08_fs.js // 引用系统内置模块的方法 const fs = require('fs'); const result = fs.readFile('./08_fs.js ...

  9. 【转载】Opening Robot Framework log failed

    问题: 两种方法可以解决: 1.临时解决方案 jenkins系统管理—>运行命令行,在文本里输入 System.setProperty("hudson.model.DirectoryB ...

  10. python错误处理—try…catch…finally、调用栈分析

    高级语言包括python一般都内置了一套try…catch…finally的错误处理机制: >>> try: ... print('try...') ... r = 10 / 0 . ...