Linux 上用于远程连接的 SSH 初学者指南
使用安全 shell 与远程计算机建立连接。
Linux 最吸引人的功能之一是能够熟练地使用计算机,只需在键盘中输入命令即可,更好的是,能够在世界任何地方的计算机上做到这一点。借助 OpenSSH,POSIX 用户可以在他们有权访问的任何计算机上打开安全 shell,并从远程位置使用它。对于许多 Linux 用户来说这是一项日常任务,但对于尚未尝试过的人来说可能会感到困惑。本文介绍如何配置两台计算机进行安全外壳 (SSH) 连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。
术语
当讨论多台计算机时,区分一台计算机可能会令人困惑。 IT 社区拥有完善的术语来帮助阐明计算机联网过程的描述。
- 服务:服务是在后台运行的软件,因此可以由安装它的计算机以外的计算机使用。例如,网络服务器托管网络共享服务。该术语暗示(但并不坚持)它是没有图形界面的软件。
- 主机:主机是任何计算机。在 IT 领域,计算机被称为主机,因为从技术上讲,任何计算机都可以托管对其他计算机有用的应用程序。您可能不会将笔记本电脑视为“主机”,但您可能正在运行某些对您、您的手机或其他计算机有用的服务。
- 本地:本地计算机是您或某些软件正在使用的计算机。例如,每台计算机都将自己称为
localhost
。 - 远程:远程计算机是指您不在实际面前或实际使用的计算机。这是一台位于远程位置的计算机。
现在术语已经确定,您可以开始了。
在每台主机上激活 SSH
对于通过 SSH 连接的两台计算机,每台主机都必须安装 SSH。 SSH 有两个组件:您在本地计算机上用于启动连接的命令,以及用于接受传入连接请求的服务器。有些计算机已经安装了 SSH 的一个或两个部分。根据您的系统,命令会有所不同,为了验证您是否同时安装了命令和服务器,因此最简单的方法是查找相关的配置文件:
$ file /etc/ssh/ssh_config
/etc/ssh/ssh_config: ASCII text
如果返回 No such file or directory
错误,则说明您没有安装 SSH 命令。
对 SSH 服务进行类似的检查(注意文件名中的 d):
$ file /etc/ssh/sshd_config
/etc/ssh/sshd_config: ASCII text
根据需要安装其中之一:
$ sudo dnf install openssh-clients openssh-server
在远程计算机上,使用 systemd 启用 SSH 服务:
$ sudo systemctl enable --now sshd
或者,您可以在 GNOME 上的系统设置或 macOS 上的系统偏好设置中启用 SSH 服务。在 GNOME 桌面上,它位于共享面板中:
(塞思·肯伦,CC BY-SA 4.0)
启动安全外壳
现在您已在远程计算机上安装并启用了 SSH,您可以尝试使用密码登录进行测试。要访问远程计算机,您必须拥有用户帐户和密码。
您的远程用户不必与本地用户相同。只要您拥有该用户的密码,您就可以以远程计算机上的任何用户身份登录。例如,我在工作计算机上的名称为 sethkenlon
,但在个人计算机上的名称为 seth
。如果我使用的是我的个人计算机(使其成为我当前的本地计算机)并且我想通过 SSH 访问我的工作计算机,我可以通过将自己标识为 sethkenlon
并使用我的工作密码来实现此目的。
要通过 SSH 连接到远程计算机,您必须知道其互联网协议 (IP) 地址或其可解析的主机名。要查找远程计算机的 IP 地址,请使用 ip
命令(在远程计算机上):
$ ip addr show | grep "inet "
inet 127.0.0.1/8 scope host lo
inet 10.1.1.5/27 brd 10.1.1.31 [...]
如果远程计算机没有 ip
命令,请尝试使用 ifconfig
(甚至在 Windows 上使用 ipconfig
)。
地址 127.0.0.1 是一个特殊的地址,实际上是 localhost 的地址。这是一个“环回”地址,您的系统使用它来到达自身。这在登录远程计算机时没有用,因此在本示例中,远程计算机的正确 IP 地址是 10.1.1.5。在现实生活中,我会知道这一点,因为我的本地网络使用 10.1.1.0 子网。如果远程计算机位于不同的网络上,则 IP 地址几乎可以是任何地址(但绝不是 127.0.0.1),并且可能需要一些特殊的路由才能通过各种防火墙到达它。假设您的远程计算机位于同一网络上,但如果您有兴趣访问比您自己的网络更远程的计算机,请阅读我有关在防火墙中打开端口的文章。
如果您可以通过 IP 地址或主机名 ping 远程计算机,并且拥有登录帐户,那么您可以通过 SSH 连接到它:
$ ping -c1 10.1.1.5
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms
$ ping -c1 akiton.local
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
这就是成功。现在使用 SSH 登录:
$ whoami
seth
$ ssh sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
测试登录有效,因此现在您可以激活无密码登录。
创建 SSH 密钥
要无需密码即可安全登录另一台计算机,您必须拥有 SSH 密钥。您可能已经有一个 SSH 密钥,但创建一个新密钥也没什么坏处。 SSH 密钥在您的本地计算机上开始其生命周期。它由两个组件组成:一个私钥,您永远不会与任何人或任何东西共享,以及一个公共密钥,您可以将其复制到任何您想要无密码访问的远程计算机上。
有些人创建一个 SSH 密钥并将其用于从远程登录到 GitLab 身份验证的所有操作。但是,我对不同的任务组使用不同的键。例如,我在家里使用一个密钥对本地计算机进行身份验证,使用另一个密钥对我维护的 Web 服务器进行身份验证,一个单独的密钥用于 Git 主机,另一个密钥用于我托管的 Git 存储库,等等。在此示例中,我将创建一个在局域网内的计算机上使用的唯一密钥。
要创建新的 SSH 密钥,请使用 ssh-keygen 命令:
$ ssh-keygen -t ed25519 -f ~/.ssh/lan
-t
选项代表类型,并确保用于密钥的加密高于默认值。 -f
选项代表文件,并设置密钥的文件名和位置。系统将提示您为 SSH 密钥创建密码。您应该为密钥创建一个密码。这意味着您在使用密钥时必须输入密码,但该密码保留在本地并且不会通过网络传输。运行此命令后,您将获得一个名为 lan
的 SSH 私钥和一个名为 lan.pub
的 SSH 公钥。
要将公钥传输到远程计算机,请使用ssh-copy-id
。为此,您必须验证您是否具有对远程计算机的 SSH 访问权限。如果您无法使用密码登录远程主机,则也无法设置无密码登录:
$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5
在此过程中,系统将提示您输入远程主机上的登录密码。
成功后,尝试再次登录,但这次使用 -i
选项将 SSH 命令指向适当的密钥(在本例中为 lan
):
$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
对网络上的所有计算机重复此过程,您将能够浏览每台主机,而无需再次考虑密码。事实上,一旦设置了无密码身份验证,您可以编辑 /etc/ssh/sshd_config
文件以禁止密码身份验证。这可以防止任何人使用 SSH 向计算机进行身份验证,除非他们拥有您的私钥。为此,请在具有 sudo
权限的文本编辑器中打开 /etc/ssh/sshd_config
并搜索字符串 PasswordAuthentication
。将默认行更改为:
PasswordAuthentication no
保存并重新启动 SSH 服务器(或直接重新启动):
$ sudo systemctl restart sshd && echo "OK"
OK
$
每天使用 SSH
OpenSSH 改变您对计算的看法。您不再局限于面前的计算机。通过 SSH,您可以访问家里的任何计算机、您拥有帐户的服务器,甚至移动和物联网设备。释放 SSH 的强大功能也释放了 Linux 终端的强大功能。如果您不是每天都使用 SSH,请立即开始。适应它,收集一些钥匙,生活更安全,并扩展你的世界。