共计 2219 个字符,预计需要花费 6 分钟才能阅读完成。
Ubuntu 集群下利用 Shell 脚本进行 SSH 免密码登陆
- 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 脚本的强大之处。有时间好好学习研究一番。
下面关于 SSH 相关的文章您也可能喜欢,不妨参考下:
CentOS 7.1 下 SSH 远程登录服务器详解 http://www.linuxidc.com/Linux/2016-03/129204.htm
CentOS 6.5 之 SSH 免密码登录配置 http://www.linuxidc.com/Linux/2016-10/136200.htm
Ubuntu 14.04 下安装 Samba 及 SSH 服务端的方法 http://www.linuxidc.com/Linux/2015-01/111971.htm
Ubuntu 14.04 安装 SSH http://www.linuxidc.com/Linux/2016-12/137908.htm
提高 Ubuntu 的 SSH 登陆认证速度的办法 http://www.linuxidc.com/Linux/2014-09/106810.htm
CentOS6.4 之图解 SSH 无密码验证双向登陆配置 http://www.linuxidc.com/Linux/2016-06/132219.htm
如何为 Linux 系统中的 SSH 添加双重认证 http://www.linuxidc.com/Linux/2014-08/105998.htm
在 Linux 中为非 SSH 用户配置 SFTP 环境 http://www.linuxidc.com/Linux/2014-08/105865.htm
Linux 上 SSH 服务的配置和管理 http://www.linuxidc.com/Linux/2014-06/103627.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/140035.htm