SSH要领:用SSH服务器,客户机和Keys工作

SSH或Secure Shell,是连接和远程管理Linux服务器的最常见的方式。在这种小抄式的指南中,我们将介绍一些你可能希望使用的基本选项和配置集。

介绍

SSH是一种安全协议,用作远程连接到Linux服务器的主要方法。它通过生成远程shell来提供基于文本的界面。连接后,您在本地终端中键入的所有命令都将发送到远程服务器并在那里执行。 在这个Cheat表格式指南中,我们将介绍与SSH连接以实现您的目标的一些常见方法。当您需要知道如何以不同的方式连接或配置服务器时,这可以用作快速参考。

如何使用本指南

  • 如果您不熟悉SSH或刚刚开始使用SSH,请首先阅读SSH概述部分。
  • 使用随后的章节适用于您要实现的内容。大多数节不是基于任何其他节,因此您可以独立使用下面的示例。
  • 使用此页面左侧的内容菜单(以宽页面宽度)或浏览器的查找功能,找到所需的部分。
  • 复制并粘贴指定的命令行示例,替换中的值red与自己的价值观。

SSH概述

连接到远程Linux服务器的最常见方法是通过SSH。 SSH代表Secure Shell,提供了一种安全可靠的方式来远程执行命令,更改和配置服务。当通过SSH连接时,您使用远程服务器上存在的帐户登录。

SSH如何工作

当通过SSH连接时,您将被放入shell会话,这是一个基于文本的界面,您可以在其中与服务器交互。在SSH会话期间,您输入到本地终端的任何命令都通过加密的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公用和私有密钥对是向没有密码的远程服务器进行身份验证的第一步。除非有一个很好的理由不,你应该总是使用SSH密钥进行身份验证。 可以使用多个加密算法来生成SSH密钥,包括RSA,DSA和ECDSA。 RSA密钥通常是首选,是默认密钥类型。 要在本地计算机上生成RSA密钥对,请键入:
ssh-keygen
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键留空。请记住,这将允许任何获得您的私钥的控制权登录到您的服务器。 如果您选择输入密码,则在您输入时不会显示任何内容。这是一个安全预防措施。
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密钥对

SSH密钥默认为2048位。这通常被认为对于安全性是足够好的,但是你可以为更强化的键指定更大的位数。 要做到这一点,包括-b跟你想的位数参数。大多数服务器支持长度至少为4096位的密钥。对于DDOS保护,可能不接受较长的密钥:
ssh-keygen -b 4096
如果您以前创建了不同的密钥,系统将询问您是否要覆盖以前的密钥:
Overwrite (y/n)?
如果选择“是”,您的以前的密钥将被覆盖,您将无法再使用该密钥登录到服务器。因此,请务必小心覆盖键。

删除或更改私钥上的密码

如果您为您的私钥生成了密码,并希望更改或删除它,您可以轻松地进行。 注意 :要更改或删除密码,您必须知道原来的密码。如果您丢失了对密钥的密码,则没有追索权,您必须生成新的密钥对。 要更改或删除密码,只需键入:
ssh-keygen -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密钥的指纹,请键入:
ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):
如果是键的正确位置,您可以按ENTER键,否则输入修改的位置。您将获得一个字符串,其中包含密钥的位长度,指纹,以及为其创建的帐户和主机以及所使用的算法:
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  demo@test (RSA)

使用SSH-Copy-ID将公共SSH密钥复制到服务器

要将公钥复制到服务器,允许您在没有密码的情况下进行身份验证,可以采取多种方法。 如果您目前有基于密码的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文件:
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密钥复制到没有SSH-Copy-ID的服务器

如果您没有在ssh-copy-id工具可用,但还是要在远程服务器的基于密码的SSH访问,你可以用不同的方式复制你的公钥的内容。 您可以输出的关键和管道入的内容ssh命令。 在远程端,可以确保~/.ssh目录中,然后将管道内容附加到~/.ssh/authorized_keys文件:
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密钥复制到服务器

如果您没有可用的基于密码的SSH访问,则必须手动将您的公钥添加到远程服务器。 在本地计算机上,您可以键入以下内容来查找公钥文件的内容:
cat ~/.ssh/id_rsa.pub
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
键入“yes”以接受远程主机的真实性。 如果您使用密码认证,则将在此处提示您输入远程帐户的密码。如果使用SSH密钥,将提示您输入私钥的密码(如果设置了密码),否则将自动登录。

在远程服务器上运行单个命令

要在远程服务器上运行单个命令而不是生成shell会话,可以在连接信息之后添加命令,如下所示:
ssh username@remote_host command_to_run
这将连接到远程主机,使用您的凭据进行身份验证,并执行您指定的命令。连接将立即关闭。

使用其他端口登录服务器

默认情况下,服务器上的SSH守护程序在端口22上运行。您的SSH客户端将假定在尝试连接时是这种情况。如果您的SSH服务器正在侦听非标准端口(这将在后面的部分演示),则在与客户端连接时必须指定新的端口号。 您可以通过指定的端口号做-p选项:
ssh -p port_num username@remote_host
要避免这一点,你登录到远程服务器都必须这样做,你可以创建或编辑配置文件~/.ssh本地计算机的主目录中的目录。 现在通过键入以下命令来编辑或创建文件:
nano ~/.ssh/config
在这里,您可以设置主机特定的配置选项。要指定新端口,请使用如下格式:
Host remote_alias
    HostName remote_host
    Port port_num
这将允许您登录,而不在命令行上指定特定的端口号。

将SSH密钥添加到SSH代理以避免键入密码短语

如果您在私人SSH密钥上有密码,则每次使用密码连接到远程主机时,系统都会提示您输入密码。 为避免重复执行此操作,可以运行SSH代理。这个小实用程序在您第一次输入密码后存储您的私钥。它将在您的终端会话期间可用,允许您在未来连接,而不重新输入密码短语。 如果您需要转发SSH凭据(如下所示),这也很重要。 要启动SSH代理,请在本地终端会话中键入以下内容:
eval $(ssh-agent)
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代理,并将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”以禁用密码登录:
PasswordAuthentication no
完成更改后,保存并关闭文件。要实施更改,应重新启动SSH服务。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart
现在,系统上的所有帐户将无法使用SSH使用密码登录。

更改SSH守护程序运行的端口

一些管理员建议您更改SSH运行的默认端口。这可以帮助减少您的服务器从自动机器人进行身份验证尝试的次数。 要更改SSH守护程序侦听的端口,您必须登录到远程服务器。打开sshd_config ,或者用该用户登录或使用具有root权限的远程系统上的文件sudo
sudo nano /etc/ssh/sshd_config
一旦你里面,你可以更改SSH通过查找运行在端口Port 22规格和修改,以反映您希望使用的端口。例如,要将端口更改为4444,请将其放在您的文件中:
#Port 22
Port 4444
保存并在完成后关闭文件。要实施更改,必须重新启动SSH守护程序。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart
守护程序重新启动后,您将需要通过指定端口号进行身份验证(在前面的部分中演示)。

限制可以通过SSH连接的用户

要明确限制能够通过SSH登录的用户帐户,可以采取几种不同的方法,每种方法都涉及编辑SSH守护程序配置文件。 在远程服务器上,现在使用root或sudo权限打开此文件:
sudo nano /etc/ssh/sshd_config
指定允许使用的登录帐户的第一种方法AllowUsers指令。 搜索AllowUsers文件中的指令。如果不存在,请在任何地方创建。在指令后,列出应该允许通过SSH登录的用户帐户:
AllowUsers user1 user2
保存并关闭文件。重新启动守护程序以实施更改。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart
如果你更舒适的分组管理,可以使用AllowGroups指令来代替。如果是这种情况,只需添加一个应允许SSH访问的组(我们将创建此组并立即添加成员):
AllowGroups sshmembers
保存并关闭文件。 现在,您可以通过键入以下内容创建与您指定的组匹配的系统组(无主目录):
sudo groupadd -r sshmembers
请确保您将所需的任何用户帐户添加到此群组。这可以通过输入:
sudo usermod -a -G sshmembers user1
sudo usermod -a -G sshmembers user2
现在,重新启动SSH守护程序以实现更改。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart

禁用根登录

您设置了一个具有SSH用户帐户后,它往往是建议通过SSH完全禁用root登录sudo权限。 为此,请使用远程服务器上的root或sudo打开SSH守护程序配置文件。
sudo nano /etc/ssh/sshd_config
在内部,寻找一个叫指令PermitRootLogin 。如果已评论,请取消注释。将值更改为“no”:
PermitRootLogin no
保存并关闭文件。要实施更改,请重新启动SSH守护程序。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart

允许根访问特定命令

在某些情况下,您可能希望一般禁用根访问,但启用它以允许某些应用程序正常运行。一个例子可能是备份程序。 这可以通过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=房源的定义,这关键是有效的命令。这应该包括可执行文件的完整路径,加上任何参数:
command="/path/to/command arg1 arg2" ssh-rsa ...
保存并在完成后关闭文件。 现在,打开sshd_config以root或sudo权限的文件:
sudo nano /etc/ssh/sshd_config
找到该指令PermitRootLogin ,并将值更改为forced-commands-only 。这将只允许SSH密钥登录在为密钥指定命令时使用root:
PermitRootLogin forced-commands-only
保存并关闭文件。重新启动SSH守护程序以实施更改。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart

向客户端转发X应用程序显示

SSH守护程序可以配置为将服务器上的X应用程序的显示自动转发到客户端计算机。为了使其正常工作,客户端必须配置并启用X Windows系统。 要启用此功能,请登录到远程服务器和编辑sshd_config文件,以root或使用sudo特权:
sudo nano /etc/ssh/sshd_config
搜索X11Forwarding指令。如果已注释掉,请取消注释。如果需要,创建它,并将值设置为“yes”:
X11Forwarding yes
保存并关闭文件。重新启动SSH守护程序以实现这些更改。 在Ubuntu / Debian:
sudo service ssh restart
在CentOS / Fedora上:
sudo service sshd restart
要连接到服务器并转发应用程序的显示,您必须通过-X连接时从客户端选项:
ssh -X username@remote_host
通过此会话在服务器上启动的图形应用程序应显示在本地计算机上。性能可能有点慢,但它是非常有用的捏。

客户端配置选项

在下一节中,我们将重点介绍您可以在连接的客户端进行的一些调整。

定义服务器特定的连接信息

在本地计算机上,您可以为连接的某些或所有服务器定义单独的配置。这些可以被存储在~/.ssh/config的文件,这是由你的SSH客户端每次调用时读取。 在本地计算机上的文本编辑器中创建或打开此文件:
nano ~/.ssh/config
在里面,你可以通过引入每一个单独的定义配置选项Host关键字,后跟一个别名。 此之下缩进和,你可以定义任何的发现指令ssh_config的手册页:
man ssh_config
示例配置将是:
Host testhost
    HostName example.com
    Port 4444
    User demo
然后,您可以连接到example.com上的4444端口使用的用户名只需键入“演示”:
ssh testhost
您还可以使用通配符匹配多个主机。请记住,稍后的匹配可以覆盖先前的匹配。因此,你应该把你最一般的比赛在顶部。例如,您可能会违约的所有连接,不允许X转发,与覆盖了example.com通过在文件中有这样的:
Host *
    ForwardX11 no

Host testhost
    HostName example.com
    ForwardX11 yes
    Port 4444
    User demo
保存并在完成后关闭文件。

保持连接活动以避免超时

如果您在准备好之前发现自己与SSH会话断开连接,则可能是您的连接超时。 您可以配置您的客户端发送数据包到服务器每隔多次,以避免这种情况: 在本地计算机上,您可以通过编辑您的每一个连接配置此~/.ssh/config文件。立即打开:
nano ~/.ssh/config
如果尚不存在,请在文件顶部定义一个与所有主机匹配的部分。设置ServerAliveInterval到“120”,以一个数据包发送到服务器每隔两分钟。这应该足以通知服务器不要关闭连接:
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
这是配置使您可以验证您尝试连接到的主机的真实性,并发现恶意用户可能试图伪装为远程主机的实例。 在某些情况下,您可能希望禁用此功能。 注意 :这可能是一个很大的安全隐患,所以一定要确保你知道,如果你设置你的系统这样的你在做什么。 要进行更改,在打开~/.ssh/config本地计算机上的文件:
nano ~/.ssh/config
如果尚不存在,请在文件顶部定义一个与所有主机匹配的部分。设置StrictHostKeyChecking指令“不”会自动添加新主机到known_hosts文件。 将UserKnownHostsFile/dev/null不上新增或更改主机警告:
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
您可以通过反转其他主机的选项来逐个启用检查。默认StrictHostKeyChecking是“问”:
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName example.com
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

通过单个TCP连接复制SSH

在某些情况下,建立新的TCP连接可能需要更长的时间。如果您对同一台机器进行多个连接,则可以利用多路复用。 SSH多路复用为多个SSH会话重复使用相同的TCP连接。这消除了建立新会话所需的一些工作,可能加速事情。限制连接数量也可能有助于其他原因。 要设置多路复用,您可以手动设置连接,或者可以将客户端配置为在可用时自动使用多路复用。我们将在这里演示第二个选项。 要配置多路复用,请在本地计算机上编辑SSH客户端的配置文件:
nano ~/.ssh/config
如果还没有在文件的顶端wildcard宿主定义,现在添加一个(如Host * )。 我们将设置ControlMasterControlPathControlPersist价值观,建立我们的复用配置。 该ControlMaster应能设置为“自动”如果有可能允许自动复用。 该ControlPath将建立控制插座的路径。第一个会话将创建此套接字,并且后续会话将能够找到它,因为它由用户名,主机和端口标记。 设置ControlPersist选项设置为“1”,将允许初步掌握连接后台运行。 “1”指定TCP连接应在最后一次SSH会话关闭后一秒钟自动终止:
Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1
保存并在完成后关闭文件。现在,我们需要实际创建我们在控制路径中指定的目录:
mkdir ~/.ssh/multiplex
现在,使用同一台机器建立的任何会话将尝试使用现有的套接字和TCP连接。当最后一个会话存在时,连接将在一秒钟后被删除。 如果由于某种原因,你需要暂时绕过复用配置,你可以通过传递这样做-S标志和“无”:
ssh -S none username@remote_host

设置SSH隧道

通过安全的SSH隧道来隧穿其他流量是解决限制性防火墙设置的一个很好的方法。它也是加密其他未加密的网络流量的好方法。

配置到服务器的本地隧道

SSH连接可用于将流量从本地主机上的端口隧道到远程主机上的端口。 本地连接是通过远程主机从本地计算机访问网络位置的一种方法。首先,建立与远程主机的SSH连接。在远程服务器上,建立与用户提供的外部(或内部)网络地址的连接,并且到此位置的流量在指定端口上通过隧道传输到本地计算机。 这通常用于通过绕过防火墙隧道到较少受限的网络环境。另一个常见的用法是从远程位置访问“仅本地主机”Web界面。 要建立本地隧道到远程服务器,您需要使用-L参数连接,你必须提供三个附加信息时:
  • 您希望访问隧道连接的本地端口。
  • 您希望远程主机连接到的主机。
  • 您希望远程主机连接的端口。
这些被赋予在上面的顺序(由冒号分隔),作为参数传递给-L标志。 我们也将使用-f标志,这将导致SSH进入执行前的背景和-N标志,它不会打开一个外壳或远端执行程序。 例如,要连接到example.com的80端口的远程主机上,从而可以在本地机器上8888端口的连接,您可以键入:
ssh -f -N -L 8888:example.com:80 username@remote_host
现在,如果你点你的本地Web浏览器127.0.0.1:8888 ,你应该看到什么内容是example.com上的端口80。 语法的更一般指南是:
ssh -L your_port:site_or_IP_to_access:site_port username@host
由于连接是在后台,你将不得不找到它的PID来杀死它。您可以通过搜索您转发的端口执行此操作:
ps aux | grep 8888
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:example.com: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
另一种选择是开始连接-f标志。这将保持连接在前台,阻止您在转发期间使用终端窗口。这样做的好处是,您可以通过键入“CTRL-C”轻松地终止隧道。

配置到服务器的远程隧道

SSH连接可用于将流量从本地主机上的端口隧道到远程主机上的端口。 在远程隧道中,建立与远程主机的连接。在创建隧道, 远程端口被指定。远程主机上的此端口将被隧道传输到从本地计算机连接到的主机和端口组合。这将允许远程计算机通过本地计算机访问主机。 如果需要允许访问锁定到外部连接的内部网络,这可能很有用。如果防火墙允许进出网络的连接,这将让你出从该计算机连接到远程计算机和隧道流量到一个位置,在内部网络上。 要建立远程隧道到远程服务器,您需要使用-R参数连接,你必须提供三个附加信息时:
  • 远程主机可以访问隧道连接的端口。
  • 您希望本地计算机连接到的主机。
  • 您希望本地计算机连接到的端口。
这些被赋予在上面的顺序(由冒号分隔),作为参数传递给-R标志。 我们也将使用-f标志,这将导致SSH进入执行前的背景和-N标志,它不会打开一个外壳或远端执行程序。 例如,要连接到example.com端口80上的本地计算机上,使得我们对8888端口远程主机上的可用连接,您可以键入:
ssh -f -N -R 8888:example.com:80 username@remote_host
现在,在远程主机上,打开Web浏览器127.0.0.1:8888将让你看到什么内容是example.com上的端口80。 语法的更一般指南是:
ssh -R remote_port:site_or_IP_to_access:site_port username@host
由于连接是在后台,你将不得不找到它的PID来杀死它。您可以通过搜索您转发的端口执行此操作:
ps aux | grep 8888
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:example.com: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
另一种选择是开始连接-f标志。这将保持连接在前台,阻止您在转发期间使用终端窗口。这样做的好处是,您可以通过键入“CTRL-C”轻松地终止隧道。

配置到远程服务器的动态隧道

SSH连接可用于将流量从本地主机上的端口隧道到远程主机上的端口。 动态隧道类似于它允许本地计算机通过远程主机连接到其它资源的本地隧道。动态隧道通过简单地指定单个本地端口来做到这一点。希望利用该端口用于隧道传输的应用必须能够使用SOCKS协议进行通信,以便可以在隧道的另一侧正确地重定向分组。 传递到此本地端口的流量将发送到远程主机。从那里,SOCKS协议将被解释为建立到期望的结束位置的连接。此设置允许支持SOCKS的应用程序通过远程服务器连接到任意数量的位置,而无需多个静态隧道。 要建立连接,我们将通过-D标志用在这里我们希望访问隧道的本地端口一起。 我们也将使用-f标志,这将导致SSH进入执行前的背景和-N标志,它不会打开一个外壳或远端执行程序。 例如,要在端口“7777”上建立隧道,可以键入:
ssh -f -N -D 7777 username@remote_host
从这里,您可以开始将您的SOCKS感知应用程序(如Web浏览器)指向您选择的端口。应用程序将其信息发送到与端口关联的套接字中。 将流量定向到SOCKS端口的方法因应用程序而异。例如,在Firefox中,常规位置是首选项>高级>设置>手动代理配置。在Chrome中,你可以开始与应用--proxy-server=标志设置。您将要使用localhost接口和您转发的端口。 由于连接是在后台,你会发现它的PID杀死它。您可以通过搜索为你转发的端口这样做:
ps aux | grep 8888
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
然后,您可以通过针对PID,这是你的SSH命令相匹配的行第二列的数量,杀死进程:
kill 5965
另一种选择是启动连接而不-f标志。这将保持在前台的连接,以防止从使用终端窗口转发的持续时间。这样做的好处是,你可以很容易地通过键入“CTRL-C”杀隧道。

使用SSH转义符来控制连接

甚至建立SSH会话之后,有可能在从所述终端内的连接行使控制。我们可以用一种叫做SSH换码,这让我们从一个会话中与我们当地的SSH软件进行交互做到这一点。

从客户端强制断开连接(如何退出卡住或冻结届出)

一个几乎毫无知觉的OpenSSH的最有用的功能是从内部控制会话的某些方面的能力。 这些命令可以在启动与执行~SSH会话中的控制字符。如果他们是一个新行输入后的第一件事就是控制命令将只进行解释,所以总是按ENTER键之前,使用一个一至两次。 其中最有用的控制是从客户端启动一断开的能力。SSH连接通常由服务器关闭,但如果服务器从问题,或者如果连接已断患有这可能是一个问题。通过使用客户端的断开,连接,可以干净地从客户端关闭。 要关闭从客户端的连接,使用控制字符(~),以点。如果您的连接有问题,你可能会在这似乎是一个卡住终端会话。键入命令,尽管缺乏反馈执行客户端断开连接:
[ENTER]
~.
连接应立即关闭,并返回到本地shell会话。

放置一个SSH会话到背景

一个几乎毫无知觉的OpenSSH的最有用的功能是从连接中控制会话的某些方面的能力。 这些命令可以在启动与执行~从SSH连接内控制字符。如果他们是一个新行输入后的第一件事就是控制命令将只进行解释,所以总是按ENTER键之前,使用一个一至两次。 其中一个功能,该提供的是把一个SSH会话到背景。要做到这一点,我们需要提供控制字符(〜),然后执行常规的键盘快捷键后台任务(CTRL-Z):
[ENTER]
~[CTRL-z]
这将放置在连接到后台,并返回到本地shell会话。要返回到SSH会话,则可以使用常规作业控制机制。 通过键入您可以立即重新激活您最近后台运行的任务:
fg
如果你有多个后台运行的任务,你可以看到通过键入空缺职位:
jobs
[1]+  Stopped                 ssh username@some_host
[2]   Stopped                 ssh username@another_host
然后,您可以通过与百分号第一列使用索引带来任何的任务,到前台:
fg %2

在现有的SSH连接更改端口转发选项

一个几乎毫无知觉的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”指定相关的“杀”的命令。例如,为了杀一个本土前锋(-L),你可以使用-KL命令。您只需要提供端口这一点。 因此,要建立一个本地端口转发,你可以输入:
[ENTER]
~C
-L 8888:127.0.0.1:80
在本地计算机上的8888端口,现在将能够与您连接到主机上的Web服务器进行通信。当你完成,你可以通过键入推倒了前进:
[ENTER]
~C
-KL 8888

结论

上述说明应涵盖绝大多数的信息,大多数用户将需要有关SSH的某一天到一天的基础。如果您有其他提示,或希望分享您最喜爱的配置和方法,随意使用下面的评论。