Skip to main content

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

作者 Justin Ellingwood

导言

SSH 是系统管理员需要掌握的一个基本工具。 SSH(即 Secure Shell,安全壳)是一种用于安全登录远程系统的协议。它是访问远程 Linux 服务器的最常见方式。 本指南中,我们将讨论如何使用SSH连接到远程系统。

核心语法

要使用 SSH 连接到一个远程系统,我们需要使用 ssh 命令。 如果你使用的是 Windows,需要安装一个 OpenSSH 的版本,以便能够从终端使用 ssh。如果你喜欢用 PowerShell 工作,可以按照微软文档的要求,将 OpenSSH 添加到 PowerShell 中。如果你希望使用一个完整的 Linux 环境,可以设置 WSL ,即 Linux 的 Windows 子系统,它将默认包括 ssh。第三个选择是安装轻量级的 Git for Windows,它提供了一个本地的 Windows bash 终端环境,其中包括 ssh 命令。以上各个选项均受到广泛支持,无论你决定使用哪一种,都将取决于你的偏好。 如果你使用的是 Mac 或 Linux,那么你的终端已经有了 ssh 命令。 该命令最直接的形式是:

$ ssh remote_host

以上例子中的 remote_host 指的是你试图连接的IP地址或域名。 这个命令假定你在远程系统上的用户名和本地系统上的用户名是一样的。 如果你在远程系统上的用户名不同,可以使用这个语法来指定它:

$ ssh remote_username@remote_host

连接到服务器之后,你可能需要提供一个密码来验证身份。稍后我们将介绍如何生成密钥来代替密码。 要退出ssh会话并返回到你的本地shell会话,只需键入:

$ exit

SSH是如何工作的?

SSH的工作原理是将客户端程序连接到叫做 sshd 的 ssh 服务器。 上一节中的 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

这份文件中的大多数选项都将保持不变,然而,有几个选项你可能想看一下:

Port 22

端口声明指定了 sshd 服务器的监听连接的端口,默认情况下是 22。除非有特别的原因,否则不要更改这个设置。如果你 确实 改变了端口,文章后面将告诉你如何连接到新的端口。

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

主机键声明指定了应该在哪里搜索全局主机键。我们将在后面讨论什么是主机键。

SyslogFacility AUTH
LogLevel INFO

这两项则表示日志应该是什么级别。 如果你在使用 SSH 时遇到困难,多进行日志记录可能是发现问题所在的好办法。

LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

这些参数指定了一些登录信息。 LoginGraceTime 指定了没有成功登录的情况下保持连接的秒数,最好把这个时间设置得比你正常登录所需时间稍高一点。 PermitRootLogin 选择是否允许 root 用户登录。 多数情况下,当你创建了一个可以(通过 susudo)访问高权限并可以通过 ssh 登录的用户账户时,应该把它改为 no,以尽量减少任何人获得服务器 root 权限的风险。 strictModes是一个安全防护措施,如果认证文件是所有人都可读的,它将拒绝登录尝试。 这可以防止在配置文件不安全的情况下尝试登录。

X11Forwarding yes
X11DisplayOffset 10

这些参数配置了 X11转发 功能。它允许你在本地系统上查看一个远程系统的图形用户界面(GUI)。 这个选项必须在服务器上启用,并在连接过程中通过 SSH 客户端的 -X 选项给出。 修改完成后,保存并关闭文件。如果你使用的是 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 端口是一种“通过隐匿实现安全(security through obscurity)”的合理方式。如果你允许 ssh 连接到22号端口的一个广为人知的的服务器,并且启用密码认证,那么你很可能会成为许多自动登录的尝试的攻击对象。完全使用基于密钥的认证和在非标准端口上运行 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

PasswordAuthentication no

还有两个不需要修改的设置(只要你以前没有修改过这个文件)是 PubkeyAuthenticationChallengeResponseAuthentication。它们是默认设置的,内容应如下:

PubkeyAuthentication yes
ChallengeResponseAuthentication no

修改后,保存并关闭该文件。 现在可以重新加载 SSH 守护进程:

$ sudo systemctl reload ssh

完成这步,密码认证应该已经被禁用了,你的服务器只能通过 SSH 密钥认证来访问。

结语

学习 SSH 将大大有利于你未来的云计算工作。使用各种选项时,你会发现更多的高级功能,这些能让你的工作更轻松。SSH 一直很受欢迎,因为它安全、轻便,在各种情况下都很有用。