Linux 远程连接 SSH 初学者指南

使用安全 Shell 建立与远程计算机的连接。
139 位读者喜欢这篇文章。
woman on laptop sitting at the window

CC BY 3.0 US Mapbox Uncharted ERG

Linux 最吸引人的特性之一是能够仅通过键盘输入的命令熟练地使用计算机——更棒的是,能够在世界任何地方的计算机上做到这一点。 感谢 OpenSSH,POSIX 用户可以在他们有权访问的任何计算机上打开安全 shell,并从远程位置使用它。 对于许多 Linux 用户来说,这是一项日常任务,但对于尚未尝试过的人来说,这可能会令人困惑。 本文解释了如何配置两台计算机以进行安全 shell (SSH) 连接,以及如何从一台计算机安全地连接到另一台计算机而无需密码。

术语

当讨论多台计算机时,将一台计算机与另一台计算机区分开来可能会令人困惑。 IT 社区有完善的术语来帮助澄清计算机联网过程的描述。

  • 服务: 服务是在后台运行的软件,以便它可以被安装它的计算机以外的计算机使用。 例如,Web 服务器托管 Web 共享服务。 该术语暗示(但不坚持)它是没有图形界面的软件。
  • 主机: 主机是任何计算机。 在 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 桌面中,它位于共享面板中

启动安全 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,请立即开始。 熟悉它,收集一些密钥,更安全地生活,并扩展您的世界。

接下来阅读什么

Linux 防火墙入门

防火墙是您的计算机抵御网络入侵的第一道防线。 下载我们的速查表以确保您的安全。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作,并且经常同时进行。

10 条评论

一旦您打开任何计算机进行远程 ssh,也值得查看您的 ssh 日志文件。 您将看到不断尝试登录系统的行为。

很棒的文章,感谢您的辛勤工作! 这也是很好的建议,很多系统因为密码强度弱而被攻破。

它不起作用。我的学习环境如下:ubuntu 服务器,我的客户端(fedora)可以访问它。 我能够在服务器端(ubuntu 服务器)创建私钥和公钥,然后我运行了

ssh-copy-id -i ~/.ssh/lan.pub my_user@My_Server

它必须在服务器端还是客户端机器上运行?

当您使用 ssh-copy-id 时,您从您想要 SSH *连接到*的机器上使用它(这被认为是您的“本地”机器)。 在您描述的场景中,这意味着您将从您的 Fedora 机器上运行它。 听起来您已经这样做了(我假设您的服务器是 My_Server),所以它应该可以工作。 我需要了解更多关于您遇到的错误的信息。

评论部分不是获得支持的最佳形式。 我建议您访问 http://linuxquestions.org,注册一个帐户(免费),并在那里寻求帮助。 很多人都渴望提供帮助。

回复 作者 Rafael da Silv… (未验证)

您应该始终使用密码保护您的私钥。 我们不得不禁用对 HPC 系统的 SSH 密钥访问,因为用户没有为其密钥使用密码。

很好的观点。 我已更新文章以强调密钥本身密码的重要性。

回复 作者 jonathan

这是另一个 *非常* 有用的提示

ssh -Y sethkenlon@10.1.1.5

然后您可以从远程计算机运行任何基于 X 的程序,窗口将显示在您的本地计算机上。

所以我登录到我的 Raspberry Pi 并运行

$ pcmanfm

这将运行文件浏览器,窗口在我的本地计算机上!

只是一些改进的意见

除了在命令行中指定 sshkey 之外,您还可以使用 ssh-agent
首先将密钥与代理关联一次

eval `ssh-agent`
ssh-add

然后您可以使用

ssh-copy-id remotelogin@remotehost

将 ssh-agent 中注册的所有密钥复制到 remotehost。

下次 ssh 将自动尝试使用与 ssh-agent 关联的密钥

很棒的工作流程。 我喜欢先教手动方式,这样感觉不那么“神奇”(而且我经常使用 -i,因为我对不同的主机使用唯一的密钥)。 但我也喜欢您的方法。 也许它可以作为一篇附加文章的素材!

回复 作者 Joost Ringoot (未验证)

© . All rights reserved.