ssh 主机之间免密配置脚本
单向免密
expect
免交互
- 注意修改脚本内的
your_password
为远程主机用户的密码
- 脚本内的 “
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
免交互
- 注意修改脚本内的
your_password
为远程主机用户的密码
- 脚本内的 “
master node1 node2
” 需要提前写好/etc/hosts
文件,或者改为ip
即可 -o StrictHostKeyChecking=no
表示ssh免密码首次登陆避无需输入yes
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 主机之间免密配置脚本的更多相关文章
- 使用脚本进行ansible批量主机的免密配置
应用场景: 在应用ansible的实际情况中,有一个很现实的问题,ansible是需要对主机做ssh免密登陆的,而挨个对主机做免密是非常的繁琐的,挨个敲IP不仅非常的繁琐而且容易出错,为解决这个问题, ...
- 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件
两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库——安装配置OPEN-SSH,设置主机节点之间免密互访
配置root用户免密互访(为了方便,各台系统中使用统一的证书文件)一.安装Open-SSH 1,查询系统中是否安装了openssh [root@]# opm -qa |grep ssh 如已安装,则列 ...
- Hadoop第一式:配置Linux环境之免密配置及SSH原理
一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...
- SSH远程登录:两台或多台服务器之间免密登录设置
有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...
- 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 ...
- ssh安全优化免密登陆
ssh协议 为什么使用ssh协议? 在进行传输时,会对数据进行加密,保证会话安全:telnet协议不是加密传输,在传输过程中如果被抓包,就会造成信息泄露,telnet默认不支持root远程. # 常用 ...
- linux之间免密操作
为了方便分布式集群操作,主机master需要免密操作两个节点slave1和slave2(slave1和slave2在对应机器已经修改hosts文件) 操作步骤: 首先测试连接slave1操作: [ro ...
- linux 安装ssh以及ssh用法与免密登录
想要免费登录就是把本地机器的id_rsa_pub的内容放到远程服务器的authorized_keys里面 一.配置yum和hosts文件 配置hosts文件: 命令:vi /etc/hosts 在文件 ...
随机推荐
- LINUX学习-Mysql集群-一主多从
新建一台服务器 192.168.88.40 yum -y install mysql mysql-server 编辑etc下的配置文件 vim /etc/my.cnf 输入 bin-log=mysql ...
- python中join()方法介绍
描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法:str.join(sequence) 参数 sequence -- 要连接的元 ...
- Ubuntu16桌面版编译OpenCV4的java库和so库
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android 12(S) 图形显示系统 - 基本概念(一)
1 前言 Android图形系统是系统框架中一个非常重要的子系统,与其它子系统一样,Android 框架提供了各种用于 2D 和 3D 图形渲染的 API供开发者使用来创建绚丽多彩的应用APP.图形渲 ...
- SSM框架——thymeleaf学习总结
本人关于thymeleaf的学习源自: https://www.bilibili.com/video/BV1qy4y117qi 1.thymeleaf的项目搭建 首先创建springboot项目,相关 ...
- IBM MQ常用运维命令
创建队列管理器 crtmqm –q QMgrName -q是指创建缺省的队列管理器 删除队列管理器 dltmqm QmgrName 启动队列管理器 strmqm QmgrName 如果是启动默认的队列 ...
- node.js request请求url错误:证书已过期 Error: certificate has expired
场景: node:8.9.3版本 报错代码: Error: certificate has expired at TLSSocket.<anonymous> (_tls_wrap.js:1 ...
- maven项目 子父级工程。
一 .什么是 maven 子父级工程? 建立一个maven项目,然后在该项目 下创建一个module,子级的maven,他继承于父级项目. 1.新建立 maven项目,file ------new- ...
- pl/sql 编程!
一,pl/sql 是什么? --一.pl/sql 是什么? --1.sql是结构化查询语言. --2.编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言. ...
- Guava学习之EventBus
一.EventBus的使用案例 EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单 ...