SSH key-gen无密码登录认证脚本

使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成。主要使用ssh-key-gen实现。

  1. 通过 ssh-key-gen 来创建 public and private keys

  2. 使用ssh-copy-id复制public key 到远程主机

  3. 无密码登陆远程主机

但对于大规模集群,人工使用ssh-key-gen生成key,再使用ssh-copy-id显然费时费力。对于N台主机,需要进行N次ssh-key-gen,N*N次ssh-copy-id。

为此,写了一个批量SSH key-gen脚本,脚本包括四个文件:keygen_master.sh、keygen_slave.sh、hosts.conf、slaves.conf

使用方法比较简单。把这四个文件拷贝到主节点上,设置hosts.conf和slaves.conf,然后执行keygen_master.sh即可。

keygen_master.sh在主节点上执行

  1. [root@localhost ~]# cat keygen_master.sh
  2. #!/bin/sh
  3. this="$0"
  4. while [ -h "$this" ]; do
  5. ls=`ls -ld "$this"`
  6. link=`expr "$ls" : '.*-> \(.*\)$'`
  7. if expr "$link" : '.*/.*' > /dev/null; then
  8. this="$link"
  9. else
  10. this=`dirname "$this"`/"$link"
  11. fi
  12. done
  13. # init base path
  14. base=`dirname "$this"`
  15. script=`basename "$this"`
  16. base=`cd "$base"; pwd`
  17. this="$base/$script"
  18. slavesh="keygen_slave.sh"
  19. slavescript="$base/$slavesh"
  20. slaves="$base/slaves.conf"
  21. hosts="$base/hosts.conf"
  22. # install ssh
  23. yum install -y openssh* expect
  24. eval `ssh-agent`
  25. if [ ! -s ~/.ssh/id_dsa ]; then
  26. expect -c "
  27. spawn ssh-keygen -t dsa
  28. expect {
  29. \"*y/n*\" {send \"y\r\"; exp_continue}
  30. \"*key*\" {send \"\r\"; exp_continue}
  31. \"*passphrase*\" {send \"\r\"; exp_continue}
  32. \"*again*\" {send \"\r\";}
  33. }
  34. "
  35. fi
  36. ssh-add $HOME/.ssh/id_dsa # Add private key
  37. # batch ssh
  38. if [ -s $hosts ]; then
  39. for p in $(cat $hosts) #
  40. do
  41. username=$(echo "$p"|cut -f1 -d":") # Get username
  42. ip=$(echo "$p"|cut -f2 -d":") # Get ip
  43. password=$(echo "$p"|cut -f3 -d":") # Get password
  44. id=$HOME/.ssh/id_dsa.pub
  45. echo "ssh-copy-id -i $id $username@$ip -P $password"
  46. # ssh-copy-id
  47. expect -c "
  48. spawn ssh-copy-id -i $id $username@$ip
  49. expect {
  50. \"*yes/no*\" {send \"yes\r\"; exp_continue}
  51. \"*password*\" {send \"$password\r\"; exp_continue}
  52. \"*Password*\" {send \"$password\r\";}
  53. }
  54. "
  55. done
  56. fi
  57. # dispath
  58. if [ -s $slaves ]; then
  59. for p in $(cat $slaves) #
  60. do
  61. username=$(echo "$p"|cut -f1 -d":") # Get username
  62. ip=$(echo "$p"|cut -f2 -d":") # Get ip
  63. password=$(echo "$p"|cut -f3 -d":") # Get password
  64. id=$HOME/.ssh/id_dsa.pub
  65. ssh $username@$ip 'yum install -y openssh*'
  66. echo "scp $slavescript $hosts $username@$ip:~/ -P $password"
  67. # Dispath to clients
  68. expect -c "
  69. spawn scp $slavescript $hosts $username@$ip:~/
  70. expect {
  71. \"*yes/no*\" {send \"yes\r\"; exp_continue}
  72. \"*password*\" {send \"$password\r\"; exp_continue}
  73. \"*Password*\" {send \"$password\r\";}
  74. }
  75. "
  76. # ssh to clients
  77. echo "ssh $username@$ip 'sh $HOME/keygen_slave.sh'"
  78. ssh $username@$ip 'sh $HOME/keygen_slave.sh'
  79. done
  80. fi

keygen_slave.sh在所有从节点执行

  1. [root@localhost ~]# cat keygen_slave.sh
  2. #!/bin/sh
  3. this="$0"
  4. while [ -h "$this" ]; do
  5. ls=`ls -ld "$this"`
  6. link=`expr "$ls" : '.*-> \(.*\)$'`
  7. if expr "$link" : '.*/.*' > /dev/null; then
  8. this="$link"
  9. else
  10. this=`dirname "$this"`/"$link"
  11. fi
  12. done
  13. # init base path
  14. base=`dirname "$this"`
  15. script=`basename "$this"`
  16. base=`cd "$base"; pwd`
  17. this="$base/$script"
  18. hosts="$base/hosts.conf"
  19. echo $base
  20. echo $script
  21. echo $this
  22. echo $hosts
  23. # install ssh
  24. yum install -y openssh* expect
  25. eval `ssh-agent`
  26. if [ ! -s ~/.ssh/id_dsa ]; then
  27. expect -c "
  28. spawn ssh-keygen -t dsa
  29. expect {
  30. \"*y/n*\" {send \"y\r\"; exp_continue}
  31. \"*key*\" {send \"\r\"; exp_continue}
  32. \"*passphrase*\" {send \"\r\"; exp_continue}
  33. \"*again*\" {send \"\r\";}
  34. }
  35. "
  36. fi
  37. ssh-add $HOME/.ssh/id_dsa # Add private key
  38. # batch ssh
  39. if [ -s $hosts ]; then
  40. for p in $(cat $hosts) #
  41. do
  42. username=$(echo "$p"|cut -f1 -d":") # Get username
  43. ip=$(echo "$p"|cut -f2 -d":") # Get ip
  44. password=$(echo "$p"|cut -f3 -d":") # Get password
  45. id=$HOME/.ssh/id_dsa.pub
  46. echo $username
  47. echo $ip
  48. echo $password
  49. echo $id
  50. # ssh-copy-id
  51. expect -c "
  52. spawn ssh-copy-id -i $id $username@$ip
  53. expect {
  54. \"*yes/no*\" {send \"yes\r\"; exp_continue}
  55. \"*password*\" {send \"$password\r\"; exp_continue}
  56. \"*Password*\" {send \"$password\r\";}
  57. }
  58. "
  59. done
  60. fi

hosts.conf中设置所有主机(主节点+从节点),格式为用户名:主机IP:用户密码。

  1. <span style="font-size:14px;">username:master_ip:passwd
  2. username:client1_ip:passwd
  3. username:client2_ip:passwd
  4. #root:localhost:000000</span>

slaves.conf中设置所有从主机,格式同hosts.conf用户名:主机IP:用户密码。

  1. username:client1_ip:passwd
  2. username:client2_ip:passwd
  3. #root:192.168.1.12:000000

批量SSH key-gen无密码登陆认证脚本的更多相关文章

  1. 批量实现SSH无密码登陆认证脚本

    批量实现SSH无密码登陆认证脚本 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-key-ge ...

  2. 批量SSH key-gen无密码登陆认证脚本 附件脚本

    # 批量实现SSH无密码登陆认证脚本 ## 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-k ...

  3. ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs

    ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 第一部分:使用ssh key 实现服务器间的免密码交互登陆 步骤1: 安装openssh-clients [root@001 ...

  4. 18.ssh远程双向无密码登陆

    #ssh远程双向无密码登陆 需求:在192.168.10.100执行ssh 192.168.20.205不需要输入密码直接跳转到205机器 #在192.168.10.100执行命令,我这里使用root ...

  5. ssh 信任关系无密码登陆,清除公钥,批量脚本

    实验机器: 主机a:192.168.2.128 主机b:192.168.2.130 实验目标: 手动建立a到b的信任关系,实现在主机a通过 ssh 192.168.2.130不用输入密码远程登陆b主机 ...

  6. linux下ssh key秘钥登陆远程服务器设置

    本地的用户名需要和ssh服务器的用户名一致 1.在Server服务器上加载私钥文件ssh-add wang_rsa 2.如果系统提示:could not open a connection to yo ...

  7. Linux设置ssh无密码登陆

    最近在折腾Hadoop,要用到主机间无密码登陆,设置的时候遇到了一些问题,这里记录一下. 假设A需要无密码登陆B. 那么首先需要在A上使用ssh-keygen生成id_rsa.pub的公钥,生成时,一 ...

  8. 批量设置ssh无密码登陆脚本

    最近要给集群设置ssh无密码登陆,如果需要手动设置这个无密码登陆,所以在网上找了几个脚本,亲测下面这个好使,并且设置比较简单. 需要用root账户执行,我也是要给root账户设置无密码登陆. 首先我们 ...

  9. ssh和ssh-copy-id以及批量多机无密码登陆详解

    本文主要围绕着ssh服务以及如何通过ssh-copy-id实现无密码登陆. 1. sshd 服务以及配置   2.ssh-copy-id命令的使用以及原理.3.批量多机互相信任. 1. sshd 服务 ...

随机推荐

  1. TypeError: Cannot read property '_t' of undefined (VUE + ElementUI + i18n)

    在使用vue的ElementUI库,在多语言时报错: TypeError: Cannot read property '_t' of undefined 错误是在点菜单栏时随机抛出的,F12抓不到,只 ...

  2. 选择了uniapp开发app

    7月份打算做一简单app,之前公司做app的时候简单用过Dcloud公司的mui,当时由于uniapp刚出来,最终选择了mui.对uniapp的 了解几乎没有. 做app对我来说几乎是零基础的,当然是 ...

  3. 04-kubernetes 资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...

  4. centos7安装samba

    samba是一个实现smb协议的开源软件,为局域网内的不同计算机之间提供文件和打印机共享服务. 1.安装yum groupinstall “file-server” -y 2.配置cp /etc/sa ...

  5. CSS文字,文本常用样式

    CSS文字,文本常用样式 字体属性 font-family 如果电脑没有第一个字体,就切换到下一个 body { font-family: Microsoft YaHei,Helvetica,Aria ...

  6. 深入浅出-iOS程序性能优化

    iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都受不 ...

  7. 2019-2020-6 20199317《Linux内核原理与分析》第六周作业

    第5章  系统调用的三层机制(下) 1  给MenuOS增加命令         首先进入LinuxKernel目录下,用rm -rf menu强制删除当前的menu目录,然后用git clone重新 ...

  8. JS 输出指定范围内的随机数

    /* 自定义函数 */ function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return( ...

  9. 《Windows内核安全与驱动开发》4.1 文件操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...

  10. shell脚本简单例子

    eg: Expect: 1.用环境变量RANDOM随机生成一个100以内的随机数 2.read读取当前输入 3.当前输入对比随机生成的数 4.当两个数相等时跳出苏循环,并计数(比较n次结果才相等) # ...