如何使用SSH连接到远程服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

作为系统管理员需要掌握的一项重要工具是 SSH。

SSH 或 Secure Shell 是一种用于安全登录远程系统的协议。 这是访问远程 Linux 服务器的最常用方法。

在本指南中,我们将讨论如何使用 SSH 连接到远程系统。

核心语法

要使用 SSH 连接到远程系统,我们将使用 ssh 命令。

如果您使用的是 Windows,则需要安装 OpenSSH 版本才能从终端 ssh。 如果您更喜欢在 PowerShell 中工作,可以按照 Microsoft 的文档 将 OpenSSH 添加到 PowerShell。 如果您希望有一个完整的 Linux 环境可用,您可以 设置 WSL,这是适用于 Linux 的 Windows 子系统,默认情况下将包括 ssh。 最后,作为轻量级的第三个选项,您可以安装 Git for Windows,它提供了包含 ssh 命令的原生 Windows bash 终端环境。 这些中的每一个都得到了很好的支持,无论您决定使用哪个,都将归结为偏好。

如果您使用的是 Mac 或 Linux,您的终端中已经有 ssh 命令可用。

该命令最直接的形式是:

ssh remote_host

此示例中的 remote_host 是您尝试连接的 IP 地址或域名。

此命令假定您在远程系统上的用户名与您在本地系统上的用户名相同。

如果您的用户名在远程系统上不同,您可以使用以下语法指定它:

ssh remote_username@remote_host

连接到服务器后,可能会要求您通过提供密码来验证您的身份。 稍后,我们将介绍如何生成要使用的密钥而不是密码。

要退出 ssh 会话并返回到本地 shell 会话,请键入:

exit

SSH 是如何工作的?

SSH 通过将客户端程序连接到 ssh 服务器 来工作,称为 sshd

在上一节中,ssh 是客户端程序。 ssh 服务器 已经在我们指定的 remote_host 上运行。

在几乎所有 Linux 环境中,sshd 服务器应该会自动启动。 如果它由于任何原因没有运行,您可能需要通过基于 Web 的控制台或本地串行控制台临时访问您的服务器。

启动 ssh 服务器所需的过程取决于您使用的 Linux 发行版。

在 Ubuntu 上,您可以通过键入以下命令启动 ssh 服务器:

sudo systemctl start ssh

这应该启动 sshd 服务器,然后您可以远程登录。

如何配置 SSH

当您更改 SSH 的配置时,您正在更改 sshd 服务器的设置。

在 Ubuntu 中,主 sshd 配置文件位于 /etc/ssh/sshd_config

在编辑之前备份此文件的当前版本:

sudo cp /etc/ssh/sshd_config{,.bak}

使用 nano 或您喜欢的文本编辑器打开它:

sudo nano /etc/ssh/sshd_config

您将希望单独保留此文件中的大多数选项。 但是,您可能需要查看一些内容:

/etc/ssh/sshd_config

Port 22

端口声明指定 sshd 服务器将在哪个端口上侦听连接。 默认情况下,这是 22。 除非您有特定的理由不这样做,否则您可能应该不理会此设置。 如果您 do 更改您的端口,稍后我们将向您展示如何连接到新端口。

/etc/ssh/sshd_config

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

主机密钥声明指定在哪里查找全局主机密钥。 稍后我们将讨论什么是主机密钥。

/etc/ssh/sshd_config

SyslogFacility AUTH
LogLevel INFO

这两项指示应发生的日志记录级别。

如果您在使用 SSH 时遇到困难,那么增加日志记录的数量可能是发现问题所在的好方法。

/etc/ssh/sshd_config

LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

这些参数指定了一些登录信息。

LoginGraceTime 指定在没有成功登录的情况下保持连接活动的秒数。

将此时间设置为略高于您正常登录所需的时间可能是个好主意。

PermitRootLogin选择是否允许root用户登录。

在大多数情况下,当您创建了有权访问提升权限(通过 susudo)并可以通过 ssh 登录的用户帐户时,应将其更改为 no ,以最大程度地降低任何人获得对您服务器的 root 访问权限的风险。

strictModes 是一个安全防护,如果每个人都可以读取身份验证文件,它将拒绝登录尝试。

当配置文件不安全时,这可以防止登录尝试。

/etc/ssh/sshd_config

X11Forwarding yes
X11DisplayOffset 10

这些参数配置称为 X11 Forwarding 的功能。 这允许您在本地系统上查看远程系统的图形用户界面 (GUI)。

此选项必须在服务器上启用,并在与 -X 选项连接期间与 SSH 客户端一起提供。

进行更改后,保存并关闭文件。 如果您正在使用 nano,请按 Ctrl+X,然后在出现提示时按 Y,然后按 Enter。

如果您更改了 /etc/ssh/sshd_config 中的任何设置,请确保重新加载 sshd 服务器以实现您的修改:

sudo systemctl reload ssh

您应该彻底测试您的更改,以确保它们以您期望的方式运行。

在进行更改时打开几个终端会话可能是个好主意。 这将允许您在必要时恢复配置,而不会将自己锁定。

如何使用密钥登录 SSH

虽然能够使用密码登录到远程系统很有帮助,但设置 基于密钥的身份验证 会更快、更安全。

基于密钥的身份验证如何工作?

基于密钥的身份验证通过创建一对密钥来工作:私钥公钥

私钥 位于客户端计算机上,并且受到保护并保密。

公钥 可以提供给任何人,也可以放置在您希望访问的任何服务器上。

当您尝试使用密钥对进行连接时,服务器将使用公钥为客户端计算机创建一条消息,该消息只能使用私钥读取。

然后客户端计算机将适当的响应发送回服务器,服务器将知道客户端是合法的。

此过程会在您配置密钥后自动执行。

如何创建 SSH 密钥

SSH 密钥应在您希望从 登录 的计算机上生成。 这通常是您的本地计算机。

在命令行中输入以下内容:

ssh-keygen -t rsa

系统可能会提示您为密钥文件本身设置密码,但这是一种相当少见的做法,您应该在提示中按 Enter 键以接受默认值。 您的密钥将在 ~/.ssh/id_rsa.pub~/.ssh/id_rsa 创建。

通过键入以下内容进入 .ssh 目录:

cd ~/.ssh

查看文件的权限:

ls -l
Output-rw-r--r-- 1 demo demo  807 Sep  9 22:15 authorized_keys
-rw------- 1 demo demo 1679 Sep  9 23:13 id_rsa
-rw-r--r-- 1 demo demo  396 Sep  9 23:13 id_rsa.pub

如您所见,id_rsa 文件仅对所有者可读和可写。 这有助于保密。

但是,id_rsa.pub 文件可以共享,并且具有适合此活动的权限。

如何将您的公钥传输到服务器

如果您当前对服务器具有基于密码的访问权限,则可以通过发出以下命令将公钥复制到该服务器:

ssh-copy-id remote_host

这将启动一个 SSH 会话。 输入密码后,它会将您的公钥复制到服务器的授权密钥文件中,这样您下次无需密码即可登录。

客户端选项

通过 SSH 连接时,您可以提供许多可选标志。

其中一些可能需要匹配远程主机的 sshd 配置中的设置。

例如,如果您更改了 sshd 配置中的端口号,则需要通过键入以下内容来匹配客户端上的该端口:

ssh -p port_number remote_host

注意: 改变你的 ssh 端口是通过默默无闻 提供 安全性的合理方式。 如果您在端口 22 上允许 ssh 连接到一个广为人知的服务器部署,并且您启用了密码身份验证,那么您可能会受到许多自动登录尝试的攻击。 仅使用基于密钥的身份验证并在非标准端口上运行 ssh 并不是您可以采用的最复杂的安全解决方案,但应该将这些减少到最低限度。


如果您只想在远程系统上执行单个命令,您可以在主机之后指定它,如下所示:

ssh remote_host command_to_run

您将连接到远程机器,进行身份验证,然后执行命令。

正如我们之前所说,如果在两台计算机上都启用了 X11 转发,您可以通过键入以下内容来访问该功能:

ssh -X remote_host

如果您的计算机上有适当的工具,您在远程系统上使用的 GUI 程序现在将在您的本地系统上打开它们的窗口。

禁用密码验证

如果您已创建 SSH 密钥,则可以通过禁用仅密码身份验证来增强服务器的安全性。 除了控制台之外,登录服务器的唯一方法是通过与您在服务器上安装的公钥配对的私钥。

警告: 在继续执行此步骤之前,请确保您已将公钥安装到您的服务器。 否则,您将被锁定!


root 或具有 sudo 权限的用户,打开 sshd 配置文件:

sudo nano /etc/ssh/sshd_config

找到读取 Password Authentication 的行,并通过删除前导 # 取消注释。 然后您可以将其值更改为 no

/etc/ssh/sshd_config

PasswordAuthentication no

另外两个不需要修改的设置(前提是您之前没有修改过此文件)是 PubkeyAuthenticationChallengeResponseAuthentication。 它们是默认设置的,应如下所示:

/etc/ssh/sshd_config

PubkeyAuthentication yes
ChallengeResponseAuthentication no

进行更改后,保存并关闭文件。

您现在可以重新加载 SSH 守护程序:

sudo systemctl reload ssh

现在应该禁用密码身份验证,并且您的服务器应该只能通过 SSH 密钥身份验证来访问。

结论

了解如何使用 SSH 将极大地有益于您未来的任何云计算工作。 当您使用各种选项时,您会发现更高级的功能可以让您的生活更轻松。 SSH 一直很受欢迎,因为它安全、轻量并且在各种情况下都很有用。

接下来,您可能想了解 与 SFTP 一起执行命令行文件传输。