Linux命令ssh-copy-id (r10笔记第21天)

在N多年前,搭建Oracle RAC环境的时候,其中有一项非常艰巨的任务就是配置节点服务器的互信关系,每次到了这个部分的时候就有点晕,因为文件需要在两个节点间拷过来,拷过去。 每次到了这个部分,就需要打开我的攻略笔记,然后严格按照上面的步骤来完成。到了OCM考试的时候,当时Oracle是提供了一个建立互信关系的脚本,直 接运行即可。搭建的过程省事不少。到了11g的RAC搭建中,在检查项中有一个就是建立互信关系,只需要在界面上点击即可完成。可见互信关系的建立过程是 越来越简化了。 当然回到工作环境中,如果两台服务器需要建立互信关系,那么需要做的就是拷贝秘钥信息,这个工作就得手工来完成,有时候感觉真是麻烦,但是又无可奈何。 一般建立单向信任关系的步骤如下: 1)检查是否有秘钥生成,如果没有则使用ssh-keygen -t rsa来生成即可。 2)拷贝id_rsa.pub的信息,稍后使用。 3) ssh连接到目标服务器,然后到.ssh/authorized_keys文件中添加拷贝的id_rsa.pub的内容即可 4)退出当前窗口,重新登录验证,是否可以无密码通信 最近还是看《Linux大棚》里面有讲到ssh-copy-id这个神器,看完之后有一种全然一新的感觉,感觉我们之前的处理似乎还是有些老套了。 ssh-copy-id可以直接运行这一个命令即可完成上面的步骤,所以这个命令确实是个好东西,难得的是这个命令本身是个shell脚本,所以索性拿来 学学。 脚本的内容如下:

#!/bin/sh

    # Shell script to install your public key on a remote machine

    # Takes the remote machine name as an argument.

    # Obviously, the remote machine must accept password authentication,

    # or one of the other keys in your ssh-agent, for this to work


    ID_FILE="${HOME}/.ssh/id_rsa.pub"



    if [ "-i" = "$1" ]; then

      shift

      # check if we have 2 parameters left, if so the first is the new ID file

      if [ -n "$2" ]; then

        if expr "$1" : ".*\.pub" > /dev/null ; then

          ID_FILE="$1"

        else

          ID_FILE="$1.pub"

        fi

        shift # and this should leave $1 as the target name

      fi

    else

      if [ x$SSH_AUTH_SOCK != x ] ; then

        GET_ID="$GET_ID ssh-add -L"

      fi

    fi



    if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then

      GET_ID="cat ${ID_FILE}"

    fi



    if [ -z "`eval $GET_ID`" ]; then

      echo "$0: ERROR: No identities found" >&2

      exit 1

    fi



    if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then

      echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2

      exit 1

    fi



 { eval "$GET_ID" ; } | ssh $1 "umask  077; test -d ~/.ssh || mkdir ~/.ssh ; cat >>  ~/.ssh/authorized_keys && (test -x /sbin/restorecon &&  /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1  || true)" || exit 1



    cat <<EOF

    Now try logging into the machine, with "ssh '$1'", and check in:



 .ssh/authorized_keys



    to make sure we haven't added extra keys that you weren't expecting.



    EOF	

其实看完之后,发现里面确实有不少的内容,命令格式,新的命令都值得学习。 shift是个蛮有意思的命令,可以在不知道位置变量个数的情况下,还能逐个把参数一一处理。

restorecon命令用来恢复SELinux文件属性即恢复文件的安全上下文。 整个脚本中花了大篇幅来处理输入参数,可以手工指定秘钥文件,还有扩展名补全的功能。比如调用脚本的方式如下: ssh-copy-id -i aaa test@test.com 这种情况下,脚本会把aaa自动补全扩展名,脚本就会查找aaa.pub的秘钥文件。 里面最核心的是下面的一句,运行后会提示输入密码。 $ { eval "$GET_ID" ; } | ssh 10.127.133.125 "umask 077;test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)" || exit 1 oracle@10.127.133.125's password: 可以看到整个脚本有很多需要考虑的细节,值得玩味。 当然大道至简,这个脚本的本质就是传输id_rsa.pub并不会自动帮你去生成id_rsa.pub,最核心的功能就是把秘钥信息写入.ssh/authorized_keys中。 所以整个过程的简化版思路就是下面的一个类似的命令形式。 $ echo "aaaaa"|ssh 10.127.133.125 "cat" oracle@10.127.133.125's password: aaaaa echo "aaaaa"会输出秘钥信息,然后通过管道作为ssh到目标端的参数值调用 所以这个过程也完全可以自己定义命令来完成。 明白了这些,很多工具就会脱离开神圣的外衣,而对于我们来说,明白了核心的部分,就需要学习哪些场景没有考虑周到,不断去补充,不断完善。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

Oracle 12.2新特性掌上手册 - 第三卷 Core Improvements

编辑手记:Oracle 12.2 在内核上有许多创造性的改进,这些改进让数据库的操作更加高效便捷,同时一些面向智能运维和大数据的改进,则迈出了云和大数据时代的重...

379120
来自专栏大闲人柴毛毛

三分钟理解“抽象工厂模式”——设计模式轻松掌握

实际问题: 使用工厂模式写一个程序,既能使用SqlServer访问User表,又能使用Access访问User表。 ? 1.创建对User表进行访问的接口Use...

44560
来自专栏数据和云

辞旧迎新:2018年的分区你们建了吗?

各位同学,大家好! 转眼2017年就要结束了,在这过去的一年,我们有遇到困难解决不了的苦恼,亦有处理了棘手问题的快乐,还有在云和恩墨大讲堂里得到云和恩墨舵主以及...

35990
来自专栏程序猿

SQLmap命令的介绍

SQLmap这个工具的使用。(结尾有彩蛋) URL---> 判断注入的参数, 判断是使用的那种SQL注入 识别出那种数据库 根据用户的选择,读出数据 五种注入模...

36130
来自专栏Ryan Miao

oracle分页

sqlStmt = sqlCon.createStatement(); strSQL sql="select * from (select rownum r...

50470
来自专栏机器学习AI算法工程

关于海量数据处理分析的经验总结

笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复杂的任务。原因有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。如果说有10...

48670
来自专栏程序猿

oracle 密码忘记怎么办?

打开sqlplus, 输入: connect as sysdba 回车,显示连接。 修改密码: alter user sys identifited by ...

27550
来自专栏程序猿

Oracle_12C的新特性

这里我们来领略下Tom眼中的12个特性增强: ? #1 Even better PL/SQL from SQL, 直接在SQL中嵌入PL/SQL对象并运行,猜测...

32190
来自专栏数据和云

深入内核丨12C 新特性之 TOP - N 频率柱状图原理和算法

作者简介 ? 黄玮(Fuyuncat) 资深 Oracle DBA,致力于数据库底层技术的研究,其作品获得广大同行的高度评价。 个人网站 www.HelloDB...

306120
来自专栏程序猿

【oracle】存储过程

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as...

37570

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励