第 3 章 远程登录Linux系统

第 3 章 远程登录Linux系统

作者:李世明

前腾讯高级运维工程师

Linux主要应用于服务器领域,而服务器不可能像PC机那样放在办公室,它们是放在IDC机房的,所以阿铭平时登录Linux系统都是通过网络远程登录的。

Linux系统通过sshd服务实现远程登录功能。sshd服务默认开启了22端口,当我们安装完系统时,这个服务已经安装,并且是开机启动的。所以,我们不需要额外配置什么就能直接远程登录Linux系统。sshd服务的配置文件为 /etc/ssh/sshd_config,你可以根据需求修改这个配置文件,比如可以更改启动端口为11587,注意这个数字不能超过65535。

如果你安装的是Windows操作系统,则需要额外安装一个Linux远程登录的终端软件。目前比较常见的终端登录软件有Xshell、SecureCRT、PuTTY、SSH Secure Shell等。很多朋友喜欢用SecureCRT,因为它的功能非常强大,但阿铭喜欢用PuTTY,因为它小巧且显示的颜色漂亮。最近阿铭也在使用Xshell,这个软件也非常不错,值得大家研究一下。但不管你使用哪一个客户端软件,最终的目的只有一个——远程登录到Linux服务器上。

PuTTY是一个免费的、开源的SSH客户端软件,它不仅有Windows版本,还有Unix/Linux版本。PuTTY的操作和配置都非常简单、易用。

网上曾经报道过,某个中文版的PuTTY被别有用心的黑客动了手脚,给植了后门。所以阿铭提醒各位,以后不管下载什么软件,尽量去官方站点下载。当然,你也可以通过阿铭在前言的反馈及服务中提供的途径去下载。打开下载页面后,我们可以看到有很多软件可供下载,如下所示:

  • PuTTY(SSH和telnet客户端软件);
  • PSCP(SCP客户端,用来远程复制文件);
  • PSFTP(SFTP客户端软件,使用SSH协议传输文件);
  • PuTTYtel(一个只有telnet功能的客户端软件);
  • Plink(Windows下的命令行接口,使用它可以在cmd下使用PuTTY);
  • Pageant(SSH的密钥守护进程,开启该进程后,密钥保存到内存中,连接时不再输入密钥的密码,PuTTY、PSCP、PSFTP和Plink都可以使用它);
  • PuTTYgen(生成密钥对的工具,3.2.2节会用到它)。

如果你只想用PuTTY,那只需下载putty.exe即可,不过后面我们还会用到PuTTYgen和PSFTP,所以阿铭建议你干脆下载安装包putty-0.73-installer.msi(版本可能已经更新,下载最新版本即可),然后安装一下,这样所有的软件都全了。

下载安装包后,双击putty-0.73-installer.msi进入安装界面,所有配置都保持默认设置,直接单击Next按钮,直至安装结束。安装完成后,在“开始”菜单中找到PuTTY,单击即可打开这个软件。

在第2章中,我们已经给CentOS设置了IP地址(192.168.72.128),并且这个IP地址是静态的,即使你的VMware重启过,它也不会变。设置IP地址的目的除了要使用yum工具外,另一个就是远程连接Linux操作系统了。

打开PuTTY后,请按照如下步骤连接远程Linux服务器。

  1. 填写远程Linux的基本信息

    填写Linux基本信息的对话框如图3-1所示,其中Host Name(or IP address)这一栏填写服务器IP,即192.168.72.128,Port和Connection type这两栏采用默认设置即可。Saved Sessions这一栏自定义一个名字,主要用来区分主机,因为将来你的主机会很多,写个简单的名字既方便记忆又能快速查找。

    {%}

    图3-1 填写基本信息
     

  2. 定义字符集

    计算机的字符集是最麻烦的,尤其是Linux,搞不好就会乱码。阿铭在第2章中教你安装CentOS时已经安装了中文语言,所以安装好的系统支持中文。在PuTTY这里也要设置支持中文,单击左侧的Window→Translation,查看右侧的Character set translation,选择UTF-8,如图3-2所示。再单击左侧的Session,然后单击右侧的Save按钮。

    {%}

    图3-2 定义字符集
     

  3. 远程连接你的Linux

    保存Session后,单击最下方的Open按钮。初次登录时,都会弹出一个友情提示,它的意思是要打开的Linux还未在本机登记,问我们是否要信任这个Linux。如果是可信任的,则单击“是”按钮在该主机登记;否则单击“否”按钮或者“取消”按钮。这里我们单击“是”按钮,弹出如下登录提示:

    login as: root
    [email protected]'s password:
    Last login: Thu Dec 26 08:13:39 2019

    输入用户名和密码后,就可以登录Linux系统。登录后,会提示至目前最后一次登录系统的时间和地点。然后,我们就可以在PuTTY里面进行操作了,这和在VMware终端上操作没有区别。而且它还有一个好处,就是可以随意复制、粘贴。之前在终端的窗口里,我们没有办法复制内容,更不能粘贴文本信息。使用PuTTY,我们还可以通过鼠标滚轮翻查之前显示的历史信息。

SSH服务支持一种安全认证机制,即密钥认证。所谓密钥认证,实际上是使用一对加密的字符串:其中一个称为公钥(public key),用于加密,任何人都可以看到其内容;另一个称为私钥(private key),用于解密,只有拥有者才能看到其内容。通过公钥加密过的密文,使用私钥可以轻松解密,但根据公钥来猜测私钥却十分困难。SSH的密钥认证就是使用了这一特性。

服务器和客户端都各自拥有自己的公钥和私钥,PuTTY可以使用密钥认证登录Linux,具体的操作步骤如下。

  1. 生成密钥对

    关于密钥对的工作原理,如果感兴趣,可以到网上查一查,阿铭在此不过多介绍。在“开始”菜单中找到PuTTYgen,单击打开它,如图3-3所示。然后单击Generate按钮,这样就开始生成密钥了,请来回拨动鼠标,这样有助于快速生成密钥对,大约几秒钟就完成了。图3-3中的Key comment可以保持不变,也可以自定义,它是对该密钥的简单介绍。Key passphrase用于给你的密钥设置密码,此项可以留空,但阿铭建议你设置一个,这样安全一些。Confirm passphrase需要再输入一遍刚刚设置的密码。

    {%}

    图3-3 生成密钥对
     

  2. 保存私钥

    单击Save private key按钮,选择一个存放路径并定义名称,单击“保存”按钮。这个就是私钥,请把它保存到一个比较安全的地方,谨防丢失或被其他人看到。
     

  3. 复制公钥到Linux

    返回刚才生成密钥对的窗口,在Key的下方有一个长字符串,这个字符串就是公钥的内容。把整个公钥字符串复制下来,粘贴到Linux的文件中。下面请跟着阿铭一起来操作,运行如下命令:

    # mkdir /root/.ssh // 创建/root/.ssh目录,因为这个目录默认是不存在的
    # chmod 700 /root/.ssh // 更改这个目录的权限
    # vi /root/.ssh/authorized_keys // 把公钥内容粘贴到文件/root/.ssh/authorized_keys里

    关于mkdirchmod这两个命令,阿铭会分别在4.1.2节和4.6.3节中详细介绍。在vi命令之后直接回车,输入i进入编辑模式,然后单击鼠标右键就可以粘贴了,这是PuTTY工具非常方便的一个功能。粘贴后,按Esc键,然后输入:wq并回车,保存并退出该文件。
     

  4. 关闭SELinux

    关于SELinux,在第2章中我们也提到过,它是CentOS的一种安全机制,它的存在虽然让Linux系统安全了很多,但也产生了不少麻烦。这里如果不关闭SELinux,使用密钥登录时会提示Server refused our key,从而导致不能成功。需要运行如下命令来关闭SELinux:

    # setenforce 0

    这只是暂时关闭,下次重启Linux后,SELinux还会开启。若要永久关闭,必须运行如下命令:

    # vi /etc/selinux/config

    按回车后,把光标移动到SELINUX=enforcing这一行,输入i进入编辑模式,修改为SELINUX= disabled。按Esc键,然后输入:wq并回车,最后重启系统。
     

  5. 设置PuTTY通过密钥登录

    当系统重新启动后,打开PuTTY软件,在右侧Saved Sessions下面找到刚刚保存的session,单击选中它,然后再单击右侧的Load按钮。在左下方单击SSH前面的+,然后选择Auth,查看右侧Private key file for authentication下面的长条框,目前为空。单击Browse按钮,找到我们刚刚保存好的私钥,单击“打开”按钮。此时这个长条框里就有了私钥的地址(当然,你也可以自行编辑这个路径),如图3-4所示。最后,再回到左侧,单击最上面的Session,再单击右侧的Save按钮。

    {%}

    图3-4 设置密钥
     

  6. 使用密钥验证登录Linux

    保存好Session后,单击右下方的Open按钮,会出现登录界面,此时你会发现,登录提示内容和原来的有所不同,如下所示:

    login as: root
    Authenticating with public key "rsa-key-20191227"
    Passphrase for key "rsa-key-20191227":
    Last login: Fri Dec 27 06:42:50 2019 from 192.168.72.1

    这里不再是输入root密码,而是需要输入密钥的密码。如果先前生成密钥对时你没有设置密码,输入root后会直接登录系统。有很多朋友在做密钥认证的时候会失败,但只要注意这几点就一定可以成功:

    • /root/.ssh目录权限为700;
    • SELinux要关闭;
    • /root/.ssh/authorized_keys文件名要写对;
    • 文件内容要粘贴对。

    假如你还有一台机器需要使用密钥验证登录Linux,你学会如何设置了吗?PuTTY的设置方法是一样的,使用同样的私钥,不需要你再次生成密钥对了。另外,把192.168.72.128上的文件/root/.ssh/authorized_keys复制一份到另一台机器就可以了。请注意,这个文件的名字是固定的。

    在本例中,阿铭教大家的是直接使用密钥登录root用户,但在工作中很多朋友登录的是普通用户,而不是root。那普通用户的密钥认证如何设置呢?原理肯定是一样的,同样要先有密钥对,然后把公钥放到服务器上,不过不是在/root/.ssh目录下面了,而是普通用户家目录下面的.ssh目录下。那普通用户家目录在哪里?第5章讲到用户管理时,阿铭会详细介绍,在这阿铭举一个例子,比如你登录的普通用户为aming,那么aming用户的家目录为/home/aming。还有一点大家要注意,在Linux机器上所做的操作(如创建.ssh目录)也必须以aming用户身份操作才可以。

既然可以在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 [email protected] // 第一次登录对方机器,有一个提示
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.
[email protected]'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下的客户端软件也是支持的。下面请跟着阿铭一步一步来操作。

  1. 客户端生成密钥对

    假如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)。
     

  2. 把公钥复制到要登录的机器上

    首先,我们查看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

     

  3. 登录Linux

    在128上执行如下命令:

    # ssh 192.168.72.129

    此时不再提示我们输入密码,就可以直接登录到129了。这样就可以实现Linux通过密钥验证的方式登录Linux。如果你在生成密钥对时设置了密码,那么这里也会提示你输入密钥密码。为了方便跨机器执行命令,这里我们特意不设置密钥的密码(后面会用到)。
     

  4. 使用ssh-copy-id

    Linux系统里还有一种更方便实现密钥认证的方法。这次阿铭要让129通过密钥认证登录128。在129上执行如下命令:

    # ssh-keygen
    # ssh-copy-id [email protected]

    它会提示让我们输入128的root密码,只要输入对了对方服务器的密码就完成了密钥认证。再次尝试ssh登录128,此时就不再提示我们输入密码,可以直接登录到129了。

(1) 远程连接Linux服务器,需要Linux服务器开启sshd服务,那么sshd服务默认监听哪个端口?这个端口是否可以自定义呢?如果可以,如何自定义呢?

(2) 常用的远程连接Linux的终端工具有哪些?

(3) 手动配置IP需要修改哪个配置文件?更改默认的配置文件需要修改哪些地方?

(4) 重启网络服务的命令是什么?

(5) 如何临时关闭SELinux?如何永久关闭SELinux?

(6) 查看Linux有几块网卡用什么命令?查看网卡IP用什么命令?

(7) 我们为什么要使用密钥登录Linux呢?