1

编辑:我已经看到了可行的情况和不可行的情况,我不确定我何时/为什么这样做。

假设我有一个足够复杂的条目,我在其中指定了多个参数来获取thathost

Host thathost
    ControlMaster auto
    ServerAliveInterval 8
    ConnectTimeout 8
    Hostname 192.168.5.1
    User mememe
    ProxyJump thejumpbox

我想通过添加或覆盖某些配置来重新使用此定义来创建提供不同功能的其他条目。专门指定一个备用端口(不,我不想在命令行上使用它)。

理想情况下,我可以做类似的事情

Host theirhost
    Hostname thathost
    User themthem

或者

Host my-remote-serialport
    Hostname thathost
    RequestTTY yes
    RemoteCommand some-script-that-launches-kermit-on-a-specific-dev-tty

或者

Host my-remote-serialport
    Hostname thathost
    Port 3004

我严格地希望根据另一个现有的主机来指定一个主机,我不想修改我的Host条目以匹配一些模式“技巧”。

显然,我可以使用ProxyCommand ssh -q nc thathost...or ProxyJump thathost+Hostname localhost后跟所有其他覆盖(端口覆盖将传递给nc),但这既丑陋又浪费(额外的会话) - 请不要回答这个问题。

对我来说,这一直是的缺失功能ssh-config但也许我看起来不够努力。

4

2 回答 2

3

它不能以您要求的方式使用,例如重用hostname定义,但是提供的 ssh 解决方案可以解决更多问题。

主机规则可以跨越多个主机。

Host thathost theirhost my-remote-serialport
    ControlMaster auto
    ServerAliveInterval 8
    ConnectTimeout 8
    Hostname 192.168.5.1
    User mememe
    ProxyJump thejumpbox

但显然这并不能解决您修改某些属性的问题。
诀窍是,ssh 配置对属性使用先胜策略。

在您的情况下,您只需在主配置前面添加修改

Host theirhost
    Hostname thathost
    User themthem

Host my-remote-serialport
    Hostname thathost
    Port 3004

Host thathost theirhost my-remote-serialport
    ControlMaster auto
    ServerAliveInterval 8
    ConnectTimeout 8
    Hostname 192.168.5.1
    User mememe
    ProxyJump thejumpbox

theirhost在两个地方定义,属性HostnameUser取自第一个定义,所有其他属性取自第二个定义。

host部分还接受通配符,例如具有多个反向 ssh 端点的跳转框:

HOST my_1
   port 2001

HOST my_2
   port 2002

HOST my_3
   port 2003

HOST my_*
   user pi
   hostname localhost
   ProxyJump thejumpbox
于 2021-12-30T16:49:29.200 回答
2

没有办法引用不同的块;但是,您可以包含具有全局配置的特定配置文件。例如,创建一个供 、 和 使用thathosttheirhost文件my-remote-serialport。我们就叫它吧foo-config

ControlMaster auto
ServerAliveInterval 8
ConnectTimeout 8
Hostname 192.168.5.1
User mememe
ProxyJump thejumpbox

然后,您可以Include根据需要使用指令来读取它:

Host theirhost
    Include foo-config
    User themthem

Host my-remote-serialport
    Include foo-config
    RequestTTY yes
    RemoteCommand some-script-that-launches-kermit-on-a-specific-dev-tty

Host my-remote-serialport
    Include foo-config
    Port 3004

但是,我怀疑这种方法很少需要,并且jeb 给出的方法在大多数情况下可能就足够了。

于 2021-12-30T17:00:56.737 回答