SSH 是一种安全协议,用作远程连接 Linux 服务器的主要方式。它通过生成远程 shell 来提供基于文本的界面。连接后,您在本地终端中输入的所有命令都会发送到远程服务器并在那里执行。
在这份备忘单式的指南中,我们将介绍一些使用 SSH 连接来实现您的目标的常见方法。当您需要了解如何以不同方式连接或配置服务器时,这可以用作快速参考。
- 阅读SSH 概述部分首先,如果您一般不熟悉 SSH 或者刚刚开始使用。
- 使用适用于您想要实现的目标的后续部分。大多数部分不以任何其他部分为基础,因此您可以独立使用以下示例。
- 使用本页左侧的“内容”菜单(页面宽度较宽)或浏览器的查找功能来找到您需要的部分。
- Copy and paste the command-line examples given, substituting the
highlighted
values with your own values.
连接远程 Linux 服务器的最常见方法是通过 SSH。 SSH 代表 Secure Shell,提供一种安全可靠的方式来远程执行命令、进行更改和配置服务。通过 SSH 连接时,您可以使用远程服务器上存在的帐户登录。
当您通过 SSH 连接时,您将进入 shell 会话,这是一个基于文本的界面,您可以在其中与服务器交互。在 SSH 会话期间,您在本地终端中键入的任何命令都将通过加密的 SSH 隧道发送并在您的服务器上执行。
SSH 连接是使用客户端-服务器模型实现的。这意味着要建立 SSH 连接,远程计算机必须运行名为 SSH 守护程序的软件。该软件侦听特定网络端口上的连接,验证连接请求,并在用户提供正确的凭据时生成适当的环境。
用户的计算机必须有 SSH 客户端。这是一款知道如何使用 SSH 协议进行通信的软件,并且可以获取有关要连接的远程主机、要使用的用户名以及应传递以进行身份验证的凭据的信息。客户端还可以指定有关他们想要建立的连接类型的某些详细信息。
客户端通常使用密码(安全性较低且不推荐)或非常安全的 SSH 密钥进行身份验证。
密码登录经过加密,对于新用户来说很容易理解。然而,自动化机器人和恶意用户通常会反复尝试对允许基于密码登录的帐户进行身份验证,这可能会导致安全隐患。因此,我们建议始终为大多数配置设置基于 SSH 密钥的身份验证。
SSH 密钥是一组可用于身份验证的匹配加密密钥。每组包含一个公钥和一个私钥。公钥可以自由共享而无需担心,而私钥则必须警惕保管,切勿泄露给任何人。
要使用 SSH 密钥进行身份验证,用户的本地计算机上必须有 SSH 密钥对。在远程服务器上,必须将公钥复制到用户主目录中的文件中~/.ssh/authorized_keys
。该文件包含一个公钥列表,每行一个,这些密钥被授权登录到该帐户。
当客户端连接到主机并希望使用 SSH 密钥身份验证时,它将将此意图通知服务器并告诉服务器要使用哪个公钥。然后服务器检查其authorized_keys
文件中的公钥,生成一个随机字符串,并使用公钥对其进行加密。该加密消息只能使用关联的私钥进行解密。服务器将将此加密消息发送给客户端,以测试他们是否确实拥有关联的私钥。
收到此消息后,客户端将使用私钥对其进行解密,并将显示的随机字符串与先前协商的会话 ID 结合起来。然后,它生成该值的 MD5 哈希值并将其传输回服务器。服务器已经拥有原始消息和会话 ID,因此它可以比较这些值生成的 MD5 哈希值并确定客户端必须拥有私钥。
现在您已经了解了 SSH 的工作原理,我们可以开始讨论一些示例来演示使用 SSH 的不同方式
本节将介绍如何在客户端计算机上生成 SSH 密钥并将公钥分发到应使用它们的服务器。如果您以前没有生成密钥,那么这是一个很好的开始部分,因为它可以提高未来连接的安全性。
在本地计算机上生成新的 SSH 公钥和私钥对是无需密码即可通过远程服务器进行身份验证的第一步。除非有充分的理由不这样做,否则您应该始终使用 SSH 密钥进行身份验证。
许多加密算法可用于生成 SSH 密钥,包括 RSA、DSA 和 ECDSA。 RSA 密钥通常是首选,并且是默认密钥类型。
要在本地计算机上生成 RSA 密钥对,请键入:
- ssh 密钥生成器
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
此提示允许您选择存储 RSA 私钥的位置。按ENTER
将此保留为默认值,这会将它们存储在.ssh
用户主目录中的隐藏目录。保留选择的默认位置将允许 SSH 客户端自动查找密钥。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
下一个提示允许您输入任意长度的密码以保护您的私钥。默认情况下,您每次使用私钥时都必须输入在此处设置的任何密码,作为额外的安全措施。随意按ENTER
如果您不需要密码,请将此留空。但请记住,这将允许任何控制您的私钥的人登录您的服务器。
如果您选择输入密码,则键入时不会显示任何内容。这是一项安全预防措施。
Output
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
此过程生成了一个 RSA SSH 密钥对,位于.ssh
用户主目录中的隐藏目录。这些文件是:
-
~/.ssh/id_rsa
: 私钥。不要共享此文件!
-
~/.ssh/id_rsa.pub
:关联的公钥。这可以自由共享,不会产生任何后果。
SSH 密钥默认为 2048 位。通常认为这对于安全性而言足够好,但您可以为更坚固的密钥指定更多的位数。
为此,请包括-b
参数与您想要的位数。大多数服务器支持长度至少为 4096 位的密钥。出于 DDOS 保护目的,可能不接受较长的密钥:
- ssh 密钥生成器-b 4096
如果您之前创建了不同的密钥,系统会询问您是否要覆盖以前的密钥:
Overwrite (y/n)?
如果您选择“是”,您之前的密钥将被覆盖,您将无法再使用该密钥登录服务器。因此,请务必谨慎覆盖密钥。
如果您已为私钥生成了密码并希望更改或删除它,您可以轻松完成此操作。
Note:要更改或删除密码,您必须知道原始密码。如果您丢失了密钥的密码,则无法追索,并且必须生成新的密钥对。
要更改或删除密码,只需键入:
- ssh 密钥生成器-p
Enter file in which the key is (/root/.ssh/id_rsa):
您可以键入要修改的按键位置或按ENTER
接受默认值:
Enter old passphrase:
输入您想要更改的旧密码。然后系统将提示您输入新密码:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
在这里输入您的新密码或按ENTER
删除密码。
每个 SSH 密钥对共享一个加密“指纹”,可用于唯一标识密钥。这在多种情况下都很有用。
要查找 SSH 密钥的指纹,请键入:
- ssh 密钥生成器-l
Enter file in which the key is (/root/.ssh/id_rsa):
您可以按ENTER
如果这是密钥的正确位置,则输入修改后的位置。您将获得一个字符串,其中包含密钥的位长、指纹、为其创建的帐户和主机以及所使用的算法:
Output
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)
要将您的公钥复制到服务器,从而无需密码即可进行身份验证,可以采取多种方法。
如果您当前为服务器配置了基于密码的 SSH 访问,并且您拥有ssh-copy-id
安装实用程序,这是一个简单的过程。这ssh-copy-id
许多 Linux 发行版的 OpenSSH 软件包中都包含该工具,因此很可能默认安装它。
如果您有此选项,您可以通过键入以下内容轻松转移您的公钥:
- ssh-copy-id username@remote_host
这将提示您输入远程系统上的用户帐户密码:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
demo@111.111.11.111's password:
输入密码后,您的内容~/.ssh/id_rsa.pub
密钥将附加到用户帐户的末尾~/.ssh/authorized_keys
file:
Output
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'demo@111.111.11.111'"
and check to make sure that only the key(s) you wanted were added.
您现在无需密码即可登录该帐户:
-
ssh username@remote_host
如果您没有ssh-copy-id
实用程序可用,但仍然可以通过基于密码的 SSH 访问远程服务器,您可以以不同的方式复制公钥的内容。
您可以输出密钥的内容并将其通过管道传输到ssh
命令。在远程端,您可以确保~/.ssh
目录存在,然后将管道内容附加到~/.ssh/authorized_keys
file:
-
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
系统将要求您提供远程帐户的密码:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
demo@111.111.11.111's password:
输入密码后,您的密钥将被复制,让您无需密码即可登录:
-
ssh username@remote_IP_host
如果您没有可用的基于密码的 SSH 访问,则必须手动将公钥添加到远程服务器。
在本地计算机上,您可以通过键入以下内容找到公钥文件的内容:
-
cat〜/.ssh/id_rsa.pub
Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
您可以复制该值,然后手动将其粘贴到远程服务器上的适当位置。您必须通过其他方式(例如 DigitalOcean Web 控制台)登录远程服务器。
在远程服务器上创建~/.ssh
目录(如果不存在):
-
mkdir -p ~/.ssh
之后,您可以创建或附加~/.ssh/authorized_keys
通过键入以下内容创建文件:
-
echo public_key_string >> ~/.ssh/authorized_keys
您现在应该能够无需密码登录远程服务器。
以下部分将介绍有关如何使用 SSH 连接到服务器的一些基础知识。
要连接到远程服务器并在那里打开 shell 会话,您可以使用ssh
命令。
最简单的形式假设您本地计算机上的用户名与远程服务器上的用户名相同。如果这是真的,您可以使用以下方式进行连接:
-
ssh remote_host
如果您的用户名在远程服务器上不同,您需要像这样传递远程用户名:
-
ssh username@remote_host
第一次连接到新主机时,您将看到一条如下所示的消息:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Type yes
接受远程主机的真实性。
如果您使用密码身份验证,系统将提示您在此处输入远程帐户的密码。如果您使用 SSH 密钥,系统将提示您输入私钥密码(如果已设置),否则您将自动登录。
要在远程服务器上运行单个命令而不是生成 shell 会话,您可以在连接信息后添加该命令,如下所示:
-
ssh username@remote_host command_to_run
这将连接到远程主机,使用您的凭据进行身份验证,并执行您指定的命令。此后连接将立即关闭。
默认情况下,服务器上的 SSH 守护程序在端口上运行22
。您的 SSH 客户端在尝试连接时会假设是这种情况。如果您的 SSH 服务器正在侦听非标准端口(这将在后面的部分中演示),则在与客户端连接时必须指定新的端口号。
您可以通过指定端口号来完成此操作-p
option:
-
ssh -p port_num username@remote_host
为了避免每次登录远程服务器时都必须执行此操作,您可以在~/.ssh
本地计算机主目录中的目录。
立即编辑或创建文件,输入:
-
nano〜/ .ssh /配置
在这里,您可以设置特定于主机的配置选项。要指定新端口,请使用如下格式:
〜/ .ssh /配置
Host remote_alias
HostName remote_host
Port port_num
这将允许您无需在命令行上指定特定端口号即可登录。
如果您的 SSH 私钥上有密码,则每次使用它连接到远程主机时,系统都会提示您输入该密码。
为了避免重复执行此操作,您可以运行 SSH 代理。这个小实用程序会在您第一次输入密码后存储您的私钥。它将在您的终端会话期间可用,使您将来无需重新输入密码即可进行连接。
如果您需要转发 SSH 凭据(稍后显示),这一点也很重要。
要启动 SSH 代理,请在本地终端会话中键入以下内容:
-
eval $(ssh代理)
Output
Agent pid 10891
这将启动代理程序并将其置于后台。现在,您需要将您的私钥添加到代理,以便它可以管理您的密钥:
- ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)
您必须输入密码(如果已设置)。之后,您的身份文件将添加到代理中,允许您使用密钥登录,而无需再次重新输入密码。
如果您希望能够在没有密码的情况下从另一台服务器连接到另一台服务器,则需要转发您的 SSH 密钥信息。这将允许您使用本地计算机上的凭据通过您连接到的服务器向另一台服务器进行身份验证。
首先,您必须启动 SSH 代理并将 SSH 密钥添加到代理中(请参阅前面的内容)。完成此操作后,您需要使用以下命令连接到您的第一台服务器-A
选项。这会将您的凭据转发到此会话的服务器:
-
ssh -A username@remote_host
从这里,您可以通过 SSH 登录到您的 SSH 密钥有权访问的任何其他主机。您将进行连接,就好像您的 SSH 私钥位于该服务器上一样。
本节包含一些常见的服务器端配置选项,这些选项可以决定服务器响应的方式以及允许的连接类型。
如果您已配置、测试并正常工作 SSH 密钥,则禁用密码身份验证可能是个好主意。这将阻止任何用户使用密码通过 SSH 登录。
为此,请连接到远程服务器并打开/etc/ssh/sshd_config
具有 root 或 sudo 权限的文件:
-
sudo nano/etc/ssh/sshd_config
在文件内部,搜索PasswordAuthentication
指示。如果已注释掉,请取消注释。将其设置为no
禁用密码登录:
/etc/ssh/sshd_config
PasswordAuthentication no
进行更改后,保存并关闭文件。要实施更改,您应该重新启动 SSH 服务。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
现在,系统上的所有帐户将无法使用密码通过 SSH 登录。
一些管理员建议您更改 SSH 运行的默认端口。这可以帮助减少您的服务器遭受自动机器人的身份验证尝试的次数。
要更改 SSH 守护程序侦听的端口,您必须登录到远程服务器。打开sshd_config
通过使用该用户登录或使用 root 权限在远程系统上创建文件sudo
:
-
sudo nano/etc/ssh/sshd_config
进入后,您可以通过查找以下命令来更改 SSH 运行的端口:Port 22
规范并修改它以反映您希望使用的端口。例如,将端口更改为4444
,将其放入您的文件中:
/etc/ssh/sshd_config
#Port 22
Port 4444
完成后保存并关闭文件。要实施更改,您必须重新启动 SSH 守护程序。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
守护程序重新启动后,您将需要通过指定端口号进行身份验证(在前面的部分中已演示)。
要明确限制能够通过 SSH 登录的用户帐户,您可以采取几种不同的方法,每种方法都涉及编辑 SSH 守护程序配置文件。
在远程服务器上,现在使用 root 或 sudo 权限打开此文件:
-
sudo nano/etc/ssh/sshd_config
指定允许登录的帐户的第一种方法是使用AllowUsers
指示。搜索AllowUsers
文件中的指令。如果不存在,请在任何地方创建它。在该指令之后,列出应允许通过 SSH 登录的用户帐户:
/etc/ssh/sshd_config
AllowUsers user1 user2
保存并关闭文件。重新启动守护程序以实施您的更改。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
如果您更熟悉群组管理,您可以使用AllowGroups
指令代替。如果是这种情况,只需添加一个应允许 SSH 访问的组(我们将创建该组并立即添加成员):
/etc/ssh/sshd_config
AllowGroups sshmembers
保存并关闭文件。
现在,您可以通过键入以下内容来创建与您指定的组匹配的系统组(没有主目录):
-
sudo groupadd -r sshmembers
确保将所需的任何用户帐户添加到该组中。这可以通过输入以下内容来完成:
-
sudo usermod -a -G sshmembers user1
-
sudo usermod -a -G sshmembers user2
现在,重新启动 SSH 守护程序以实施您的更改。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
通常建议您在设置具有以下功能的 SSH 用户帐户后完全禁用通过 SSH 的 root 登录:sudo
特权。
为此,请在远程服务器上使用 root 或 sudo 打开 SSH 守护程序配置文件。
-
sudo nano/etc/ssh/sshd_config
在里面,搜索一个名为PermitRootLogin
。如果有注释,请取消注释。将值更改为“否”:
/etc/ssh/sshd_config
PermitRootLogin no
保存并关闭文件。要实施更改,请重新启动 SSH 守护程序。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
在某些情况下,您可能希望一般禁用 root 访问权限,但又启用它以允许某些应用程序正确运行。备份例程就是一个例子。
这可以通过 root 用户的authorized_keys
文件,其中包含被授权使用该帐户的 SSH 密钥。
将您希望用于此过程的本地计算机密钥(我们建议为每个自动过程创建一个新密钥)添加到 root 用户的密钥authorized_keys
服务器上的文件。我们将演示与ssh-copy-id
命令在这里,但您可以使用我们在其他部分中讨论的任何复制密钥的方法:
- ssh-copy-id root@remote_host
现在,登录远程服务器。我们需要调整条目authorized_keys
文件,因此使用 root 或 sudo 访问权限打开它:
-
sudo nano/root/.ssh/authorized_keys
在包含您上传的密钥的行的开头,添加command=
定义该键有效的命令的列表。这应该包括可执行文件的完整路径以及任何参数:
/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...
完成后保存并关闭文件。
现在,打开sshd_config
具有 root 或 sudo 权限的文件:
-
sudo nano/etc/ssh/sshd_config
查找指令PermitRootLogin
,并将值更改为forced-commands-only
。仅当为密钥指定命令时,才允许 SSH 密钥登录使用 root:
/etc/ssh/sshd_config
PermitRootLogin forced-commands-only
保存并关闭文件。重新启动 SSH 守护程序以实施您的更改。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
SSH 守护程序可以配置为自动将服务器上 X 应用程序的显示转发到客户端计算机。为了使其正常工作,客户端必须配置并启用 X windows 系统。
要启用此功能,请登录到远程服务器并编辑sshd_config
以 root 身份或具有 sudo 权限的文件:
-
sudo nano/etc/ssh/sshd_config
搜索X11Forwarding
指示。如果已注释掉,请取消注释。如有必要,创建它并将值设置为“yes”:
/etc/ssh/sshd_config
X11Forwarding yes
保存并关闭文件。重新启动 SSH 守护程序以实施这些更改。
在 Ubuntu/Debian 上:
-
sudo service ssh重新开始
在 CentOS/Fedora 上:
-
sudo servicesshd 重新启动
要连接到服务器并转发应用程序的显示,您必须传递-X
连接时客户端的选项:
-
ssh -X username@remote_host
通过此会话在服务器上启动的图形应用程序应显示在本地计算机上。性能可能有点慢,但在紧要关头非常有帮助。
在下一节中,我们将重点介绍您可以在连接的客户端进行的一些调整。
在本地计算机上,您可以为连接到的部分或全部服务器定义单独的配置。这些可以存储在~/.ssh/config
文件,每次调用时都会由 SSH 客户端读取。
在本地计算机上的文本编辑器中创建或打开此文件:
-
nano〜/ .ssh /配置
在内部,您可以通过引入每个配置选项来定义单独的配置选项Host
关键字,后跟别名。在其下方并缩进,您可以定义在ssh_config
手册页:
-
manssh_配置
一个示例配置是:
〜/ .ssh /配置
Host testhost
HostName your_domain
Port 4444
User demo
然后您可以连接到your_domain
在港口4444
使用用户名demo
只需输入:
-
ssh测试主机
您还可以使用通配符来匹配多个主机。请记住,后面的匹配可以覆盖前面的匹配。因此,您应该将最常见的匹配项放在顶部。例如,您可以默认所有连接不允许 X 转发,并覆盖your_domain
通过将其包含在您的文件中:
〜/ .ssh /配置
Host *
ForwardX11 no
Host testhost
HostName your_domain
ForwardX11 yes
Port 4444
User demo
完成后保存并关闭文件。
如果您发现自己在准备好之前就与 SSH 会话断开连接,则您的连接可能超时。
您可以将客户端配置为每隔一段时间向服务器发送一个数据包,以避免出现这种情况:
在本地计算机上,您可以通过编辑您的~/.ssh/config
文件。现在打开它:
-
nano〜/ .ssh /配置
如果尚不存在,请在文件顶部定义一个将匹配所有主机的部分。设置ServerAliveInterval
设置为“120”每两分钟向服务器发送一个数据包。这应该足以通知服务器不要关闭连接:
〜/ .ssh /配置
Host *
ServerAliveInterval 120
完成后保存并关闭文件。
默认情况下,每当您连接到新服务器时,您都会看到远程 SSH 守护程序的主机密钥指纹。
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
经过配置,您可以验证尝试连接的主机的真实性,并发现恶意用户可能试图伪装成远程主机的实例。
在某些情况下,您可能希望禁用此功能。Note:这可能会带来很大的安全风险,因此如果您这样设置系统,请确保您知道自己在做什么。
要进行更改,请打开~/.ssh/config
本地计算机上的文件:
-
nano〜/ .ssh /配置
如果尚不存在,请在文件顶部定义一个将匹配所有主机的部分。设置StrictHostKeyChecking
指示no
自动添加新主机到known_hosts
文件。设置UserKnownHostsFile
to /dev/null
不要对新的或更改的主机发出警告:
〜/ .ssh /配置
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
您可以通过反转其他主机的这些选项来根据具体情况启用检查。默认为StrictHostKeyChecking
is ask
:
〜/ .ssh /配置
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host testhost
HostName your_domain
StrictHostKeyChecking ask
UserKnownHostsFile /home/demo/.ssh/known_hosts
在某些情况下,建立新的 TCP 连接可能需要比您期望的时间更长的时间。如果要与同一台计算机建立多个连接,则可以利用多路复用。
SSH 多路复用为多个 SSH 会话重复使用相同的 TCP 连接。这消除了建立新会话所需的一些工作,可能会加快速度。出于其他原因,限制连接数量也可能有所帮助。
要设置多路复用,您可以手动设置连接,也可以将客户端配置为在可用时自动使用多路复用。我们将在这里演示第二个选项。
要配置多路复用,请在本地计算机上编辑 SSH 客户端的配置文件:
-
nano〜/ .ssh /配置
如果文件顶部还没有通配符主机定义,请立即添加一个(如Host *
)。我们将设置ControlMaster
, ControlPath
, and ControlPersist
值来建立我们的多路复用配置。
The ControlMaster
应设置为“auto”,以便能够在可能的情况下自动允许多路复用。这ControlPath
将建立控制套接字的路径。第一个会话将创建此套接字,后续会话将能够找到它,因为它由用户名、主机和端口标记。
设置ControlPersist
选项1
将允许初始主连接在后台运行。这1
指定 TCP 连接应在最后一个 SSH 会话关闭后一秒自动终止:
/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
完成后保存并关闭文件。现在,我们需要实际创建我们在控制路径中指定的目录:
-
mkdir〜/.ssh/多路复用
现在,与同一台计算机建立的任何会话都将尝试使用现有的套接字和 TCP 连接。当最后一个会话存在时,连接将在一秒后断开。
如果由于某种原因您需要暂时绕过多路复用配置,您可以通过传递-S
标志与none
:
-
ssh -S none username@remote_host
通过安全 SSH 隧道传输其他流量是解决限制性防火墙设置的绝佳方法。这也是对未加密的网络流量进行加密的好方法。
SSH 连接可用于将流量从本地主机上的端口传输到远程主机上的端口。
本地连接是一种通过远程主机从本地计算机访问网络位置的方法。首先,与远程主机建立 SSH 连接。在远程服务器上,与用户提供的外部(或内部)网络地址建立连接,并且到此位置的流量通过隧道传输到指定端口上的本地计算机。
这通常用于通过绕过防火墙来隧道到限制较少的网络环境。另一个常见用途是从远程位置访问“仅限本地主机”的 Web 界面。
要建立到远程服务器的本地隧道,您需要使用-L
连接时的参数,您必须提供三项附加信息:
- 您希望访问隧道连接的本地端口。
- 您希望远程主机连接到的主机。
- 您希望远程主机连接的端口。
这些按照上面的顺序给出(用冒号分隔),作为参数-L
旗帜。我们还将使用-f
标志,这会导致 SSH 在执行之前进入后台,并且-N
标志,它不会打开 shell 或在远程端执行程序。
例如,要连接到your_domain
在远程主机的端口 80 上,使连接在本地计算机的端口 8888 上可用,您可以键入:
-
ssh -f -N -L 8888:your_domain:80 username@remote_host
现在,如果您将本地网络浏览器指向127.0.0.1:8888
,你应该看到任何内容your_domain
在港口80
.
更通用的语法指南是:
-
ssh -L your_port:site_or_IP_to_access:site_port username@host
由于该连接位于后台,因此您必须找到其 PID 才能终止它。您可以通过搜索您转发的端口来执行此操作:
-
ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
然后,您可以通过定位 PID 来终止该进程,PID 是与您的 SSH 命令匹配的行的第二列中的数字:
-
kill 5965
另一种选择是启动连接without the -f
旗帜。这将使连接保持在前台,从而防止您在转发期间使用终端窗口。这样做的好处是你可以通过输入轻松地杀死隧道CTRL-C
.
SSH 连接可用于将流量从本地主机上的端口传输到远程主机上的端口。
在远程隧道中,与远程主机建立连接。在修建隧道的过程中,remote端口已指定。然后,远程主机上的此端口将通过隧道连接到从本地计算机连接的主机和端口组合。这将允许远程计算机通过您的本地计算机访问主机。
如果您需要允许访问锁定到外部连接的内部网络,这会很有用。如果防火墙允许连接out网络,这将允许您连接到远程计算机并将流量从该计算机传输到内部网络上的某个位置。
要建立到远程服务器的远程隧道,您需要使用-R
连接时的参数,您必须提供三项附加信息:
- 远程主机可以访问隧道连接的端口。
- 您希望本地计算机连接到的主机。
- 您希望本地计算机连接到的端口。
这些按照上面的顺序给出(用冒号分隔),作为参数-R
旗帜。我们还将使用-f
标志,这会导致 SSH 在执行之前进入后台,并且-N
标志,它不会打开 shell 或在远程端执行程序。
例如,要连接到your_domain
在我们本地计算机上的端口 80 上,使连接在我们的远程主机上的端口上可用8888
,您可以输入:
-
ssh -f -N -R 8888:your_domain:80 username@remote_host
现在,在远程主机上,打开 Web 浏览器127.0.0.1:8888
可以让你看到任何内容your_domain
在港口80
.
更通用的语法指南是:
-
ssh -R remote_port:site_or_IP_to_access:site_port username@host
由于该连接位于后台,因此您必须找到其 PID 才能终止它。您可以通过搜索您转发的端口来执行此操作:
-
ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
然后,您可以通过定位与 SSH 命令匹配的行的 PID(第二列中的数字)来终止该进程:
-
kill 5965
另一种选择是启动连接without the -f
旗帜。这将使连接保持在前台,从而防止您在转发期间使用终端窗口。这样做的好处是你可以通过输入轻松地杀死隧道CTRL-C
.
SSH 连接可用于将流量从本地主机上的端口传输到远程主机上的端口。
动态隧道与本地隧道类似,它允许本地计算机连接到其他资源through远程主机。动态隧道只需指定单个本地端口即可实现此目的。希望利用此端口进行隧道传输的应用程序必须能够使用 SOCKS 协议进行通信,以便数据包可以在隧道的另一端正确重定向。
传递到此本地端口的流量将被发送到远程主机。从那里,SOCKS 协议将被解释以建立到所需终端位置的连接。此设置允许支持 SOCKS 的应用程序通过远程服务器连接到任意数量的位置,而无需多个静态隧道。
为了建立连接,我们将通过-D
标记以及我们希望访问隧道的本地端口。我们还将使用-f
标志,这会导致 SSH 在执行之前进入后台,并且-N
标志,它不会打开 shell 或在远程端执行程序。
例如,在端口上建立隧道7777
,您可以输入:
-
ssh -f -N -D 7777 username@remote_host
从这里,您可以开始将 SOCKS 感知应用程序(如 Web 浏览器)指向您选择的端口。应用程序将其信息发送到与端口关联的套接字中。
将流量引导至 SOCKS 端口的方法将根据应用程序的不同而有所不同。例如,在 Firefox 中,一般位置是首选项 > 高级 > 设置 > 手动代理配置。在 Chrome 中,您可以使用以下命令启动应用程序--proxy-server=
标志设置。您将需要使用本地主机接口和您转发的端口。
由于该连接位于后台,因此您必须找到其 PID 才能终止它。您可以通过搜索您转发的端口来执行此操作:
-
ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
然后,您可以通过定位与 SSH 命令匹配的行的 PID(第二列中的数字)来终止该进程:
-
kill 5965
另一种选择是启动连接without the -f
旗帜。这将使连接保持在前台,从而防止您在转发期间使用终端窗口。这样做的好处是你可以通过输入轻松地杀死隧道CTRL-C
.
即使在建立 SSH 会话之后,也可以从终端内部对连接进行控制。我们可以使用 SSH 转义码来做到这一点,它允许我们在会话中与本地 SSH 软件进行交互。
OpenSSH 最有用但在很大程度上被忽视的功能之一是能够从内部控制会话的某些方面。
这些命令可以从以下命令开始执行~
SSH 会话中的控制字符。仅当控制命令是换行符后键入的第一个命令时,才会对其进行解释,因此在使用命令之前,请务必按 ENTER 键一两次。
最有用的控件之一是能够启动与客户端的断开连接。 SSH 连接通常由服务器关闭,但如果服务器出现问题或连接已断开,这可能会出现问题。通过使用客户端断开连接,可以从客户端彻底关闭连接。
要关闭来自客户端的连接,请使用控制字符 (~
),带点。如果您的连接出现问题,您可能会陷入终端会话卡住的状态。尽管缺乏反馈,但仍键入命令来执行客户端断开连接:
-
[ENTER]
- ~.
连接应立即关闭,使您返回到本地 shell 会话。
OpenSSH 最有用但又被忽视的功能之一是能够从连接内控制会话的某些方面。
这些命令可以从以下命令开始执行~
来自 SSH 连接内的控制字符。仅当控制命令是换行符后键入的第一个命令时才会被解释,因此请始终按ENTER
使用前一两次。
它提供的一项功能是将 SSH 会话置于后台。为此,我们需要提供控制字符(~
),然后执行传统的键盘快捷键将任务置于后台(CTRL-z):
-
[ENTER]
- ~[CTRL-z]
这会将连接置于后台,让您返回到本地 shell 会话。要返回 SSH 会话,您可以使用传统的作业控制机制。
您可以通过键入以下内容立即重新激活最近的后台任务:
-
fg
如果您有多个后台任务,您可以通过键入以下内容来查看可用的作业:
-
jobs
Output
[1]+ Stopped ssh username@some_host
[2] Stopped ssh username@another_host
然后,您可以使用第一列中带有百分号的索引将任何任务带到前台:
-
fg %2
OpenSSH 最有用但又被忽视的功能之一是能够从连接内控制会话的某些方面。
这些命令可以从以下命令开始执行~
来自 SSH 连接内的控制字符。仅当控制命令是换行符后键入的第一个命令时,才会对其进行解释,因此在使用命令之前,请务必按 ENTER 键一两次。
这允许用户在建立连接后更改端口转发配置。这允许您即时创建或拆除端口转发规则。
这些功能是 SSH 命令行界面的一部分,可以在会话期间使用控制字符 (~
)和“C”:
-
[ENTER]
- ~C
ssh>
您将看到一个 SSH 命令提示符,其中包含非常有限的有效命令集。要查看可用选项,您可以键入-h
从这个提示。如果没有返回任何内容,您可能必须使用以下命令来增加 SSH 输出的详细程度~v
几次:
-
[ENTER]
- ~v
- ~v
- ~v
- ~C
-
-h
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KL[bind_address:]port Cancel local forward
-KR[bind_address:]port Cancel remote forward
-KD[bind_address:]port Cancel dynamic forward
正如您所看到的,您可以使用适当的选项轻松实现任何转发选项(有关更多信息,请参阅转发部分)。您还可以使用在转发类型字母之前指定“K”的关联“kill”命令来销毁隧道。例如,杀死本地前锋(-L
),你可以使用-KL
命令。您只需为此提供端口。
因此,要设置本地端口转发,您可以键入:
-
[ENTER]
- ~C
-
-L 8888:127.0.0.1:80
Port 8888
现在,您的本地计算机上将能够与您要连接的主机上的 Web 服务器进行通信。完成后,您可以通过键入以下内容来删除该转发:
-
[ENTER]
- ~C
-
-KL 8888
上述说明应涵盖大多数用户日常所需的有关 SSH 的大部分信息。如果您有其他技巧或希望分享您最喜欢的配置和方法,请随时使用下面的评论。