Linux 最吸引人的特性之一就是能够仅使用键盘输入的命令来熟练地使用计算机——更棒的是,能够在世界任何地方的计算机上做到这一点。 感谢 OpenSSH,POSIX 用户可以在任何他们有权访问的计算机上打开安全 shell,并从远程位置使用它。 对于许多 Linux 用户来说,这是一项日常任务,但对于尚未尝试过的人来说,这可能会令人困惑。 本文解释了如何配置两台计算机以进行安全 shell (SSH) 连接,以及如何在无需密码的情况下安全地从一台计算机连接到另一台计算机。
术语
当讨论多台计算机时,将一台计算机与另一台计算机区分开来可能会令人困惑。IT 社区有完善的术语来帮助阐明计算机联网过程的描述。
- 服务 (Service): 服务是在后台运行的软件,以便可以被安装它的计算机以外的计算机使用。 例如,Web 服务器托管 Web 共享服务。 该术语暗示(但并非坚持)它是没有图形界面的软件。
- 主机 (Host): 主机是任何计算机。 在 IT 领域,计算机被称为主机,因为从技术上讲,任何计算机都可以托管对其他计算机有用的应用程序。 您可能不会将笔记本电脑视为“主机”,但您可能正在运行一些对您、您的手机或其他计算机有用的服务。
- 本地 (Local): 本地计算机是您或某些软件正在使用的计算机。 例如,每台计算机都将自身称为
localhost
。 - 远程 (Remote): 远程计算机是您不在其面前或未实际使用的计算机。 它是位于远程位置的计算机。
现在术语已确定,您可以开始了。
在每台主机上激活 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 桌面中,它位于共享面板中

(Seth Kenlon,CC BY-SA 4.0)
启动安全 shell
现在您已在远程计算机上安装并启用了 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,请立即开始使用。 熟悉它,收集一些密钥,更安全地生活,并扩展您的世界。
10 条评论