学会使用安全外壳协议连接远程计算机。
使用Linux,你只需要在键盘上输入命令,就可以巧妙地使用计算机(甚至这台计算机可以在世界上任何地方),这正是Linux最吸引人的特性之一。有了OpenSSH,POSIX用户就可以在有权限连接的计算机上打开安全外壳协议,然后远程使用。这对于许多Linux用户来说可能不过是日常任务,但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的安全外壳协议secureshell(简称SSH)连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。
相关术语
在讨论多台计算机时,如何将不同计算机彼此区分开可能会让人头疼。IT社区拥有完善的术语来描述计算机联网的过程。
- 服务service:服务是指在后台运行的软件,因此它不会局限于仅供安装它的计算机使用。例如,Web服务器通常托管着Web共享服务。该术语暗含(但非绝对)它是没有图形界面的软件。
- 主机host:主机可以是任何计算机。在IT中,任何计算机都可以称为主机,因为从技术上讲,任何计算机都可以托管host对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为主机,但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。
- 本地local:本地计算机是指用户或某些特定软件正在使用的计算机。例如,每台计算机都会把自己称为localhost。
- 远程remote:远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在远程位置的计算机。
现在术语已经明确好,我们可以开始了。
在每台主机上激活SSH
要通过SSH连接两台计算机,每个主机都必须安装SSH。SSH有两个组成部分:本地计算机上使用的用于启动连接的命令,以及用于接收连接请求的服务器。有些计算机可能已经安装好了SSH的一个或两个部分。验证SSH是否完全安装的命令因系统而异,因此最简单的验证方法是查阅相关配置文件:
$file/etc/ssh/ssh_config/etc/ssh/ssh_config:ASCIItext
如果返回Nosuchfileordirectory错误,说明没有安装SSH命令。
SSH服务的检测与此类似(注意文件名中的d):
$file/etc/ssh/sshd_config/etc/ssh/sshd_config:ASCIItext
根据缺失情况选择安装两个组件:
$sudodnfinstallopenssh-clientsopenssh-server
在远程计算机上,使用systemd命令启用SSH服务:
$sudosystemctlenable--nowsshd
你也可以在GNOME上的系统设置或macOS上的系统首选项中启用SSH服务。在GNOME桌面上,该设置位于共享面板中:
开启安全外壳协议
现在你已经在远程计算机上安装并启用了SSH,可以尝试使用密码登录作为测试。要访问远程计算机,你需要有用户帐户和密码。
远程用户不必与本地用户相同。只要拥有相应用户的密码,你就可以在远程机器上以任何用户的身份登录。例如,我在我的工作计算机上的用户是sethkenlon,但在我的个人计算机上是seth。如果我正在使用我的个人计算机(即作为当前的本地计算机),并且想通过SSH连接到我的工作计算机,我可以通过将自己标识为sethkenlon并使用我的工作密码来实现连接。
要通过SSH连接到远程计算机,你必须知道其IP地址或可解析的主机名。在远程计算机上使用ip命令可以查看该机器的IP地址:
$ipaddrshow|grep"inet"inet127.0.0.1/8scopehostloinet10.1.1.5/27brd10.1.1.31[...]
如果远程计算机没有ip命令,可以尝试使用ifconfig命令(甚至可以试试Windows上通用的ipconfig命令)。
127.0.0.1是一个特殊的地址,它实际上是localhost的地址。这是一个环回loopback地址,系统使用它来找到自己。这在登录远程计算机时并没有什么用,因此在此示例中,远程计算机的正确IP地址为10.1.1.5。在现实生活中,我的本地网络正在使用10.1.1.0子网,进而可得知前述正确的IP地址。如果远程计算机在不同的网络上,那么IP地址几乎可能是任何地址(但绝不会是127.0.0.1),并且可能需要一些特殊的路由才能通过各种防火墙到达远程。如果你的远程计算机在同一个网络上,但想要访问比自己的网络更远的计算机,请阅读我之前写的关于在防火墙中打开端口的文章。
如果你能通过IP地址或主机名ping到远程机器,并且拥有登录帐户,那么就可以通过SSH接入远程机器:
$ping-c110.1.1.5PING10.1.1.5(10.1.1.5)56(84)bytesofdata.64bytesfrom10.1.1.5:icmp_seq=1ttl=64time=4.66ms$ping-c1akiton.localPING10.1.1.5(10.1.1.5)56(84)bytesofdata.
至此就成功了一小步。再试试使用SSH登录:
$whoamiseth$sshsethkenlon@10.1.1.5bash$whoamisethkenlon
测试登录有效,下一节会介绍如何激活无密码登录。
创建SSH密钥
要在没有密码的情况下安全地登录到另一台计算机,登录者必须拥有SSH密钥。可能你的机器上已经有一个SSH密钥,但再多创建一个新密钥也没有什么坏处。SSH密钥的生命周期是在本地计算机上开始的,它由两部分组成:一个是永远不会与任何人或任何东西共享的私钥,一个是可以复制到任何你想要无密码访问的远程机器上的公钥。
有的人可能会创建一个SSH密钥,并将其用于从远程登录到GitLab身份验证的所有操作,但我会选择对不同的任务组使用不同的密钥。例如,我在家里使用一个密钥对本地机器进行身份验证,使用另一个密钥对我维护的Web服务器进行身份验证,再一个单独的密钥用于Git主机,以及又一个用于我托管的Git存储库,等等。在此示例中,我将只创建一个唯一密钥,以在局域网内的计算机上使用。
使用ssh-keygen命令创建新的SSH密钥:
$ssh-keygen-ted25519-f~/.ssh/lan
-t选项代表类型,上述代码设置了一个高于默认值的密钥加密级别。-f选项代表文件,指定了密钥的文件名和位置。运行此命令后会生成一个名为lan的SSH私钥和一个名为lan.pub的SSH公钥。
使用ssh-copy-id命令把公钥发送到远程机器上,在此之前要先确保具有远程计算机的SSH访问权限。如果你无法使用密码登录远程主机,也就无法设置无密码登录:
$ssh-copy-id-i~/.ssh/lan.pubsethkenlon@10.1.1.5
过程中系统会提示你输入远程主机上的登录密码。
操作成功后,使用-i选项将SSH命令指向对应的密钥(在本例中为lan)再次尝试登录:
$ssh-i~/.ssh/lansethkenlon@10.1.1.5bash$whoamisethkenlon
对局域网上的所有计算机重复此过程,你就将能够无密码访问这个局域网上的每台主机。实际上,一旦你设置了无密码认证,你就可以编辑/etc/ssh/sshd_config文件来禁止密码认证。这有助于防止其他人使用SSH对计算机进行身份验证,除非他们拥有你的私钥。要想达到这个效果,可以在有sudo权限的文本编辑器中打开/etc/ssh/sshd_config并搜索字符串PasswordAuthentication,将默认行更改为:
$file/etc/ssh/sshd_config/etc/ssh/sshd_config:ASCIItext0
保存并重启SSH服务器:
$file/etc/ssh/sshd_config/etc/ssh/sshd_config:ASCIItext1
日常使用SSH
OpenSSH改变了人们对操作计算机的看法,使用户不再被束缚在面前的计算机上。使用SSH,你可以访问家中的任何计算机,或者拥有帐户的服务器,甚至是移动和物联网设备。充分利用SSH也意味着解锁Linux终端的更多用途。如果你还没有使用过SSH,请试一下它吧。试着适应SSH,创建一些适当的密钥,以此更安全地使用计算机,打破必须与计算机面对面的局限性。