Fix ssh kitten override parsing ignoring settings inherited from ssh.conf

Fixes #6639
This commit is contained in:
Kovid Goyal
2023-09-20 09:12:48 +05:30
parent 18e5b74699
commit b21bbbe14c
5 changed files with 34 additions and 11 deletions

View File

@@ -43,6 +43,14 @@ The :doc:`ssh kitten <kittens/ssh>` is redesigned with powerful new features:
Detailed list of changes Detailed list of changes
------------------------------------- -------------------------------------
0.30.1 [future]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ssh kitten: Fix a regression in 0.28.0 that caused using ``--kitten`` to
override :file:`ssh.conf` not inheriting settings from :file:`ssh.conf`
(:iss:`6639`)
0.30.0 [2023-09-18] 0.30.0 [2023-09-18]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -82,10 +82,10 @@ Additionally, you can pass config options on the command line:
kitty +kitten ssh --kitten interpreter=python servername kitty +kitten ssh --kitten interpreter=python servername
The :code:`--kitten` argument can be specified multiple times, with directives The :code:`--kitten` argument can be specified multiple times, with directives
from :file:`ssh.conf`. These are merged with :file:`ssh.conf` as if they were from :file:`ssh.conf`. These override the final options used for the matched host, as if they
appended to the end of that file. They apply only to the host being SSHed to by had been appended to the end of the matching section for that host in
this invocation, so any :opt:`hostname <kitten-ssh.hostname>` directives are :file:`ssh.conf`. They apply only to the host being SSHed to by this invocation,
ignored. so any :opt:`hostname <kitten-ssh.hostname>` directives are ignored.
.. warning:: .. warning::

View File

@@ -391,9 +391,20 @@ func (self *ConfigSet) line_handler(key, val string) error {
func load_config(hostname_to_match string, username_to_match string, overrides []string, paths ...string) (*Config, []config.ConfigLine, error) { func load_config(hostname_to_match string, username_to_match string, overrides []string, paths ...string) (*Config, []config.ConfigLine, error) {
ans := &ConfigSet{all_configs: []*Config{NewConfig()}} ans := &ConfigSet{all_configs: []*Config{NewConfig()}}
p := config.ConfigParser{LineHandler: ans.line_handler} p := config.ConfigParser{LineHandler: ans.line_handler}
err := p.LoadConfig("ssh.conf", paths, overrides) err := p.LoadConfig("ssh.conf", paths, nil)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
return config_for_hostname(hostname_to_match, username_to_match, ans), p.BadLines(), nil final_conf := config_for_hostname(hostname_to_match, username_to_match, ans)
bad_lines := p.BadLines()
if len(overrides) > 0 {
h := final_conf.Hostname
override_parser := config.ConfigParser{LineHandler: final_conf.Parse}
if err = override_parser.ParseOverrides(overrides...); err != nil {
return nil, nil, err
}
bad_lines = append(bad_lines, override_parser.BadLines()...)
final_conf.Hostname = h
}
return final_conf, bad_lines, nil
} }

View File

@@ -24,11 +24,14 @@ func TestSSHConfigParsing(t *testing.T) {
hostname := "unmatched" hostname := "unmatched"
username := "" username := ""
conf := "" conf := ""
overrides := []string{}
for_python := false for_python := false
cf := filepath.Join(tdir, "ssh.conf") cf := filepath.Join(tdir, "ssh.conf")
rt := func(expected_env ...string) { rt := func(expected_env ...string) {
os.WriteFile(cf, []byte(conf), 0o600) if err := os.WriteFile(cf, []byte(conf), 0o600); err != nil {
c, bad_lines, err := load_config(hostname, username, nil, cf) t.Fatal(err)
}
c, bad_lines, err := load_config(hostname, username, overrides, cf)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -52,6 +55,10 @@ func TestSSHConfigParsing(t *testing.T) {
rt() rt()
conf = "env a=b" conf = "env a=b"
rt(`export 'a'="b"`) rt(`export 'a'="b"`)
conf = "env a=b"
overrides = []string{"env=c=d"}
rt(`export 'a'="b"`, `export 'c'="d"`)
overrides = nil
conf = "env a=\\" conf = "env a=\\"
rt(`export 'a'="\\"`) rt(`export 'a'="\\"`)

View File

@@ -115,9 +115,6 @@ func parse_kitten_args(found_extra_args []string, username, hostname_for_match s
} }
} }
} }
if len(overrides) > 0 {
overrides = append([]string{"hostname " + username + "@" + hostname_for_match}, overrides...)
}
return return
} }