背景: 有时候我们在两个主机之间复制文件的时候,提示输入密码,很不方便,那如何免密码复制呢?,就是使用通过linux公钥和秘钥,建立双机信任关系。

在整理之前,我先说下ssh免密码的要点 :

你想免密码登陆到哪个主机哪个用户, 就把你自己的公钥文件内容追加到远程主机对应用户下的authorized_keys文件中(对面可能没有这个文件,创建即可)。

1. 生成秘钥,并添加信任

我的环境中node1的ip是192.168.168.201,node2的ip是192.168.168.202.

[root@node1 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa         #生成rsa
[root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.168.202 #复制201的公钥到202机器上,这样就可以使用在201机器上免密码登录202机器了。 [root@node2 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #生成rsa
[root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.168.201 #复制202的公钥到201机器上,这样就可以使用在202机器上免密码登录201机器了。

注意:

  •   如果远程主机的端口非22端口,需要指定-p port选项。
  •   ssh-copy-id是由openssh-clients包提供,没有这个命令可以安装这个包。
  • centos6,7使用ssh-copy-id的时候可以不用指定-i选项,centos5必须指定的。

2.信任自己主机

[root@node1 ~]# ssh-copy-id -i  ~/.ssh/id_rsa.pub root@192.168.168.201
[root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.168.202

3.测试

[root@node1 ~]# ssh 192.168.168.202 'ip addr show dev eth0 '
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :::3f:: brd ff:ff:ff:ff:ff:ff
inet 192.168.168.202/ brd 192.168.168.255 scope global eth0
inet6 fe80:::56ff:fe3f:/ scope link
valid_lft forever preferred_lft forever [root@node2 ~]# ssh 192.168.168.201 'ip addr show dev eth0'
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::c9:: brd ff:ff:ff:ff:ff:ff
inet 192.168.168.201/ brd 192.168.168.255 scope global eth0
inet 192.168.168.200/ brd 192.168.168.255 scope global secondary eth0
inet6 fe80::20c:29ff:fec9:/ scope link
valid_lft forever preferred_lft forever

4 自动配置免密码登陆

这里有个情况, 有一个跳板机,内部好多自己的服务器。远程只能通过跳板机远程内部服务器,现在需要在跳板机上免密码登陆内部的服务器。

4.1 各个机器上面需要先生成各自的公钥和密码

4.2 跳板机编写脚本和配置文件如下

#!/bin/bash
#================================================
#FileName :expect_ssh.sh
#Author :zhaojiedi
#Description:
#DateTime :-- ::
#Version :V1.
#Other :
#================================================
host_username_password_file=hosts.txt # install expect
rpm -q expect &>/dev/null || yum install -yq expect &>/dev/null # create id_rsa.pub file
pubkey=~/.ssh/id_rsa.pub
if [ ! -e "$pubkey" ] ; then
ssh-keygen -P "" -t rsa -f ~/.ssh/id_rsa
fi
while read host username password ; do
con=${username}"@"${host}
echo $password
expect <<EOF
set timeout
spawn ssh-copy-id $con
expect {
"yes/no" { send "yes\n" ; exp_continue }
"password:" { send "${password}\n"; exp_continue }
}
EOF
done < $host_username_password_file

样例的配置文件是这样的。

[root@centos74 bin]$ cat hosts.txt
172.18.46.6 root oracle

4.3 集群主机免密码配置

上面的跳板机配置免密码登陆都是单向的, 但是对于集群环境我们需要配置任意2个主机的主机信任的。

#!/bin/bash 

# 配置项
# 文件格式是 ip usename password port 中间使用空格分割
host_username_password_file=/root/hosts.txt # 配置是否copy文件到其他目标主机上去,只有第一个执行的主机需要copy,其他不需要的
need_copy_to_other=
src_host="current_host_ip"
#echo $#
if [ "$#" -eq ] ; then
need_copy_to_other=
else
src_host=$
fi # 安装 expect
rpm -q expect &> /dev/null || yum install -yq expect &>/dev/null # 创建 秘钥文件 pubkey=~/.ssh/id_rsa.pub
prikey=~/.ssh/id_rsa if [ ! -e "$pubkey" ] ; then
ssh-keygen -P "" -t rsa -f $prikey &>/dev/null
fi
while read host username password port ; do
if [ -z "$host" ] ; then
continue
fi
printf "%16s=======>%-16s\n" $src_host $host #echo "==============================$host $username $password $port ========================================= "
con=${username}"@"${host}
cmd_with_argv="ssh-copy-id -p $port $con "
#echo $password
expect <<-EOF
set timeout
log_user
spawn -noecho $cmd_with_argv
expect {
"yes/no" { send "yes\n"; exp_continue }
"password:" { send "${password}\n"; exp_continue }
}
EOF
&> /dev/null if [ "$need_copy_to_other" -eq ] ; then
ip a | grep $host &> /dev/null
if [ "$?" -ne ] ; then
#echo "==>复制必要的文件到远程主机($host)上去"
scp -q -p -P $port $host_username_password_file $host:$host_username_password_file
scp -q -p -P $port $ $host:$
#echo "==>在目标主机${host}上执行下"
ssh -f -p $port $con "$0 $host "
fi
fi done < $host_username_password_file
sleep
[root@localhost ~]# cat hosts.txt
192.168.46.151 root oracle
192.168.46.152 root oracle
192.168.46.153 root oracle
192.168.46.154 root oracle
192.168.46.157 root oracle

使用方式

[root@localhost ~]# /root/expect.sh
current_host_ip=======>192.168.46.151
current_host_ip=======>192.168.46.152
current_host_ip=======>192.168.46.153
192.168.46.152=======>192.168.46.151
192.168.46.152=======>192.168.46.152
192.168.46.152=======>192.168.46.153
current_host_ip=======>192.168.46.154
192.168.46.153=======>192.168.46.151
192.168.46.152=======>192.168.46.154
192.168.46.153=======>192.168.46.152
192.168.46.152=======>192.168.46.157
192.168.46.153=======>192.168.46.153
current_host_ip=======>192.168.46.157
192.168.46.154=======>192.168.46.151
192.168.46.153=======>192.168.46.154
192.168.46.154=======>192.168.46.152
192.168.46.153=======>192.168.46.157
192.168.46.154=======>192.168.46.153
192.168.46.154=======>192.168.46.154
192.168.46.154=======>192.168.46.157

Linux两台主机之间建立信任(ssh免密码)的更多相关文章

  1. 在两台服务器之间建立信任关系解决scp,ssh等不用输入密码等问题

    A服务器(client)向B服务(server)SCP,SSH. A服务器:ssh-keygen -t rsa -C "kangzj" 一直回车. cd .ssh vim id_r ...

  2. Linux:两台服务器之间添加信任关系,进行远程操作的时候不需要输入密码

    两台机器之间建立信任关系的步骤: 1. 在机器1上root用户执行ssh-keygen命令,生成建立安全信任关系的证书,直接Enter [root@CentOS64-x64 ~]# ssh-keyge ...

  3. 两台主机之间单向Ping不通的问题

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...

  4. Linux 两台服务器之间传输文件和文件夹

    今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎么快 ...

  5. 多台CentOS服务器下实现SSH免密码登录

    ROOT用户下实现SSH免密码登录 第一步:进入目录/root/.ssh $ cd  /root/.ssh/ 执行以下命令,会在当前目录下生成公钥(id_rsa.pub)/私钥(id_rsa)对 第二 ...

  6. 【原】linux两台服务器之间免密登录方法

    搭建集群机器192.168.0.100和192.168.0.200里,需要两台机器中间相互拷贝文件: 方式一:下载192.168.0.100机器文件到本地,再将本地文件拷贝到B机器 方式二:192.1 ...

  7. 两条命令在Linux主机之间建立信任关系

    ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa //生成当前用户密钥 ssh-copy-id -i /root/.ssh/id_rsa.pub r ...

  8. Linux 两台服务器之间传输文件

    一.scp命令的使用 1.传输文件(不包括目录) 命令格式:scp 源文件路径目录/需要传输的文件 目标主机的用户名@目标主机IP/主机别名:目标主机存储目录 举个例子:scp /root/ceshi ...

  9. 验证两台机器已经建立的ssh互信

    1.expect方法 #!/bin/bash checkTrust() { expect -c ' set timeout 2; spawn ssh $1 "expr 12345678 + ...

随机推荐

  1. 数据结构与STL容器

    1.静态数组 静态数组就是大小固定不能扩展的数组,如C中普通数组.C++11中array. 2.动态数组 动态数组的空间大小在需要的时候可以进行再分配,其代表为vector.由于数组的特点,在位置0插 ...

  2. 关于PHP读取HTTP头的部分

    本文转载自https://my.oschina.net/luoczi/blog/86608 1.关于PHP读取HTTP头的方法 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 ...

  3. android踩坑日记1

    Android四大组件-活动.服务.广播.碎片 情况一 应用场景:定时从服务器获取数据,然后活动或者碎片中根据最新获得的数据,更新UI. 思考: 首先定时,想到定时器,推荐使用系统自带的AlertMa ...

  4. JavaGC学习笔记

    1.简介Java在JVM虚拟机上的垃圾回收(GC)机制,在合适的时间触发垃圾回收,将不需要的内存空间回收释放,避免无限制的内存增长导致的OOM. 1.1 Java堆内存结构Java将堆内存分为3大部分 ...

  5. Python TVTK 标量数据可视化与矢量数据可视化,空间轮廓线可视化

    Python数据可视化分为 标量可视化,矢量可视化,轮廓线可视化 标量又称无向量,只有大小没有方向,运算遵循代数运算法则比如质量,密度,温度,体积,时间 矢量又称向量,它是由大小,方向共同确定的量,运 ...

  6. 在windows系统安装pygame项目

    STEP1: 下载安装程序 访问https://bitbucket.org/pygame/pygame/downloads/,查找与你运行的Python版本匹配的安装程序,如果找不到,可以去https ...

  7. C语言fprintf, fwrite, fscanf, fread混用问题

    int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...

  8. svn提交出现错误 svn: Working copy 'D:\...'locked.

    更新svn内容时出现如下的错误: svn: Working copy 'D:\tools\Workspaces\EclipseForNewSTLJ\javashop\b2c\src\main\weba ...

  9. 6 week work 2

    CSS颜色表示法和颜色表(调色板) 1.用颜色名表示 如:white.red.greenyellow.gold等. 2.用十六进制的颜色值表示(红.绿.蓝) #FF0000或者#F00 3.用rgb( ...

  10. 基本数据类型的包装类(Interger)

    基本数据类型 vs包装类 byte Byte short Short char Character int Integer long Long float Float double Double bo ...