单向免密

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. 你不得不了解的Python3.x新特性

    从 3.0 到 3.8,Python 3 已经更新了一波又一波,但似乎我们用起来和 2.7 没有太大区别?以前该怎么写 2.7 的代码现在就怎么写,只不过少数表达方式变了而已.在这篇文章中,作者介绍了 ...

  2. Clickhouse的MergeTree表引擎存储结构

    MergeTree存储的文件结构 一张数据表被分成几个data part,每个data part对应文件系统中的一个目录.通过以下SQL可以查询data parts的信息. select table, ...

  3. Zookeeper介绍一

    Zookeeper是什么 ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用的接口和性能高效.功能稳定 ...

  4. 干掉 Postman?测试接口直接生成API文档,ApiPost真香!

    实不相瞒我的收藏夹里躺着很多优质的开发工具,我有个爱好平时遇到感兴趣的开发工具都会记录下来,然后有时间在慢慢研究.前几天刚给同事分享一款非常好用的API文档工具,真的被惊艳到了,粉丝朋友们也感受一下吧 ...

  5. day 11 算法的时间空间复杂度

    (1).有以下程序: 求输入的n值(除1和n)之外的所有因子之和. 分析:这里函数内的循环体i初值不能为零.%是表示"取余",0除以任何数都不会存在余数的,所有是余数为0. (2) ...

  6. Java常见对象内存分析

    首先要明确Java内存的个位置上放的是啥 类.对象.实例三者的关系: 1.类:是对象的模板,可以实例化对象.(this不能出现在静态方法中) 2.对象:类的个体. 3.实例:实现的对象. 4.对应的引 ...

  7. jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片

    年后换了部门,现在主要的职责就是在网上卖精油,似乎这个就是传说中的网络营销. 跟着公司的MM们也了解不了少关于网络营销的知识,间接的了解到马云和刘强东都是些怎样龌龊的人,尽管之前也这样认为. 淘宝就不 ...

  8. 猪齿鱼 Choerodon 的数据初始化设计解析

    数智化效能平台猪齿鱼Choerodon 作为一个微服务框架,需要解决微服务数据初始化本身具有的问题和复杂性,同时也需要满足框架本身特有的数据初始化需求,下面为大家介绍一下这方面的设计思想和实现. 微服 ...

  9. HashMap和TreeMap的内部结构

    一.HashMap 1.基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hash ...

  10. gin中的多模板和模板继承的用法

    1. 简单用法 package main import ( "github.com/gin-contrib/multitemplate" "github.com/gin- ...