单向免密

expect 免交互

  1. 注意修改脚本内的 your_password远程主机用户的密码
  2. 脚本内的 “master node1 node2” 需要提前写好 /etc/hosts 文件,或者改为 ip 即可
#!/usr/bin/env bash
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
for host in master node1 node2
do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$host
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"your_password\r\"; exp_continue}
\"*assword*\" {send \"your_password\r\";}
}"
done

或者

#!/usr/bin/env bash
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
for host in $(cat ip.txt)
do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$host
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"your_password\r\"; exp_continue}
\"*assword*\" {send \"your_password\r\";}
}"
done
"这个需要提前准备一个ip.txt文件,里面写好自己需要做免密的ip即可"

sshpass 免交互

  1. 注意修改脚本内的 your_password远程主机用户的密码
  2. 脚本内的 “master node1 node2” 需要提前写好 /etc/hosts 文件,或者改为 ip 即可
  3. -o StrictHostKeyChecking=no 表示 ssh免密码首次登陆避无需输入yes
  4. sshpass 需要提前安装,centos系列 可以直接使用 yum 安装,其他发行版,建议使用 expect 免交互的方式
#!/usr/bin/env bash
for node in master node1 node2
do
sshpass -p 'your_password' ssh-copy-id ${node} -o StrictHostKeyChecking=no
scp /etc/hosts ${node}:/etc/hosts
if [ $? -eq 0 ];then
printf "[\e[0;32mSUCCESS\e[0m]\e[2;35m Send ${node} local key to other host succeeded.\e[0m\n"
else
printf "[\e[0;31mERROR\e[0m]\e[2;35m Send ${node} local key to other host failed!\e[0m\n"
fi
done

相互免密

  • 注意修改脚本内的 your_password远程主机用户的密码
  • 执行方式: sh sshcopy.sh ip.txt
    • ip.txt 非固定名称,可以自行定义
    • ip.txt 文件内的格式为: "ip地址 用户名 密码"
  • 脚本会删除 ~/.ssh 目录,如果有其他秘钥文件存在,请提前备份和保存 ,避免保存在 ~/.ssh 目录下
#!/usr/bin/env bash

basepath=$(cd $(dirname $0 ; pwd))
FILENAME=$1 function check_file (){
printf "[\e[0;34mINFO\e[0m]\e[0;35m Checking host ip address account file\e[0m\n"
if [ ! -n "${FILENAME}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[0;35m No host ip address account file supplied !!!\e[0m\n"
printf "[\e[0;34mUsage\e[0m] $0 [\e[0;34mip.txt\e[0m]\n"
exit 1
fi IPADDRESS=()
USERNAMES=()
PASSWORDS=()
while read line; do
if [ ! -n "${line}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[2;35m File is empty!\e[0m\n"
break 1
fi ip=$(echo ${line} | cut -d " " -f1)
user_name=$(echo ${line} | cut -d " " -f2)
pass_word=$(echo ${line} | cut -d " " -f3) if [ "${ip}" == "${user_name}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[2;35m File content format error! Format like [ip_address user_name pass_word].\e[0m\n"
exit 2
fi if [ ! -n "${ip}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[2;35m File content format error! Format like [ip_address user_name pass_word].\e[0m\n"
exit 3
fi
if [ ! -n "${user_name}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[2;35m File content format error! Format like [ip_address user_name pass_word].\e[0m\n"
exit 4
fi if [ ! -n "${pass_word}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[2;35m File content format error! Format like [ip_address user_name pass_word].\e[0m\n"
exit 5
fi IPADDRESS[${#IPADDRESS[*]}]=${ip}
USERNAMES[${#USERNAMES[*]}]=${user_name}
PASSWORDS[${#PASSWORDS[*]}]=${pass_word}
done < ${FILENAME}
} function create_key () {
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -t rsa -p '' &>/dev/null
printf "[\e[0;34mINFO\e[0m]\e[0;35m Call ssh-keygen to generate key\e[0m\n"
for ((i = 0; i < ${#IPADDRESS[@]}; i++)); do
ip=${IPADDRESS[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]} expect -c "
spawn ssh ${user_name}@${ip} \"rm -rf ~/.ssh && ssh-keygen -t rsa -N \'\' -f ~/.ssh/id_rsa -q \> /dev/null 2>&1 \"
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"${pass_word}\r\"; exp_continue}
\"*assword*\" {send \"${pass_word}\r\";}
}" > /dev/null 2>&1
if [ $? -eq 0 ];then
printf "[\e[0;32mSUCCESS\e[0m]\e[2;35m ${ip} call ssh-keygen to generate key succeeded.\e[0m\n"
fi
done
} function create_key_tmp_file () {
printf "[\e[0;34mINFO\e[0m]\e[0;35m Copy public key to local\e[0m\n" for ((i = 0; i < ${#IPADDRESS[@]}; i++)); do
ip=${IPADDRESS[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]} TMP_FILE="${basepath}/.id_rsa.pub.$ip.tmp"
expect -c "
spawn scp $user_name@$ip:~/.ssh/id_rsa.pub $TMP_FILE
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"$pass_word\r\"; exp_continue}
\"*assword*\" {send \"$pass_word\r\";}
}" > /dev/null 2>&1 cat $TMP_FILE >> ~/.ssh/authorized_keys
rm -f $TMP_FILE if [ $? -eq 0 ];then
printf "[\e[0;32mSUCCESS\e[0m]\e[2;35m Copy ${ip} public key to local succeeded.\e[0m\n"
fi done
} function scp_authorized_keys_file () {
printf "[\e[0;34mINFO\e[0m]\e[0;35m Send local key to each host\e[0m\n"
for ((i = 0; i < ${#IPADDRESS[@]}; i++)); do
ip=${IPADDRESS[$i]}
user_name=${USERNAMES[$i]}
pass_word=${PASSWORDS[$i]} CMD="scp /root/.ssh/authorized_keys root@$ip:/root/.ssh/authorized_keys"
if [ "$user_name" != "root" ]; then
CMD="scp /home/$user_name/.ssh/authorized_keys $user_name@$ip:/home/$user_name/.ssh/authorized_keys"
fi expect -c "
spawn $CMD
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"$pass_word\r\"; exp_continue}
\"*assword*\" {send \"$pass_word\r\";}
}" > /dev/null 2>&1 if [ $? -eq 0 ];then
printf "[\e[0;32mSUCCESS\e[0m]\e[2;35m Send ${ip} local key to each host succeeded.\e[0m\n"
fi done
} check_file
create_key
create_key_tmp_file
scp_authorized_keys_file printf "[\e[0;34mINFO\e[0m]\e[0;35m Config auto ssh succeeded!\e[0m\n"

ssh 主机之间免密配置脚本的更多相关文章

  1. 使用脚本进行ansible批量主机的免密配置

    应用场景: 在应用ansible的实际情况中,有一个很现实的问题,ansible是需要对主机做ssh免密登陆的,而挨个对主机做免密是非常的繁琐的,挨个敲IP不仅非常的繁琐而且容易出错,为解决这个问题, ...

  2. 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件

    两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...

  3. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库——安装配置OPEN-SSH,设置主机节点之间免密互访

    配置root用户免密互访(为了方便,各台系统中使用统一的证书文件)一.安装Open-SSH 1,查询系统中是否安装了openssh [root@]# opm -qa |grep ssh 如已安装,则列 ...

  4. Hadoop第一式:配置Linux环境之免密配置及SSH原理

    一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...

  5. SSH远程登录:两台或多台服务器之间免密登录设置

    有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...

  6. Linux服务器之间免密同步文件、重启R服务

    机器:ML-01/ML-02/ML-03 需求: 1.在ML-01上自动将文件同步至ML-02/ML-03 2.在ML-01上通过脚本重启ML-02/ML-03上的R服务 说明:以下示例中,ML-02 ...

  7. ssh安全优化免密登陆

    ssh协议 为什么使用ssh协议? 在进行传输时,会对数据进行加密,保证会话安全:telnet协议不是加密传输,在传输过程中如果被抓包,就会造成信息泄露,telnet默认不支持root远程. # 常用 ...

  8. linux之间免密操作

    为了方便分布式集群操作,主机master需要免密操作两个节点slave1和slave2(slave1和slave2在对应机器已经修改hosts文件) 操作步骤: 首先测试连接slave1操作: [ro ...

  9. linux 安装ssh以及ssh用法与免密登录

    想要免费登录就是把本地机器的id_rsa_pub的内容放到远程服务器的authorized_keys里面 一.配置yum和hosts文件 配置hosts文件: 命令:vi /etc/hosts 在文件 ...

随机推荐

  1. Go语言中各种数据格式转换

    Go语言各种数据类型格式转换 package main import ( "encoding/json" "fmt" "reflect" & ...

  2. 终-Echart可视化学习(十二)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 进入官网寻找 里面可以搜素很多 这 ...

  3. JuiceFS 即将发布 1.0 并调整开源许可

    开源一周年 JuiceFS 开始于 2017 年,是一款云原生分布式文件系统,旨在帮助企业解决多云.跨云.混合云环境下所面临的诸多挑战:数据安全和保护.大数据架构升级.海量小文件访问.Kubernet ...

  4. vue传参子传父

    vue子传父用$emit实现 1.文件目录结构 2.parent父组件内容 <template> <div class="wrap"> <div> ...

  5. 《剑指offer》面试题29. 顺时针打印矩阵

    问题描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4 ...

  6. presence_of_element_located对比visibility_of_element_located

    presence_of_element_located和visibility_of_element_located都是selenium里判断元素展示的方法,相信做ui自动化的小伙伴一定被这俩困扰过,本 ...

  7. 集合框架-LinkedHashSet集合(有序唯一)

    1 package cn.itcast.p4.hashset.demo; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 im ...

  8. plsql 存储过程 介绍。

    /* 7-22 知识总结? 1. 存储过程 2.函数 3.包 */ /*1.什么是存储过程? 语法? 存储过程:类似于Java中的方法:完成一个特定的功能,一系列代码 (增删改操作和一些逻辑判断,se ...

  9. JAVA多线程提高十四:同步工具Exchanger

    Exchanger可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视 ...

  10. Web标准和骨架

    Web 标准的好处 1.让Web的发展前景更广阔 2.内容能被更广泛的设备访问 3.更容易被搜寻引擎搜索 4.降低网站流量费用 5.使网站更易于维护 6.提高页面浏览速度 Web 标准构成 Web标准 ...