zoukankan      html  css  js  c++  java
  • 利用ssh-copy-id复制公钥到多台服务器

    在做系统运维的时候,可能以免密码通过ssh方式登录到远程主机,这时就首先需要将本机的公钥复制到远程主机,用ssh-copy-id命令可以轻松做到。

    如果没有生成密钥对,要先生成密钥,再将公钥复制到远程主机,usernaem是远程主机的用户名,host是远程主机的ip地址或域名

    #生成密钥
    ssh-keygen -t rsa
    #复制公钥到远程主机 ssh-copy-id username@host

    对于单台远程主机,直接使用命令就可以了,但如果有很多台主机,需要一台台操作,就费时费力了。那么有什么好办法,能够一次性将公钥复制到所有主机呢?要解决这个问题,要自动处理在执行ssh-copy-id命令时两处需要手工介入的过程。

    一是在看到类似如下提示时,要输入”yse“进行确认。

    The authenticity of host '10.10.5.133 (10.10.5.133)' can't be established.
    RSA key fingerprint is SHA256:anhO4ihOzEsun0zDRNAu8Wew9Bxntr7Di6qpJVAnXFQ.
    Are you sure you want to continue connecting (yes/no)?
    

    二是需要输入远程主机的密码

    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ubuntu/.ssh/id_rsa.pub"
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    Warning: Permanently added '10.10.5.133' (RSA) to the list of known hosts.
    root@10.10.5.133's password: 
    

     解决第一个问题,可以修改配置文件或运行ssh-copy-id命令加ssh的相关参数。

    # -o StrictHostKeyChecking=no,连接新主机时,不进行公钥确认
    ssh-copy-id -o StrictHostKeyChecking=no root@10.10.5.133

    或者在当前用户目录的.ssh/config文件,添加如下配置项,如果.ssh目录没有config文件,可自行创建。

    StrictHostKeyChecking=no
    

    接着来解决第二个问题,安装sshpass命令,在ubuntu中可以用apt-get命令直接安装,在Centos下,请google搜索安装方式,在这里就不作说明了。

    apt-get install sshpass
    

    通过安装好的sshpass命令,运行下面命令就能无需手工介入将ssh公钥复制到远程主机。

    sshpass -p 'YOUR_PASSWORD' ssh-copy-id -o StrictHostKeyChecking=no root@10.10.5.133
    

    如果使用修改配置文件的方式,可用下面的命令。

    sshpass -p 'YOUR_PASSWORD' ssh-copy-id root@10.10.5.133
    

     在解决了上面的两个问题之后,接下来的事情就简单了, 可以将远程主机的域名或IP地址记录在一个文件中,比如记录在remote-hosts文件中,运行下面的脚本就能批量的将公钥复制到远程主机中。

    for host in $(cat remote-hosts)
    do
        sshpass -p 'YOUR_PASSWORD' ssh-copy-id -o StrictHostKeyChecking=no root@${host}
    done
    

    注:上面的脚本是远程主机的密码都是相同,在命令行将密码硬编码写死,如果每台主机的密码不一样,可以将密码记录在remote-hosts文件中,通过cut命令分割,可以分别获得主机的IP地址或域名和对应的密码,当然如果ssh的端口号不是默认的22,也可以一并记录。如下列格式:

    10.10.10.10:2222:YOURPASSWORD
    

    可将上面的脚本稍做修改:

    因为ssh-copy-id使用非默认端口时,需要加双引号,没有找到地的办法,取了个巧,先将整个命令放至一个临时文件。再执行该临时文件,执行之后,再删除。

    for host in $(cat remote-hosts)
    do
       ip=$(echo ${host} | cut -f1 -d ":")
       port=$(echo ${host} | cut -f2 -d ":")
       password=$(echo ${host} | cut -f3 -d ":")
      arg=$(echo -p ${port} -o StrickHostKeyChecking=no root@${ip})
      echo sshpass -p ${password} ssh-copy-id '"'${arg}'"' >> tmp.sh
    done
    sh tmm.sh
    rm -f tmp.sh
     
  • 相关阅读:
    Confluence无法打开编辑器,一直在转圈
    Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别
    C#读取物理网卡信息及其对应的IP地址
    【Xamarin报错】visual studio android 模拟器部署卡住
    【Xamarin报错】AndroidManifest.xml : warning XA0101: @(Content) build action is not supported
    【Xamarin报错】 COMPILETODALVIK : UNEXPECTED TOP-LEVEL error java.lang.OutOfMemoryError: Java heap space
    【Xamarin报错】libpng warning : iCCP: Not recognizing known sRGB profile that has been edited
    子窗口调用父窗口
    Windows Phone 8.1 多媒体(3):音乐
    Windows Phone 8.1 多媒体(1):相片
  • 原文地址:https://www.cnblogs.com/panchong/p/6027138.html
Copyright © 2011-2022 走看看