带你读《Linux实战》之三:远程连接:安全访问联网的计算机-阿里云开发者社区

 知识中心     |      2019-11-07 00:00:00

点击查看第一章
点击查看第二章

第3章

远程连接:安全访问联网的计算机
本章内容提要

  • 加密并保护远程连接
  • 使用systemd管理Linux系统进程
  • 非常安全和方便的免密码SSH接入
  • 使用SCP在远程位置之间安全地拷贝文件
  • 在SSH连接上使用远程图形程序

人们常说,抵达目的地只是乐趣的一半。好吧,当在分布式计算的世界里工作时,无法访问你的服务器和远程资源会是一个很严重的问题。因为现在的很多工作都是由你在上一章中看到的虚拟机承担的,而你们又不能走到一台虚拟服务器旁边,按下电源按钮然后登录,你需要一些其他的访问路径。欢迎来到安全Shell(Secure Shell,SSH)的世界。

3.1 加密的重要性

最开始时,Telnet被用于在网络上以任意速率登录连接。Telnet协议速度快且可靠,而且,在由诸多更小、更简单的网络组成的单纯世界里,完美可用。在那时,Telnet会话以不加密的方式发送数据包并不是什么大事。
然而,我明白在过去的几十年里事情已经发生了些许变化。如今,所有酷孩子们使用的互联网较之前更大了,而且,网络管理员也不再以最初的名字相互认识。很显然,现在安全性已经成为一个被热烈讨论的话题。或者,换句话说,如果你在不安全的网络上正使用Telnet以纯文本的方式传输包含密码和个人信息的私有数据,那你就该假定它们不再是私有的。实际上,在网络上使用诸如Wireshark等免费可用的抓包软件,任何人都可以轻松读取到你发送和接收的任何数据。
因为每个人都定期在公共网络上移动敏感数据,那么可怜的管理员要做什么?解决方案是加密将要传输的数据。但什么是加密呢?
要想保护数据的隐私,即使数据落入他人之手,安全软件可以使用加密密钥(encryption key),即包含随机字符序列的小文件。如图3-1所示,密钥可用为加密算法的一部分应用,以将纯文本的、可读的数据转换为相当于完全乱码的数据。至少在该密钥被应用于相同算法的逆应用之前,这些数据看起来是乱码的。在文件的加密版本上使用密钥将把这些乱码数据恢复为最初形式。如果只有你和你信任的朋友拥有该密钥,应该就没有其他人能够获取数据的含义,即使数据被拦截。
当你登录到一个远程服务器时,你所做的只是让包含会话信息的数据包在两台计算机之间来回地传送。安全(secure)通信的关键是在传输每个数据包之前快速地对其加密,之后,在接收端快速地将其解密。事实上,SSH网络协议可以快速且无形地进行这一处理,从而让曾经使用Telnet会话进行连接的用户感受不到任何差异。

image.png

20世纪90年代设计的SSH是面向UNIX类操作系统的、安全加密传输远程登录数据的一个简单方式。该协议的OpenSSH实现如今非常流行,以致微软公司近期已在Windows中提供了该协议。

3.2 OpenSSH入门

在本节,你将要检查OpenSSH是否已经安装在你的计算机上并处于活动状态。之后,如果需要的话,你会安装该软件。因为对软件包活动状态的测试需要理解当今Linux发行版如何管理进程,所以你将会绕进systemd的世界。当一切就绪,你就可以使用OpenSSH打开远程服务器上的登录会话。
如果你还没有安装该软件包,在Ubuntu或Debian主机上运行apt install openssh-server命令将为你提供所需的全部软件。但Linux发行的许多版本都至少提供了现成的最小化SSH功能。要想查看你的系统中已有什么(至少在基于Debian/Ubuntu的机器上),可以使用包管理器dpkg。
dpkg命令行工具管理和查询高级包工具(Advanced Package Tool,APT)系统中的软件包。运行带有-s标志和软件包名字的dpkg命令会返回当前安装及更新的状态。如果该软件包已被安装(就像gedit示例中软件已安装一样),输出看起来将类似如下内容:

image.png

注意:在第2章,你曾见过使用apt search packagename查找尚未安装的可用软件包。
如图3-2所示,当你登录到一台远程计算机,你的本地计算机就是该远程服务器的一个客户,因此,你就要使用openssh-client软件包。然而,你正在登录的远程服务器的操作系统就扮演了该shell会话的主操作系统,因此服务器必须运行openssh-server软件包。

image.png

你可以运行dpkg -s openssh-client或dpkg -s openssh-server来确认计算机上已经安装了正确的软件包。因为这些软件包被用来承载远程的shell会话,Linux容器通常会默认地安装整套软件包。
服务器版本同样包括了可在客户端软件包中找到的所有工具。这意味着,在安装了openssh-server软件包的计算机上,操作人员也可以通过SSH登录到其他服务器。因此,即使你的计算机上还没有安装客户端软件包,安装服务器软件包将可以完全覆盖所需要的所有功能。
另一方面,安全性最佳实践告诉我们要将基础设施中的访问路由限制在绝对必要的范围内。如果你认为你不需要登录到你的台式机或笔记本上,那么,仅需安装openssh-client软件包即可:
image.png

仅正确地安装了软件包并不意味着该软件包是立即可用的。有时候,配置文件被默认设置为不活动的。在阅读本书的过程中,你将看到大量关于设置配置的示例,而且,在本章稍后的内容中,你将看到OpenSSH的配置文件。但是,Linux程序不能正常工作可能还有另一个共同的原因—它并没有运行。你可以使用systemctl status命令来检查计算机中SSH是否正在运行:
image.png

如你从输出的Active行所见,一切都很好。如果确实需要你自己动手进行处理,需再次使用systemctl,但这次是用start代替status。
对你的新玩具感到厌倦了吗?systemctl stop命令可以快速地将其停止:
image.png

你可以使用systemctl enable ssh强制系统启动时自动加载一个进程(如SSH),或者使用systemctl disable ssh来禁止自动加载。如下代码片段启用了SSH功能:
image.png

systemctl看起来很不错,但你几乎没有机会见到它。现在OpenSSH正在等着我们,但在本章的末尾,我将更为深入地解释进程管理。

3.3 使用SSH登录一台远程服务器

启动远程会话要比想象的简单一些。请确保已有第二台计算机在某个地方运行,该计算机加载了openssh-server且可以通过网络进行访问。例如,你可以采用上一章的方法来启动一个LXC容器。
现在,查找计算机的IP地址。如果你正在使用LXC容器,就可以通过lxc-ls --fancy命令获取任何需要的信息。如下示例中给出了一个名为test且未运行的容器,以及一个正在运行的base容器,使用的IP地址是10.0.3.144。
image.png

或者,如果你正好登录了你的服务器,你就可以使用ip addr命令获取服务器的公有地址,该命令会乱糟糟地输出一大堆罗列本地网络接口的字符。这些字符看上去如下形式:
image.png

本例中,接口中标号为8的inet行是我们主要关注的。其给出了IP地址10.0.3.144。
拥有这些信息后,要进行连接,你将需要使用登录服务器的账号名和IP地址来执行ssh命令。如果这是你第一次从自己的计算机登录该服务器,将会要求你输入yes来确认服务器上OpenSSH程序发回的认证信息(说明一下,是yes,而不是字母y)。最后,你要输入该账号的密码(在我的例子中是ubuntu),然后你登录了服务器:
image.png

是否没有按照你的预期执行?看起来你要拥有一个极好的学习体验了!你可能遇到的最常见的问题包括网络连接问题,这样的话,为什么不先偷偷看一下第14章的内容呢?现在,请使用ping命令测试两台计算机是否互相可达。假定你在自己的计算机上测试到IP地址为10.0.3.144的远程服务器的连通性,成功的ping操作的结果看起来应该是这样的:
image.png

失败的结果可能如下。为了便于说明,我ping了一个未被使用的IP地址:
image.png

3.4 免密码SSH访问

密码总是让人感到有些沮丧。它们几乎从未被正确地使用过。它们要么太短、太容易被猜出,要么就是在多个账号中被过度使用。而且,人们似乎会以惊人的速度忘记它们。如果保护数据的唯一方法是密码,那么数据极有可能并未得到很好的保护。
这就是为什么当涉及安全(如Amazon Web Service,AWS)时,最可信的行业从业人员会在默认情况下完全禁用其云实例上的密码验证。如果你担心未经授权的服务器访问风险,那么你可能需要考虑跟随他们的步伐。以下是在亚马逊Linux实例上,/etc/ssh/sshd_config文件中关于EC2服务的设置:
image.png

OpenSSH配置文件
与Linux中的任何其他事物一样,OpenSSH在计算机中的运行方式很大程度上取决于它的纯文本配置文件。而且,和大多数其他程序一样,我们可以在/etc目录体系中找到这些配置文件。当前情况下,配置文件存放在/etc/ssh/目录中。
配置文件/etc/ssh/sshd_config中的设置参数控制远程客户(remote client)登录到你的计算机的方式。另一方面,/etc/ssh/sshd_config控制本机用户作为客户登录到远程主机(remote host)的方式。除了限制用户如何通过SSH登录你的计算机,这些文件中的设置也可被用作控制所有类型的行为,包括是否允许远程GUI访问本地程序。

代替SSH密码授权的一个方式是创建一个特定的密钥对,之后将公共部分拷贝到远程主机,即要登录的计算机。当连接两端都有加密密钥时,在主机上运行的OpenSSH现在就可以知道是哪个用户而无须要求输入密码。这并不是说在基础设施安全中密码没有积极的作用。实际上,你将很快看到是什么情况。理想情况下,你应该创建一个口令(passphrase)并在你使用密钥对之前在本地进行授权。
注意:类似于密码,口令是你选择的加密文本串。但口令常常会包括空格,由一系列真正的单词组成。像3Kjsi&*cn@PO这样的密码是不错的,但像“fully tired cares mound”这样的口令会更好,因为其长度更长而且更易于记忆。

3.4.1 生成新的密钥对

当然,解决问题的方法不止一种。但是,由于所有优秀的系统管理员都是经过训练的懒人,我将采用按键最少的方法。该选择的一个意外但令人愉快的结果是,我将向你介绍管道字符(|)的更复杂的用法。
你会从使用ssh-keygen程序在客户计算机上创建一个新的公钥/私钥对开始。你将被询问密钥对的名字,但是,除非你已经得到了一个名为id_rsa的密钥对,否则我将按下回车键(Enter)并使用默认值。如之前所见,在提示时创建一个口令通常会更好,特别是在你将计算机与他人共享的时候。请记住,如果你选择增加一个口令,那么每当你使用密钥时都会提示你输入口令。以下给出了所有的相关信息:
image.png
image.png

现在你拥有了一个崭新的基于RSA加密的密钥对。继续前进,使用ls -l命令以长格式显示.ssh/目录中的内容。注意,这里有两个名为id_rsa的文件,但只有一个文件的扩展名为.pub。这个文件是密钥对的公钥部分,也是你最终要复制到会话主机远程计算机的文件:
image.png

应该使用哪种算法?
除了RSA(Ron Rivest、Adi Shamir和Leonard Adleman三位研究者率先提出该算法,故以他们姓氏的首字母缩写来命名该算法),OpenSSH还支持ECDSA和ED25519签名算法。你将发现默认的RSA算法与ECDSA和ED25519算法之间的技术差异非常模糊,它们都具有基于椭圆曲线的优势。它们都被认为是相当安全的。对于ECDSA和ED25519算法,要记住的是在较早的实现中它们可能并未被完全支持。
不要再假设所有的OpenSSH实现都支持DSA。鉴于对DSA源头理论的质疑,在任何情况下都要尽可能地避免使用该算法。

3.4.2 在网络上复制公钥

在你将公钥复制到宿主机之前,免密码SSH访问是不能工作的。如你在图3-3中看到的,密钥对通常在客户计算机上创建。这是因为私钥的确应该是私有的。你应该尽可能地避免对其进行不必要的移动,并且将其暴露给那些不友好的眼睛。

image.png

一旦创建了密钥对,你就可以将公钥添加到宿主计算机的.ssh/authorized_keys文件中。在宿主机上运行的OpenSSH软件将可以验证在客户主机上用私钥创建的密文消息的真实性。一旦该消息得到验证,就可以开始SSH会话了。
首先要做的是确定要登录的主机上的用户账号。在我给出的示例中,使用了名为ubuntu的账号。密钥需要被复制到/home/ubuntu/下的.ssh/目录中。如果该目录不存在,可以用mkdir命令创建。
不过,首先我要介绍一个很酷的快捷方式:实际上不需要在远程主机上打开一个完整的SSH会话。相反,你可以将命令追加到常规的SSH语法中,形式如下所示:
image.png

你将仍需要为远程主机提供密码。但只要完成了这一操作,在主机的/home/ubuntu/目录下将会有一个.ssh/目录。
为了便于阅读,我用反斜杠()将下一条命令分割为三行,反斜杠()会让Bash知道下一行是当前行命令的一部分。请确定在反斜杠后没有其他字符(包括空格)。这肯定会让人感到有些不舒服:
image.png

这个多行的命令将用cat读取文件id_rsa.pub中的所有内容并将其存储在内存中。之后,该命令通过登录到远程宿主计算机的SSH会话以管道方式传输文本。最后,在宿主计算机上再一次读取该文本,并将其添加到authorized_keys文件中。如果该文件不存在,>>(追加工具)会创建该文件。如果该文件已经存在,就将文本追加到该文件的末尾。
就是这样。你可以来试试。现在,当你运行相同的老版本ssh命令时,不需要输入密码:
image.png

3.4.3 使用多个加密密钥

在某些情形下(如必须登录到亚马逊EC2服务上的一个虚拟主机实例),你需要为给定的会话指定一个密钥对。当你开始为不同的宿主机构建一个密钥集合时,这种情况肯定会发生。为了让OpenSSH知道你所用的密钥,可以为命令添加-i标志,其后是关于私钥文件的名称与位置的参数:
image.png

是否注意到了本例中的.pem文件扩展?这意味着该密钥被保存为一个所有类型虚拟机共用的格式,包括亚马逊EC2实例。

3.5 使用SCP安全地拷贝文件

我敢肯定你记得在文件系统中cp命令如何将文件和目录从一个位置拷贝到另一个位置。至少在理论上,没有理由不能在网络上复制文件。但这完全是疯狂的—文件的内容将被暴露给当时正在网络上闲逛的人,或者是一段时间后浏览网络日志数据的任何人。
请忘掉这个想法,直到你可以在cp命令前加上s标志以保证安全(secure)。为了传输文件,SCP程序使用SSH协议在任何位置拷贝任意类型的文件,并采用相同的密钥、密码和口令。假设在你之前工作的远程宿主机上已经存在一个.ssh/目录,这里给出如何将公钥(id_rsa.pub)传输到远程宿主机并将其重命名为authorized_keys的示例:
image.png

警告:如果在该目录下已经存在authorized_keys文件,这个操作将重写该文件,任何已有的内容都会被破坏。仅在你使用的用户账号具有某些权限时,才能拷贝和保存文件。因此,如果你的用户没有获得根权限,请不要尝试将文件保存到远程主机的
/etc/目录。在你提出疑问之前,我想说的是,以根用户登录SSH会话通常是一个安全大忌。
顺便说一下,你可以将远程文件拷贝到本地主机。下面的例子将一个文件从AWS EC2实例(由一个假的IP地址表示)拷贝到指定的本地目录:
image.png

截至目前,你用过的命令已经说明了一些重要工具。但我需要指出的是,还有第三种(官方的)方式将密钥拷贝到远程宿主机—名为ssh-copy-id的专用程序:
image.png

SSH会话的优点是不存在GUI层处理的拖累,其非常快速和高效。但如果你要让远程宿主计算机上运行的程序具有图形属性,可能就会出现问题。下一节将解决这个问题。

3.6 使用SSH连接上的远程图形程序

假设你正在尝试对一个远程位置的用户提供支持,该用户报告某款桌面软件(如LibreOffice)出错。如果你认为启动和运行该程序有助于诊断和解决这个问题,那么,你就可以使用SSH上的图形会话(使用Linux X Window管理器)来完成操作。
话虽如此,还是不要期待奇迹会发生。以-X标志运行ssh命令,即使采用了所谓的X11 Forwarding,将允许你把基于宿主机的程序加载到客户计算机的桌面上。你得到的结果可能不会满足你的期望,因为这取决于包括网络连接质量在内的多种因素。对于诸如LibreOffice这样的重资源程序来说尤其如此。然而,它通常是值得一试的。即使带宽稍低,但也比开两小时的车前往客户的办公室要好。
还有一件事:请不要在服务器上尝试。在大多数情况下,安装在服务器或虚拟机(如LXC或Docker容器)中的操作系统版本只有简单的图形功能或者没有。如果必须这样做,你可以安装桌面包来升级操作系统。在Ubuntu设备上,操作类似于以下步骤:
image.png

有了所有的免责声明,我想是时候看看它实际上是如何工作的了。首先,打开宿主机(要运行该程序的计算机)上的sshd_config。你需要确保X11 Forwarding行的值为yes(但是,出于安全考虑,请不要将该值保持超过所需要的时间):
image.png

在客户机的ssh_config文件中也有类似的行,也需要正确地进行设置:
image.png

由于你已经编辑了该配置文件,之后你需要在两台计算机上重启SSH,以确保所做的配置生效:
image.png

现在,你已经准备就绪。要想启动一个图形化使能的会话,请为ssh命令增加-X标志:
image.png

你将看到常规的命令提示符,但是现在你可以运行一个将启动图形程序的命令。尝试一些小的操作。以下命令应该会在一个Ubuntu系统上工作:
image.png

神奇吧!你在本地桌面窗口中成功地运行了一个远程程序。
OpenSSH带来的价值远远超过了你看到的核心特性。一旦你获得了可以工作的SSH连接,你就可以使用各种技巧了。尝试将一个本地文件系统或目录挂载到一个远程主机上,从而允许远程用户无缝地访问你的文件。或者,通过SSH的隧道功能,使用端口转发允许安全、私密地使用远程的HTTP服务。

3.7 Linux进程管理

如前所述,现在我将重新讨论Linux进程管理,以使大家能够正确地理解OpenSSH等程序是如何被处理的。从长远看,了解工作机制可以让一般的管理和故障排查更加高效。但是,如果你还不想一头扎进这样的一个相关主题,也可以安全地跳过本章的剩余内容。学习本书的后续内容,你应该是没有问题的。
到底什么是systemctl,它到底在做什么?为了正确地回答这些问题,通常你必须考虑Linux是如何管理系统进程的。因为认识新朋友总是很愉快的,所以,你也需要学习一些关于进程跟踪的工具,以更加容易地理解其工作方式。
软件(software),如我确定你所了解的,是包含代表用户控制计算机硬件的指令的程序代码。进程(process)是正在运行的软件程序的实例。操作系统(operating system)是一个工具,被用于组织和管理这些实例/进程,以有效地使用计算机中的硬件资源。
对于复杂的多处理器、多用户操作系统环境,组织和管理这些进程可不是一件简单的事情。为了让它工作,你需要某种监控工具来控制诸多运行的部件(如图3-4)。我来为你介绍systemctl。

image.png

3.7.1 用ps命令查看进程

让我们拿出一个电子显微镜,看看是否能在进程的自然栖息地发现一个进程。在终端中输入如下命令。它将在后台(&)运行10秒后停止,不做任何处理(sleep)。然而,在其运行期间,输入ps命令:
image.png

在本例中,你会看到由该命令生成的两个运行的进程,其PID分别是19829和19832。如果等待10秒后再次运行ps命令,你会看到这两个进程都将不再运行。你也会看到sleep命令成功执行的反馈:
image.png
image.png

通常情况下,如果你仅输入并执行ps命令,你可能只得到两个结果。首先,名为bash的进程表示当前shell会话使用的是bash命令解释器,以及最近使用的命令(当然,就是ps命令)。但是,通过观察分配给bash的PID(在之后的例子中为7447),你知道在系统中已经有许许多多的其他进程正在全力运行。这些进程由父进程shell创建,并一直回到init进程:
image.png

在Ubuntu系统中,当Linux计算机启动时,首先启动并做好其他一切准备的进程是init。如你即将发现的,这个名字可能是误导性的,这也是为什么CentOS中的第一个进程取了不同的名字。通过如下方式运行ps命令,你可以看到init就是第一个进程。我会简要解释相关细节:
image.png

输出的最右侧列(第一行的/sbin/init)表示了进程之后对应文件的位置和名称。本例中,它是存放在/sbin/目录中的init文件。第一行的最左侧列包含了root一词,说明该进程的所有者是根用户。现在唯一值得关注的信息是数字1,即init进程的PID。要获得值为1的PID的唯一方式是先于任何其他进程之前执行该进程。
在继续学习之前,值得我们再花点时间来了解ps命令。如你所见,ps命令显示所有活动进程的信息。通常,访问与进程相关的信息是非常重要的,这能够让你正确地规划系统行为并排除故障。你会希望尽早并经常地使用ps命令。
如之前所做的那样,为ps命令添加-e参数不仅会返回当前子shell中运行的进程,还会返回从所有父shell到init中的所有进程。
注意:父shell是一个shell环境,在这个环境中可以启动新的shell(子shell),并在其中运行程序。你可以将GUI桌面会话看作一个shell,进而将接收命令行的终端看作其子shell。顶层shell(祖父shell?)是Linux启动时率先运行的shell。
如果你想形象地呈现父、子shell及进程,可以使用pstree命令(添加-p参数来显示每个进程的PID)。要注意的是,第一个进程(PID为1)为何是systemd。在较早的Linux版本中(例如,Ubuntu 14.04及更早版本),它反而被称为init:
image.png

继续前进并在你的计算机上执行所有命令。即使是在一个安静的系统中,你也可能看到诸多进程;在繁忙的个人电脑或服务器上,很容易会有成百上千个进程。

3.7.2 使用systemd

关于你刚刚看到的/sbin/init文件还有一些有趣的事情:file是一个宝贵的UNIX程序,它会为你提供一个文件的内部信息。如果你以/sbin/init为参数来运行file程序,你将会看到init并不是一个真的程序,而是systemd程序的一个符号链接(symbolic link)。我们将在第12章深入地讨论符号链接,但在这里你将开始接触systemd:
image.png

在经历了多年的分裂和激烈的纷争后,现在几乎所有的Linux发行版都使用了相同的进程管理器systemd。这是名为init的进程的一个简易替代,init一直是所有基于UNIX的操作系统启动过程中启动的第一个进程。我的意思是,通过简易替代(drop-in replacement),即使完成工作的方式非常不同,但对于一般的观察者而言,通常systemd的功能就像init一样。这就是为什么/sbin/init文件现在只是一个指向syetemd程序的链接。
这有点理论化,因为你可能永远不会真的通过systemd程序的名称来对其进行调用,无论是直接调用还是通过/sbin/init的前端调用。如你已经看到的,这是因为主要的管理任务是由systemctl代表systemd进行处理的。
从技术角度看,systemd的主要工作是控制各个进程的生成、存活及消亡方式。你之前使用的systemctl命令对于这些任务而言是一个选择工具。但有点争议的是,systemd开发者对传统的进程管理功能已经进行了极大的扩展,以控制不同的系统服务。在systemd体系之下存在一组工具,如登录管理器(journald)、网络管理器(networkd)及设备管理器(猜对了,就是udevd)。好奇吗?字母d表示守护进程(daemon),它是后台的系统进程。
随着你完成本书的学习,你将至少与这些systemd工具中的某一些不期而遇。接下来我们将要学习如何管理和备份文件系统和归档文件,后者尤为重要。

3.8 小结

  • 加密连接是所有网络通信的关键组成,且SSH是非常常用的工业标准。
  • 通过分享一个密钥对的公钥,你可以使能免密码的SSH访问。
  • OpenSSH软件包也允许安全的文件拷贝和远程的图形化会话。
  • 在大多现代Linux发行版中,进程是由systemd通过systemctl工具来管理的。
  • 你可以在两个命令之间使用|(管道)字符传输数据,同时使用grep过滤流数据。

主要名词

  • 密码(password)是一个常规字符组成的字符串,而口令(passphrase)可以包含空格和标点符号。
  • RSA是一个流行的加密算法。
  • X11 forwarding允许在一个远程连接上运行图形化程序。
  • Linux进程(process)是所有正在进行的活动,它与一个运行的单个程序相关联。
  • shell是一个终端环境,它提供了一个命令行解释器(如Bash)让用户执行命令。当你在Linux桌面计算机或笔记本上工作时,你会通过打开一个终端程序(如GNOME终端)来访问一个shell。
  • 父shell(parent shell)是一个初始化环境,在该环境中可以启动子shell,并在其中运行程序。总而言之,shell也是一个进程。

安全最佳实践

  • 请永远加密在公网上运行的远程登录会话。
  • 避免只是采用密码;和人一样,它们是不可靠的。
  • 基于密钥的免密码SSH会话比简单的密码登录要更好。
  • 永远不要在公网上以纯文本形式传输文件。

命令行回顾

  • dpkg -s openssh-client检查基于APT的软件包的状态。
  • systemctl status ssh检查系统进程(systemd)的状态。
  • systemctl start ssh启动一个服务。
  • ip addr列出计算机上的所有网络接口。
  • ssh-keygen生成一个新的SSH密钥对。
  • $ cat .ssh/id_rsa.pub | ssh ubuntu@10.0.3.142 "cat >> .ssh/authorized_keys"将一个本地密钥拷贝并粘贴到远程的计算机。
  • ssh-copy-id -i .ssh/id_rsa.pub ubuntu@10.0.3.142安全地拷贝加密密钥(建议这样做,也应该这样做)。
  • ssh -i .ssh/mykey.pem ubuntu@10.0.3.142指定一个特定的密钥对。
  • scp myfile ubuntu@10.0.3.142:/home/ubuntu/myfile安全地将一个本地文件拷贝到一台远程计算机。
  • ssh -X ubuntu@10.0.3.142允许以图形化的会话登录一台远程宿主计算机。
  • ps -ef | grep init显示当前运行的所有系统进程,并用字符串init过滤结果。
  • pstree –p以树形格式来显示当前运行的所有进程。

自测题
1.加密密钥的用途是:

a.建立一个安全的网络连接
b.加密和解密数据包
c.观察传输中的敏感数据
d.确保数据传输的可靠性

2.使用如下哪个命令可以查看服务的状态?

a. dpkg -s <servicename>
b. systemd status <servicename>
c. systemctl status <servicename>
d. systemctl <servicename> status

3.在一台宿主服务器可以接受远程SSH登录之前,必须安装如下哪个软件包?

a. openssh-server
b. ssh-server
c. openssh-client
d. ssh-client

4.在使用systemd的Linux发行版上,init的工作是由如下哪个程序执行的?

a. /lib/systemd/system
b. /bin/system
c. /sbin/init
d. /bin/init

5.如下哪个服务不是一个systemd服务?

a. networkd
b. journald
c. processd
d. udevd

6.为了使用免密码SSH连接,这些密钥必须存放在哪里?

a.公钥、私钥存放在宿主机,私钥存放在客户端
b.公钥、私钥存放在宿主机,公钥存放在客户端
c.私钥存放在宿主机,公钥存放在客户端
d.公钥存放在宿主机,私钥存放在客户端

7.在SSH会话中,口令的用途是什么?

a.验证你到远程OpenSSH程序的身份
b.验证你到本地OpenSSH程序的身份
c.确定要使用的密钥对
d.认证密钥对的状态

8.如下哪条命令将一个远程文件拷贝到你的本地计算机的当前目录(假设远程目录和文件都存在)?

a. scp mylogin@10.0.3.142:/home/mylogin/filename
b. scp mylogin@10.0.3.142/home/mylogin/filename
c. scp mylogin@10.0.3.142:/home/mylogin/filename
d. scp mylogin@10.0.3.142:/home/mylogin/filename./home/myname/Documents

答案
1.b 2.c 3.a 4.a 5.c 6.d 7.b 8.a