既然可以在Windows上安装一个客户端软件(比如PuTTY)去登录远程的Linux,那么在Linux上是否也可以登录另一台Linux呢?当然可以,只是在Linux上也需要安装一个客户端软件。CentOS自带的客户端软件叫作openssh-clients。
要想检测Linux上是否已安装客户端软件,需要运行如下命令:
# ssh -V
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018
如果已安装,则会显示OpenSSH的版本信息。如果没有显示类似的信息,请运行如下命令安装:
# yum install -y openssh-clients
要完成本实验,还需要有一台Linux机器,你可以按照2.2节再安装一台CentOS。但阿铭觉得那样做太浪费时间,其实还有一个更好的方法——克隆虚拟机。
首先,关闭正在运行的CentOS,正确的关机命令是
shutdown -h now
或者
init 0
。然后在左侧对应的虚拟机名字上单击鼠标右键,选择“管理”,再选择“克隆”,如图3-5所示。
图3-5 克隆
此时会出现“克隆向导”界面。直接单击“下一步”按钮,再单击“下一步”按钮,会出现“克隆类型”对话框,这里采用默认值即可,即选择“创建链接克隆”,这种类型会节省空间,比较方便。继续单击“下一步”按钮,你可以设定克隆虚拟机的名称和保存的路径。接着单击“完成”和“关闭”按钮,最终完成CenOS 8的克隆。此时,不管是在左侧“我的电脑”下面还是在右侧“选项卡”,都多出来一个克隆后的CentOS 8虚拟机。
把两台CentOS 7全部启动。先登录克隆的虚拟机,输入命令
dhclient
,让这台新克隆的CentOS 8也自动获取一个IP地址。再运行
ip addr
命令,可以看到获取到的IP地址为192.168.72.129,使用2.3.2节的方法给这台CentOS 8也配置一个静态IP地址。
为了便于区分两台CentOS 8,下面阿铭教你如何设置主机名。我们不妨给第一台起个主机名为aminglinux-128,第二台为aminglinux-129。请在第一台CentOS 8上运行如下命令:
# hostnamectl set-hostname aminglinux-128
可以使用快捷键Ctrl+D退出当前终端,然后再登录一次,就会发现命令行左边的前缀有所变化了。使用同样的方法,将第二台CentOS 8的主机名设置为aminglinux-129。
使用前面的方法,通过PuTTY远程登录aminglinux-128,然后在这台机器上执行如下命令:
# ssh root@192.168.72.129 // 第一次登录对方机器,有一个提示
The authenticity of host '192.168.188.129 (192.168.72.129)' can't be established.
ECDSA key fingerprint is 26:e3:97:e7:bb:ae:17:33:ea:aa:0c:5f:37:0e:9e:fa.
Are you sure you want to continue connecting (yes/no)
这里我们输入yes,然后回车,又出现一个如下的警告,它的意思是保存了192.168.72.129这台机器的信息:
Warning: Permanently added '192.168.72.129' (ECDSA) to the list of known hosts.
root@192.168.72.129's password:
然后输入192.168.72.129的root密码后,成功登录aminglinux-129。
命令中符号
@
前面的
root
表示要以远程机器哪个用户的身份登录。我们可以省略
root@
,即写成
ssh 192.168.72.129
,它也表示以root用户的身份登录。这个并不是固定的,取决于当前系统的当前用户是谁。我们可以使用如下命令查看当前用户:
# whoami
root
也可以写成:
# who am i
root pts/1 2019-12-27 07:06 (192.168.72.128)
从这两个命令的显示结果可以看出它们的区别:一个是简单显示,一个是复杂显示。后者不仅可以显示当前用户名,还可以显示登录的终端、登录时间以及从哪里登录。
既然PuTTY支持使用密钥验证的方式登录Linux机器,那么Linux下的客户端软件也是支持的。下面请跟着阿铭一步一步来操作。
客户端生成密钥对
假如aminglinux-128为客户端(以下简称128),aminglinux-129为要登录的机器(以下简称129)。首先,把刚刚登录的129退出来,直接使用Ctrl+D快捷键即可。然后在128上执行如下命令:
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
这个命令用来生成密钥对。首先,它让我们定义私钥的存放路径,默认路径为 /root/.ssh/ id_rsa。这里采用默认值即可,直接回车,此时会显示如下信息:
Enter passphrase (empty for no passphrase):
然后它让我们定义私钥的密码,可以留空,直接回车即可,此时会显示如下信息:
Enter same passphrase again:
此时它让我们再一次输入密码,输入然后回车,此时会显示如下信息:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
57:15:10:d6:8a:ed:79:83:0b:fc:d7:21:52:5b:ba:83 root@aminglinux-128
The key's randomart image is:
+--[ RSA 2048]----+
| ++o. |
| . .. |
| o.. |
| ..o. . |
| S....o+ |
| .o.++o. |
| ooooo.|
| Eoo. .|
| .. |
+-----------------+
最终生成了密钥对,你可以在 /root/.ssh/ 目录下找到公钥(id_rsa.pub)和私钥(id_rsa)。
把公钥复制到要登录的机器上
首先,我们查看128上公钥的内容,此时运行如下命令:
# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiAUXQihX9pa1oxml6xRjZhjTRCU+QMHUGXU34Q6gBeK/8Qm0hUqPfyASXbV2y6hKH4MHfX4zQcpnkeTgyeIFuKAxoEX98mx8r4owB7X490CH+H8JCRsM9FYlAsbH+kvdIa+sNTMqD5jEY5dh+gNINDDNJiw250cYG9Pe8Y+5slazPYrC0tjWz+AnXhJ1//r9z077rxEMJ1jHZdEn62hIou46i8xny+znJScSeW0uJHTgeX5EbXrArgSUOXyubtsGrov83dSUa39Kfyk4HvXU0azYI8S3h6ZxUOed0dYmic4EMd5VxYPnrgNEgTCRlP3hx/sOCCr0HSWtv+MvREkGd root@aminglinux-128
将这些字符串全部复制,然后粘贴到129上的文件 /root/.ssh/authorized_keys里。若之前已经创建过这个文件,并且已经粘贴过PuTTY的公钥,则需要另起一行粘贴128的公钥。在129上执行如下命令:
# vi /root/.ssh/authorized_keys
如果有内容,可以按字母键G把光标定位到文件末尾,然后输入o进入编辑模式(这里使用的命令和之前有所不同,请先跟着阿铭操作)。单击鼠标右键即可粘贴128的公钥。然后按Esc键,输入:wq,再回车。如果你之前并没有设置PuTTY的公钥,请继续执行以下命令:
# chmod 600 /root/.ssh/authorized_keys
登录Linux
在128上执行如下命令:
# ssh 192.168.72.129
此时不再提示我们输入密码,就可以直接登录到129了。这样就可以实现Linux通过密钥验证的方式登录Linux。如果你在生成密钥对时设置了密码,那么这里也会提示你输入密钥密码。为了方便跨机器执行命令,这里我们特意不设置密钥的密码(后面会用到)。
使用ssh-copy-id
Linux系统里还有一种更方便实现密钥认证的方法。这次阿铭要让129通过密钥认证登录128。在129上执行如下命令:
# ssh-keygen
# ssh-copy-id root@192.168.72.128
它会提示让我们输入128的root密码,只要输入对了对方服务器的密码就完成了密钥认证。再次尝试ssh登录128,此时就不再提示我们输入密码,可以直接登录到129了。