• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用使用shell脚本实现ssh免密登录

武飞扬头像
碧蓝幻想
帮助4

目录

1.expect命令:可以在外输入,某些命令执行后弹出的输入提示

2.使用expect命令来创建本地的公钥文件

3.复制ssh的公钥文件到各个主机上:

4.完整的shell脚本:


1.expect命令:可以在外输入,某些命令执行后弹出的输入提示

  1.  
    spawn shell 命令程序
  2.  
    expect "捕获到shell 命令程序执行之后输出的字符串"
  3.  
    send "发送给 shell 命令程序的字符串"
  1.  
    [root@localhost .ssh]# ssh-keygen -t rsa -b 1024
  2.  
    Generating public/private rsa key pair.
  3.  
    Enter file in which to save the key (/root/.ssh/id_rsa):
  4.  
    /root/.ssh/id_rsa already exists.
  5.  
    Overwrite (y/n)?
  1.  
    /usr/bin/expect << eof
  2.  
     
  3.  
    spawn ssh-keygen -t rsa -b 1024
  4.  
     
  5.  
    # 开始进连续捕获
  6.  
    # 获取“Overwrite (y/n)?”的提示行,输入“y”表示同意(其中\n是换行符)
  7.  
    expect {
  8.  
    ".ssh/id_rsa)" { send "\n"; }
  9.  
    "Overwrite (y/n)?" { send "y\n"; }
  10.  
    }
  11.  
    # 结束捕获
  12.  
    eof

2.使用expect命令来创建本地的公钥文件

  1.  
    create_ssh_pub(){
  2.  
    echo "生成本地ssh公钥"
  3.  
    /usr/bin/expect << eof
  4.  
    # 设置捕获字符串后,期待回复的超时时间
  5.  
    set timeout 30
  6.  
     
  7.  
    spawn ssh-keygen -t rsa -b 1024
  8.  
     
  9.  
    ## 开始进连续捕获
  10.  
    expect {
  11.  
    ".ssh/id_rsa)" { send "\n"; exp_continue }
  12.  
    "Overwrite (y/n)?" { send "y\n"; exp_continue }
  13.  
    "no passphrase):" { send "\n"; exp_continue }
  14.  
    "passphrase again:" { send "\n"; exp_continue }
  15.  
    }
  16.  
    eof
  17.  
    }
  18.  
    if [ ! -f /root/.ssh/id_rsa.pub ];then
  19.  
    create_ssh_pub
  20.  
    fi
学新通

3.复制ssh的公钥文件到各个主机上:

我的shell脚本在本机master上

  1.  
    # 定义复制ssh公钥方法
  2.  
    copy_ssh(){
  3.  
    echo "复制公钥到对应的主机上"
  4.  
    /usr/bin/expect << eof
  5.  
    # 设置捕获字符串后,期待回复的超时时间
  6.  
    set timeout 30
  7.  
     
  8.  
    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
  9.  
     
  10.  
    ## 开始进连续捕获
  11.  
    expect {
  12.  
    "connecting (yes/no)?" { send "yes\n"; exp_continue }
  13.  
    "s password:" { send "${ssh_passwd}\n"; exp_continue }
  14.  
    }
  15.  
    eof
  16.  
    }
  17.  
    for name in ${ssh_networkname[*]};do
  18.  
    timeout 5 ssh root@${name} "echo ${name}: 'This is success!'"
  19.  
    if [[ $? -ne 0 ]];then
  20.  
    echo "复制文件到: ${name}"
  21.  
    copy_ssh root ${name} > /dev/null
  22.  
    fi
  23.  
     
  24.  
    done
学新通

4.完整的shell脚本:

  1.  
    #! /bin/bash
  2.  
     
  3.  
    ssh_hosts=(192.168.178.101 192.168.178.151 192.168.178.201)
  4.  
    ssh_networkname=(master node1 node2)
  5.  
    ssh_passwd=110119
  6.  
     
  7.  
    # 定义修改/etc/hosts文件的方法
  8.  
    echo "开始修改地址映射"
  9.  
     
  10.  
    for ((i=0;i<${#ssh_hosts[*]};i ));do
  11.  
    sed -i '/^'"${ssh_hosts[$i]}"'/d' /etc/hosts
  12.  
    echo "尝试连接: ${ssh_networkname[$i]}"
  13.  
    timeout 5 ssh root@${ssh_networkname[$i]} "echo ${ssh_networkname[$i]}: 'This is success!'"
  14.  
    if [[ $? -ne 0 ]];then
  15.  
    echo "添加地址映射:${ssh_hosts[$i]} ${ssh_networkname[$i]}"
  16.  
    echo "${ssh_hosts[$i]} ${ssh_networkname[$i]}" >> /etc/hosts
  17.  
    fi
  18.  
    done
  19.  
     
  20.  
    expect -v
  21.  
    if [ `echo $?` -ne 0 ];then
  22.  
    echo "安装expect命令"
  23.  
    yum install -y expect
  24.  
    fi
  25.  
    create_ssh_pub(){
  26.  
    echo "生成本地ssh公钥"
  27.  
    /usr/bin/expect << eof
  28.  
    # 设置捕获字符串后,期待回复的超时时间
  29.  
    set timeout 30
  30.  
     
  31.  
    spawn ssh-keygen -t rsa -b 1024
  32.  
     
  33.  
    ## 开始进连续捕获
  34.  
    expect {
  35.  
    ".ssh/id_rsa)" { send "\n"; exp_continue }
  36.  
    "Overwrite (y/n)?" { send "y\n"; exp_continue }
  37.  
    "no passphrase):" { send "\n"; exp_continue }
  38.  
    "passphrase again:" { send "\n"; exp_continue }
  39.  
    }
  40.  
    eof
  41.  
    }
  42.  
    if [ ! -f /root/.ssh/id_rsa.pub ];then
  43.  
    create_ssh_pub
  44.  
    fi
  45.  
     
  46.  
     
  47.  
    # 定义复制ssh公钥方法
  48.  
    copy_ssh(){
  49.  
    echo "复制公钥到对应的主机上"
  50.  
    /usr/bin/expect << eof
  51.  
    # 设置捕获字符串后,期待回复的超时时间
  52.  
    set timeout 30
  53.  
     
  54.  
    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
  55.  
     
  56.  
    ## 开始进连续捕获
  57.  
    expect {
  58.  
    "connecting (yes/no)?" { send "yes\n"; exp_continue }
  59.  
    "s password:" { send "${ssh_passwd}\n"; exp_continue }
  60.  
    }
  61.  
    eof
  62.  
    }
  63.  
    for name in ${ssh_networkname[*]};do
  64.  
    timeout 5 ssh root@${name} "echo ${name}: 'This is success!'"
  65.  
    if [[ $? -ne 0 ]];then
  66.  
    echo "复制文件到: ${name}"
  67.  
    copy_ssh root ${name} > /dev/null
  68.  
    fi
  69.  
     
  70.  
    done
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfccbja
系列文章
更多 icon
同类精品
更多 icon
继续加载