ssh config
基本说明
ssh config这个配置文件可以使ssh登录更加简单,同时可以在里边设置是否是持久连接,多长时间询问一次服务器是否断开了,询问多少次等。
基本操作
该文件默认是没有创建的。需要自行创建
~/.ssh/config
vim ~/.ssh/config
然后写入你需要的内容,例如:
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 6
ServerAliveCountMax 200
Compression yes
Host github.com
Hostname ssh.github.com
User "*************@qq.com"
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
Host vps
Hostname **.**.**.**
User root
Port 1289
IdentityFile ~/.ssh/id_rsa
Host shiyanshi
Hostname **.**.**.**
User root
Port 8444
IdentityFile ~/.ssh/id_rsa
通俗解释:
多条连接共享
如果你需要在多个窗口中打开到同一个服务器的连接,而不想每次都输入用户名,密码,或是等待连接建立,那么你可以配置SSH的连接共享选项,在本地打开你的SSH配置文件,通常它们位于~/.ssh/config,然后添加下面2行(ControlMaster配合ControlPath一起使用):
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
现在试试断开你与服务器的连接,并建立一条新连接,然后打开一个新窗口,再创建一条连接,你会发现,第二条连接几乎是在瞬间就建立好了。
文件传输
连接共享不止可以帮助你共享多个SSH连接,如果你需要通过SFTP与服务器传输文件,你会发现,它们使用的依然是同一条连接,如果你使用的Bash,你会发现,你甚至SSH甚至支持Tab对服务器端文件进行自动补全,共享连接选项对于那些需要借助SSH的工具,比如rsync,git等等也同样有效。
长连接
如果你发现自己每条需要连接同一个服务器无数次,那么长连接选项就是为你准备的。
ControlPersist yes
打开之后即使关闭了所有的已连接ssh连接,一段时间内也能无需密码重新连接。
ControlPersist 4h
每次通过SSH与服务器建立连接之后,这条连接将被保持4个小时,即使在你退出服务器之后这条连接依然可以重用,因此,在你下一次(4小时之内)登录服务器时,你会发现连接以闪电般的速度建立完成,这个选项对于通过scp拷贝多个文件提速尤其明显,因为你不在需要为每个文件做单独的认证了。
Compression为压缩选项,打开之后加快数据传输速度。
详细解释
这个是2014年发布的一份文档,为了避免失效,下面拷贝了一份
还有一个参考链接:https://www.cnblogs.com/hangj/p/11506686.html
SSH 客户端配置文件的位置
调用客户端配置文件config,它位于.ssh配置目录中用户的主目录中。通常,默认情况下不会创建此文件,因此您可能需要自己创建它:
touch ~/.ssh/config
配置文件结构
该config文件由主机组织。每个主机定义都可以为特定的匹配主机定义连接选项。还可以使用通配符来允许范围更广的选项。
每个部分都以一个标头开头,该标头定义了应与后面的配置选项匹配的主机。然后在下面定义了该匹配主机的特定配置项。只需要指定与默认值不同的项目,因为主机将继承任何未定义项目的默认值。从头Host到下一Host个头定义了一个节。
通常,出于组织目的和可读性,为每个主机设置的选项是缩进的。这不是一个硬性要求,而是一个有用的约定,可以让您一目了然地更轻松地解释。
一般格式如下所示:
Host firsthost
SSH_OPTION_1 custom_value
SSH_OPTION_2 custom_value
SSH_OPTION_3 custom_value
Host secondhost
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
在这里,我们有四个部分将根据所讨论的主机是否匹配应用于每次连接尝试。
解释算法
了解 SSH 解释文件以应用其中定义的配置值的方式非常重要。这在使用通配符和Host * 通用主机定义时有很大的影响。
SSH 会将命令行上给出的主机名与Host定义配置部分的每个标头进行匹配。它将从文件顶部向下执行此操作,因此顺序非常重要。
这是指出Host定义中的模式不必与您将连接的实际主机相匹配的好时机。您基本上可以使用这些定义为主机设置别名,这些别名可以用来代替实际主机名。
例如,考虑这个定义:
Host devel
HostName devel.example.com
User tom
该主机允许我们[email protected]通过在命令行上键入以下内容进行连接:
ssh devel
考虑到这一点,我们现在可以讨论 SSH 在向下移动文件时应用每个配置选项的方式。它从顶部开始并检查每个Host定义以查看它是否与命令行上给出的值匹配。
Host找到第一个匹配定义后,每个关联的 SSH 选项都会应用于即将到来的连接。然而,解释并没有就此结束。
然后 SSH 向下移动文件,检查其他Host定义是否也匹配。如果找到与命令行上给出的当前主机名匹配的另一个定义,它将考虑与新部分关联的 SSH 选项。然后,它将应用为新部分定义的、之前部分尚未定义的任何 SSH 选项。
最后一点对于内化非常重要。SSH 将按顺序解释Host与命令行上给出的主机名匹配的每个部分。在此过程中,它将始终使用为每个选项给出的第一个值。无法覆盖先前匹配部分已经给出的值。
这意味着您的config文件应该遵循在顶部具有最具体配置的简单规则。稍后应该出现更一般的定义,以便应用先前匹配部分未定义的选项。
让我们再次看一下config我们在上一节中使用的模型文件:
Host firsthost
SSH_OPTION_1 custom_value
SSH_OPTION_2 custom_value
SSH_OPTION_3 custom_value
Host secondhost
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
在这里,我们可以看到前两个部分是由字面主机名(或别名)定义的,这意味着它们不使用任何通配符。如果我们使用 连接ssh firsthost,则第一个部分将是第一个应用的部分。这将为此连接设置SSH_OPTION_1、SSH_OPTION_2和SSH_OPTION_3。
它将检查第二部分并发现它不匹配并继续。然后它将找到第三个部分并发现它匹配。它将检查ANOTHER_OPTION它是否已经具有前面部分中的值。发现它没有,它将应用本节中的值。然后它将匹配最后一部分,因为Host *定义匹配每个连接。由于它没有CHANGE_DEFAULT来自其他部分的模拟选项的值,因此它将采用本部分的值。然后使用从该过程收集的选项建立连接。
让我们再试一次,假装ssh secondhost从命令行调用。
同样,它将从第一部分开始并检查它是否匹配。由于这仅匹配到 的连接firsthost,因此将跳过本节。它将转到第二部分。发现此部分与请求匹配后,它将收集ANOTHER_OPTION此连接的值。
SSH 然后查看第三个定义并发现通配符与当前连接匹配。然后它会检查它是否已经有 的值ANOTHER_OPTION。由于此选项是在已经匹配的第二部分中定义的,因此第三部分中的值将被删除且无效。
SSH 然后检查第四部分并应用先前匹配部分未定义的选项。然后它使用它收集的值尝试连接。
基本连接选项
现在您已经了解了在设计配置文件时应该使用的一般格式,让我们讨论一些常用选项以及用于在命令行上指定它们的格式。
我们将介绍的第一个信息是连接到远程主机所需的基本信息。即,运行 SSH 守护程序的主机名、用户名和端口。
要以命名用户的身份连接到一个名为apollo的主机,该主机从命令行example.com在端口上运行其 SSH 守护程序4567,我们可以通过多种方式提供变量信息。最常见的可能是:
ssh -p 4567 [email protected]
但是,我们也可以使用带有-o标志的完整选项名称,如下所示:
ssh -o "User=apollo" -o "Port=4567" -o "HostName=example.com" anything
在这里,我们已经设置了我们希望与-o标志一起使用的所有选项。我们甚至将主机指定为“任何东西”作为别名,就像我们在上面描述的配置文件中一样。实际主机名取自HostName我们正在设置的选项。
我们在第二种形式中使用的大写选项名称与我们必须在我们的config文件中使用的相同。您可以通过键入以下内容找到可用选项的完整列表:
man ssh_config
要在我们的config文件中设置这些,我们首先必须决定我们希望这些选项用于哪些主机。由于我们正在讨论特定于所讨论的主机的选项,我们可能应该使用文字主机匹配。
此时我们还有机会为此连接分配别名。让我们利用这一点,这样我们就不必每次都键入整个主机名。我们将使用别名“home”来指代这个连接和相关的选项:
Host home
现在,我们可以定义此主机的连接详细信息。我们可以使用上面使用的第二种格式来告知我们应该在本节中放置什么。
Host home
HostName example.com
User apollo
Port 4567
我们使用键值系统定义选项。每对应该在单独的行上。键可以通过空格或带有可选空格的等号与其关联的值分开。因此,这些都与我们的 SSH 客户端解释的相同:
Port 4567
Port=4567
Port = 4567
唯一的区别是根据选项和值,使用不带空格的等号可以让您在命令行上指定选项而无需引用。由于我们专注于我们的config文件,这完全取决于您的喜好。
配置共享选项 到目前为止,我们设计的配置非常简单。总的来说,它看起来像这样:
Host home
HostName example.com
User apollo
Port 4567
如果我们在工作和家用计算机上使用相同的用户名怎么办?我们可以在定义工作机器的部分中添加冗余选项,如下所示:
Host home
HostName example.com
User apollo
Port 4567
Host work
HostName company.com
User apollo
这有效,但我们正在重复值。这只是一个选项,所以不是什么大问题,但有时我们想要共享大量选项。最好的方法是将共享选项分成不同的部分。
如果我们在连接到的所有机器上都使用用户名“apollo”,我们可以将其放入我们的通用“主机”定义中,该定义由一个*匹配每个连接的单个标记。请记住,更通用的部分应该更靠近底部:
Host home
HostName example.com
Port 4567
Host work
HostName company.com
Host *
User apollo
这清除了我们配置中的重复问题,并且如果“apollo”是您连接到的大多数新系统的默认用户名,它将起作用。
如果有一些系统不使用这个用户名怎么办?有几种不同的方法可以解决这个问题,具体取决于用户名的共享范围。
如果几乎所有主机都使用“apollo”用户名,最好将其留在通用Host *部分。这将适用于未从上述部分收到用户名的任何主机。对于使用不同用户名的异常机器,我们可以通过提供替代方案来覆盖默认值。只要它在通用部分之前定义,这将优先:
Host home
HostName example.com
Port 4567
Host work
HostName company.com
Host oddity
HostName weird.com
User zeus
Host *
User apollo
对于oddity主机,SSH 将使用用户名“zeus”进行连接。所有其他连接在达到通用Host *定义之前不会收到他们的用户名。
如果“apollo”用户名由几个连接共享,但不够常用以用作默认值,会发生什么情况?如果我们愿意重命名我们使用的别名以获得更通用的格式,我们可以使用通配符将附加选项仅应用于这两个主机。
我们可以将home别名更改为类似的内容hapollo,并将工作连接更改为类似的内容wapollo。这样,两个主机共享apollo其别名的一部分,允许我们使用通配符将其定位到不同的部分:
Host hapollo
HostName example.com
Port 4567
Host wapollo
HostName company.com
Host *apollo
User apollo
Host *
User diffdefault
在这里,我们已将共享User定义移至主机部分,该部分匹配尝试连接到以apollo. 任何不以 结尾apollo(并且没有自己的Host部分定义 a User)的连接都将收到 username diffdefault。
请注意,我们在文件中保留了从最具体到最不具体的顺序。由于文件的解释顺序,最好将不太具体的 Host 部分视为后备,而不是默认值。
常见的 SSH 配置选项
到目前为止,我们已经讨论了一些建立连接所需的基本选项。我们已经介绍了这些选项:
HostName:应该用于建立连接的实际主机名。这将替换Host标头中定义的任何别名。此选项是不是,如果必要的Host定义,规定了实际有效的主机名来连接。 User:用于连接的用户名。 Port:远程 SSH 守护进程运行的端口。仅当远程 SSH 实例未在默认端口上运行时才需要此选项22。 还有许多其他有用的选项值得探索。我们将讨论一些更常见的选项,根据功能分开。
一般调整和连接项目 您可能希望在更广泛的层面上配置的一些其他调整(可能在Host *部分)如下。
ServerAliveInterval:可以配置此选项让 SSH 知道何时发送数据包以测试来自服务器的响应。如果您的连接不可靠并且您想知道它是否仍然可用,这会很有用。
LogLevel:这将配置 SSH 登录客户端的详细程度。这可用于在某些情况下关闭日志记录或在尝试调试时增加详细程度。从最详细到最详细,级别是 QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG1、DEBUG2 和 DEBUG3。
StrictHostKeyChecking:此选项配置 ssh SSH 是否会自动将主机添加到~/.ssh/known_hosts文件中。默认情况下,这将设置为“询问”,这意味着如果从远程服务器收到的主机密钥与known_hosts文件中找到的主机密钥不匹配,它将警告您。如果您经常连接到大量临时主机,您可能希望将其设置为“否”。然后 SSH 会自动将任何主机添加到文件中。这可能会产生安全隐患,因此在启用它之前请仔细考虑。
UserKnownHostsFile:此选项指定 SSH 将存储有关它所连接的主机的信息的位置。通常您不必担心此设置,但/dev/null如果您关闭了上面的严格主机检查,您可能希望将其设置为。
VisualHostKey:这个选项可以告诉 SSH 在连接时显示远程主机密钥的 ASCII 表示。启用此功能是熟悉主机密钥的一种简单方法,使您在将来某个时候必须从另一台计算机连接时轻松识别它。
Compression:打开压缩对于非常慢的连接很有帮助。大多数用户不需要这个。
考虑到上述配置项,我们可以进行一些有用的配置调整。
例如,如果我们在云提供商处非常快速地创建和销毁主机,这样的事情可能很有用:
Host home
VisualHostKey yes
Host cloud*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel QUIET
Host *
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
LogLevel INFO
ServerAliveInterval 120
这将为您的家庭连接打开您的可视主机密钥,让您熟悉它,以便您可以识别它是否发生变化或从不同的机器连接时。我们还设置了任何以 cloud* 开头的主机,以不检查主机和记录故障。对于其他主机,我们有合理的后备值。
连接转发 SSH 的一种常见用途是转发连接,允许本地连接通过远程主机建立隧道,或者允许远程机器访问通过本地机器建立隧道。SSH 还可以使用 SOCKS5 等协议进行动态转发,其中包括远程主机的转发信息。
控制此行为的选项是:
LocalForward:此选项用于指定将本地端口的流量转发到远程机器的连接,将其通过隧道传输到远程网络。第一个参数应该是您希望将流量定向到的本地端口,第二个参数应该是您希望将该流量定向到远程端的地址和端口。
RemoteForward:此选项用于定义一个远程端口,可以将流量定向到该端口以便从本地机器通过隧道。第一个参数应该是将流量定向到远程系统的远程端口。第二个参数应该是流量到达本地系统时指向的地址和端口。
DynamicForward: 用于配置本地端口,可以与 SOCKS5 等动态转发协议一起使用。然后可以将使用动态转发协议的流量定向到本地机器和远程端的此端口,它将根据包含的值进行路由。
这些选项可用于双向转发端口,如下所示:
# This will allow us to use port 8080 on the local machine
# in order to access example.com at port 80 from the remote machine
Host local_to_remote
LocalForward 8080 example.com:80
# This will allow us to offer access to internal.com at port 443
# to the remote machine through port 7777 on the other side
Host remote_to_local
RemoteForward 7777 internal.com:443
其他转发 除了连接转发,SSH 还允许其他类型的转发。
我们可以转发存储在本地计算机代理中的任何 SSH 密钥,允许我们使用存储在本地系统上的凭据从远程系统进行连接。我们还可以在远程系统上启动应用程序,并使用 X11 转发将图形显示转发到我们的本地系统。
这些是与这些功能相关联的指令:
ForwardAgent:此选项允许将存储在我们本地计算机上的身份验证密钥转发到您要连接的系统上。这可以让您使用 Home 键从主机到主机跳跃。
ForwardX11:如果您希望能够转发远程系统上运行的应用程序的图形屏幕,您可以打开此选项。
这些都是“yes”或“no”选项。
指定键 如果您为主机配置了 SSH 密钥,这些选项可以帮助您管理要用于每个主机的密钥。
IdentityFile:此选项可用于指定要用于每个主机的密钥的位置。如果您的密钥位于默认位置,则每个密钥都会被尝试,您无需对此进行调整。如果您有多个密钥,每个都用于不同的目的,这可用于指定可以找到正确密钥的确切路径。
IdentitiesOnly: 此选项可用于强制 SSH 仅依赖config文件中提供的身份。如果 SSH 代理在内存中具有对相关主机无效的替代密钥,则这可能是必要的。
如果您必须跟踪不同主机的大量密钥并使用一个或多个 SSH 代理来提供帮助,这些选项尤其有用。
通过单个 TCP 连接多路复用 SSH SSH 能够将单个 TCP 连接用于到同一台主机的多个 SSH 连接。如果需要一段时间与远程端建立 TCP 握手,这会很有用,因为它从额外的 SSH 连接中消除了这种开销。
以下选项可用于配置 SSH 多路复用:
ControlMaster: 这个选项告诉 SSH 在可能的情况下是否允许多路复用。通常,如果您希望使用此选项,您应该在连接缓慢的主机部分或通用Host *部分将其设置为“自动” 。
ControlPath: 此选项用于指定用于控制连接的套接字文件。它应该是文件系统上的一个位置。通常,这是使用 SSH 变量给出的,以便按主机轻松标记套接字。要根据用户名、远程主机和端口命名套接字,您可以使用./path/to/socket/%r@%h:%p
ControlPersist:此选项确定在最终 SSH 连接关闭后 TCP 连接应保持打开的时间量(以秒为单位)。将此值设置为较高的数字将允许您在关闭第一个连接后打开新连接,但您通常可以将其设置为较低的值,例如“1”,以避免保持未使用的 TCP 连接打开。
通常,您可以使用如下所示的部分进行设置:
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
之后,您应该确保创建目录:
mkdir -p ~/.ssh/multiplex
如果您不希望对特定连接使用多路复用,您可以在命令行上选择不使用多路复用,如下所示:
ssh -S none user@host