Ubuntu集群下利用Shell脚本进行SSH免密码登陆

转自http://www.linuxidc.com/Linux/2017-01/140035.htm

  • Ubuntu集群下利用Shell脚本进行SSH免密码登陆
    • ssh-copy-id
    • expect
    • 具体的实现
      • expect在ubuntu下的安装
      • 脚本代码
    • 结论

如果我们有一个服务器的集群,在这个集群下面需要为集群的每一个节点实现SSH的免密码,其实是一件非常繁琐的工作。此时,我们可以借助Shell脚本方便的实现。

在开始看具体实现之前,我们先来看一下过程中的要点。分别为ssh-copy-id命令和expect命令

ssh-copy-id

ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。

expect

expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。

我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。

具体的实现

首先,我们需要在Ubuntu下面安装expect。

expect在ubuntu下的安装

使用以下代码检测expect是否已经安装

ls /usr/bin | grep expect

如果显示为空,则使用以下命令安装

sudo apt-get install tcl tk expect

脚本代码

下面给出脚本代码,然后稍作说明。在执行下面的脚本之前必须在本机通过ssh-keygen -t rsa指令生成秘钥。

#!/bin/sh

SERVERS="localhost anode1 anode2 anode3"
PASSWORD=123456

auto_ssh_copy_id() {
    expect -c "set timeout -1;
        spawn ssh-copy-id $1;
        expect {
            *(yes/no)* {send -- yes\r;exp_continue;}
            *assword* {send -- $2\r;exp_continue;}
            eof        {exit 0;}
        }";
}

ssh_copy_id_to_all() {
    for SERVER in $SERVERS
    do
        auto_ssh_copy_id $SERVER $PASSWORD
    done
}

ssh_copy_id_to_all

$SERVERS里面存放了所有需要进行ssh免密码登录授权的机器列表,用空格分开。

另外的一个重点就是auto_ssh_copy_id函数这个函数负责对一台机器进行ssh免密码登录授权。它通过expect -c指令在命令行里面执行了一串命令。

spawn相当于一个程序壳,通过它,我们在expect中执行了ssh-copy-id指令。后面的参数$1则是调用方传入的需要进行ssh免密码登录的机器名。

后续的expect块中则是对ssh-copy-id指令可能产生的响应进行匹配,并决定后续的动作。如果响应中包含”(yes/no)”则输出yes+回车。后面的exp_continue指令表示继续进行下一个结果的匹配。如果响应中包含”assword”则输出密码+回车。

结论

使用上面的代码,我们方便的实现了本机到集群各节点间的ssh登录,同时也体会到了Shell脚本的强大之处。有时间好好学习研究一番。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 虽然有一些自动化安装的工具,但是功能越多,越专业的工具,可能也需要越高的学习成本,而我们并非专业运维,但是又必须做...
    liuchengxu阅读 6,678评论 0 8
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 5,481评论 0 0
  • 如果本机公钥和私钥是有密码的,需要重新生成,并且不去设置密码,否者免密登陆的时候, 远程主机不需要密码了,但是每次...
    你说你要一场阅读 3,940评论 0 0
  • Hadoop HA集群搭建文档.............................................
    钟敏_1788阅读 5,371评论 0 0
  • Linux习惯问题: 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。ctrl + ...
    光着脚的鞋阅读 10,021评论 0 16

友情链接更多精彩内容