使用SSH配置文件

时间:2020-03-05 15:30:07  来源:igfitidea点击:

如果我们定期通过SSH连接到多个远程系统,则会发现记住所有的远程IP地址,不同的用户名,非标准端口和各种命令行选项非常困难,即使不是不可能。

一种选择是为每个远程服务器连接创建一个bash别名。

但是,还有另一个更好,更简单的解决方案。
OpenSSH允许我们设置每个用户的配置文件,我们可以其中为所连接的每台远程计算机存储不同的SSH选项。

本教程介绍了SSH客户端配置文件的基础知识,并介绍了一些最常见的配置选项。

准备工作

我们假设我们使用的是安装了OpenSSH客户端的Linux或者macOS系统。

SSH配置文件位置

OpenSSH客户端配置文件名为“ config”,存储在用户主目录下的“ .ssh”目录中。

当用户第一次运行“ ssh”命令时,将自动创建“~/.ssh”目录。

如果系统上不存在该目录,请使用以下命令创建该目录:

mkdir -p ~/.ssh && chmod 700 ~/.ssh

默认情况下,SSH配置文件可能不存在,因此我们可能需要使用touch命令创建它:

touch ~/.ssh/config

该文件只能由用户读取和写入,而其他用户则不能访问:

chmod 600 ~/.ssh/config

SSH配置文件的结构和模式

SSH配置文件采用以下结构:

Host hostname1
    SSH_OPTION value
    SSH_OPTION value
Host hostname2
    SSH_OPTION value
Host *
    SSH_OPTION value

SSH客户端配置文件的内容按节(各节)进行组织。
每个节均以“ Host”指令开头,并包含在与远程SSH服务器建立连接时使用的特定SSH选项。

缩进不是必需的,但建议使用缩进,因为它使文件更易于阅读。

“主机”指令可以包含一个模式或者以空格分隔的模式列表。
每个模式都可以包含零个或者多个非空白字符,或者以下模式说明符之一:

  • ''-匹配零个或者多个字符。例如,“主机”匹配所有主机,而“ 192.168.0。*”匹配“ 192.168.0.0/24”子网中的主机。
  • '?' -完全匹配一个字符。模式为“主机10.10.0。?”与“ 10.10.0。[0-9]”范围内的所有主机匹配。
  • '!' -在图案开头使用时,它会否定匹配。例如,“主机10.10.0。*!10.10.0.5”匹配“ 10.10.0.0/24”子网中除“ 10.10.0.5”之外的任何主机。

SSH客户端逐节读取配置文件节,如果多个模式匹配,则第一个匹配节中的选项优先。
因此,应在文件开头给出更多特定于主机的声明,并在文件末尾给出更多常规替代。

我们可以通过在终端中键入'man ssh_config'或者访问ssh_config手册页来找到可用的ssh选项的完整列表。

其他程序(例如scp,sftp和rsync)也会读取SSH配置文件。

SSH配置文件示例

既然我们已经介绍了SSH配置文件的基本知识,让我们来看下面的示例。

通常,当通过SSH连接到远程服务器时,我们将指定远程用户名,主机名和端口。
例如,要从命令行以名为“ john”的用户身份登录到端口“ 2322”上名为“ dev.example.com”的主机,请输入:

ssh [email protected] -p 2322

要使用上面命令中提供的相同选项连接到服务器,只需键入'ssh dev',请将以下几行放在“”~/.ssh/config“文件中:

~/.ssh/config

Host dev
    HostName dev.example.com
    User john
    Port 2322

现在,当我们键入'ssh dev'时,ssh客户端将读取配置文件并使用为'dev'主机指定的连接详细信息:

ssh dev

共享的SSH配置文件示例

此示例提供有关主机模式和选项优先级的更多详细信息。

让我们看下面的示例文件:

Host targaryen
    HostName 192.168.1.10
    User daenerys
    Port 7654
    IdentityFile ~/.ssh/targaryen.key
Host tyrell
    HostName 192.168.10.20
Host martell
    HostName 192.168.10.50
Host *ell
    user oberyn
Host * !martell
    LogLevel INFO
Host *
    User root
    Compression yes
  • 当我们键入'ssh targaryen'时,ssh客户端将读取文件并从第一个匹配项'Host targaryen'中应用选项。然后,它一个接一个地检查下一个节以找到匹配的模式。下一个匹配的主机是'Host *!martell'(意味着除'martell'之外的所有主机),它将应用此节中的连接选项。最后一个定义'Host *'也匹配,但是ssh客户端将只使用'Compression'选项,因为'User targaryen'节中已经定义了'User'选项。 targaryen'如下:
HostName 192.168.1.10
User daenerys
Port 7654
IdentityFile ~/.ssh/targaryen.key
LogLevel INFO
Compression yes
  • 运行'ssh tyrell'时,匹配的主机模式为:'Host tyrell','Host * ell','Host *!martell'和'Host *'。在这种情况下使用的选项是:
HostName 192.168.10.20
User oberyn
LogLevel INFO
Compression yes
  • 如果运行'ssh martell',则匹配的主机模式为:'Host martell','Host * ell'和'Host *'。在这种情况下使用的选项是:
HostName 192.168.10.50
User oberyn
Compression yes
  • 对于所有其他连接,ssh客户端将使用“主机*!martell”和“主机*”部分中指定的选项。

覆盖SSH配置文件选项

ssh客户端按以下优先级顺序读取其配置:

  • 从命令行指定的选项。
  • 在'~/.ssh/config'中定义的选项。
  • 在'/etc/ssh/ssh_config'中定义的选项。

如果要覆盖单个选项,则可以在命令行上指定它。
例如,如果我们具有以下定义:

Host dev
    HostName dev.example.com
    User john
    Port 2322

而我们要使用所有其他选项,但要以用户“ root”而不是“ john”的身份进行连接,只需在命令行上指定用户:

ssh -o "User=root" dev

'-F'('configfile')选项允许我们指定每个用户的备用配置文件。

要告诉“ ssh”客户端忽略ssh配置文件中指定的所有选项,请使用:

ssh -F /dev/null [email protected]