mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-05 23:51:29 +02:00
Fix ssh kitten override parsing ignoring settings inherited from ssh.conf
Fixes #6639
This commit is contained in:
@@ -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]
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -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::
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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'="\\"`)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user