菜鸟玩云计算之七:Ubuntu 之 ssh 无密码登录

菜鸟玩云计算之七:Ubuntu 之 ssh 无密码登录

2012-10-30 created

2012-11-1 last updated

当超过3台机器搞到一起, 管理起来就会陷入混乱不堪. 因此需要证书登录的方式来管理服务器集群. master节点可以直接ssh登录到数据节点. 控制节点可以直接登录到被控制的节点.借用C/S的概念, 客户机需要安装openssh-client, 服务器需要安装openssh-server.其实我们很快会分布清楚哪些是服务,哪些是客户. 因此所有机器上都安装openssh,你可以按下面的命令检查是否安装了它们:

(car@A:~$ 意思是用户名为car, 机器名为A, 当前目录为/home/car)

car@A:~$ apt-cache policy openssh-client

car@A:~$ apt-cache policy openssh-server

你也可以直接安装它们:

car@A:~$ sudo apt-get install openssh-client

car@A:~$ sudo apt-get install openssh-server

另外需要安装一个ssh无交互式密码登陆的软件sshpass, 这样我们就可以把密码写到命令行里. 从而使无人工干预的脚本安装过程成为可能.

car@A:~$ sudo apt-get install sshpass

安装完毕之后, 你可以在A访问任何另外一台B.

car@A:~$ sshpass -p abc123 ssh car@B

其中:

  car是B的用户名, 我们这里假设A, B用户名都是car.

  abc123是B上的car的密码.

借用这个技术, 你可以轻松登录每台机器而不需要交互式地输入密码. 但这绝对是不安全的, 这个仅仅是安装阶段的脚本.有了上面的准备后, 下面开始实践ssh证书登录方式:

ssh证书登录方式

假设我们想要在A访问另外一台B, 于是我们需要在A上生成公钥密钥对(ssh-keygen).然后把A的公钥拷贝到B上, 在B上把A的公钥(id_rsa.pub.A)加入到B的某个用户(car)的主目录下的authorized_keys文件里, 然后在A上就可以直接登录B了(以car用户登录B).

  /home/car/.ssh/authorized_keys

1) 在A上生成公钥密钥对

car@A:~$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

或:

car@A:~$ ssh-keygen

可以看到下面2个文件生成了.

/home/car/.ssh/id_rsa

/home/car/.ssh/id_rsa.pub

2) 把A的公钥id_rsa.pub拷贝到B机器上

car@A:~$ scp ./.ssh/id_rsa.pub car@B:~/id_rsa.pub.A

其中B是IP地址, 也可以是机器名, 但是需要在A的/etc/hosts增加一项, 如:

...

192.168.63.101  B

...

3) 从A登录到B

car@A:~$ sshpass -p abc123 ssh car@B

4) 添加id_rsa.pub.A到B的~/.ssh/authorized_keys里

car@B:~$ cat ./id_rsa.pub.A ./.ssh/authorized_keys

car@B:~$ exit

2,3,4步可以整合为一步:

# ssh-copy-id car@B

5)重新在A里以证书方式登录B, 可以看到再不需要密码了.

car@A:~$ ssh car@B

6)假设你还有C,D,E,F...等机器也需要登录B, 只要把在A上生成的私钥文件id_rsa拷贝到相应的机器上就可以了.

比如我们还需要在C上登录B:

# 拷贝A的私钥到C

car@A:~$ sshpass -p abc123 scp ./.ssh/id_rsa car@C:~/id_rsa.A

# 登录到C

car@A:~$ sshpass -p abc1234 ssh car@C

# 删除C的证书并重建证书 (任何时候删除一个机器上的.ssh证书都不是可怕的事情, 但是一旦证书体系弄好之后, 删除了个机器上的证书会导致整个系统无法正常工作. 因此维护一套严格测试的脚本,以能在任何时候恢复整个云计算环境的证书体系是至关重要的)

car@C:~$ sudo rm -r ./.ssh/

# 重建C的证书

car@C:~$ ssh-keygen

一路回车

# 把A的私钥放置到C的.ssh目录下

car@C:~$ sudo mv ./id_rsa.A ./.ssh/

# 现在可以从C上远程ssh登录B了, 当然需要指定证书名称: id_rsa.A

car@C:~$ ssh -i ./.ssh/id_rsa.A car@B

# 此时回出现恼人的提示, 以确认你是否把B的IP加入到 .ssh/known_hosts,为去除这个(yes/no)的提示, 你既可以在C的/etc/ssh/ssh_config里面更改配置为:

...

StrictHotKeyChecking no

...

# 也可以:

car@C:~$ ssh -o StrictHotKeyChecking=no -i ./.ssh/id_rsa.A car@B

这样就不会有提示了(-o StrictHotKeyChecking=no 选项起了作用).

7)如何以B的root用户直接远程ssh登录到B:

比如在A上, 我们想登录到B的时候是root用户.

# 切换到root@B, 给root设置密码:

car@B:~$ sudo -s

2次输入相同的密码

# 看看/root下面的.ssh里有啥, 没有就ssh-keygen创建一个:

root@B:~$ ls /root/.ssh

# 把A上的公钥id_rsa.pub拷贝到B, 然后登录到B,id_rsa.pub.A加入到/root/.ssh/authorized_keys里

car@A:~$ sshpass -p abc123 scp ./.ssh/id_rsa.pub car@B:~/id_rsa.pub.A

car@A:~$ sshpass -p abc123 car@B

car@B:~$ sudo cat ./id_rsa.pub.A >> /root/.ssh/authorized_keys

# 然后回到A, 此时就可以远程直接登录到B(以root用户)

car@A:~$ ssh root@B

8)注意:

a. 私钥文件id_rsa.A是不能随意发布的, 一般需要设置密码. 不在本文讲述范围.

b. 本文虽然混合大小写, 你应该任何时候只用小写字母.

c. 本文中凡是出现机器名的地方, 在实践中一律应改为机器的IP地址.

d. 当ssh car@B时出现错误:

Agent admitted failure to sign using the key

在A上运行命令:

# ssh-add



你可能感兴趣的:(菜鸟玩云计算之七:Ubuntu 之 ssh 无密码登录)