parse ssh host info from per host string using 'net/url'#143
parse ssh host info from per host string using 'net/url'#143kadefor wants to merge 9 commits intopressly:masterfrom
Conversation
VojtechVitek
left a comment
There was a problem hiding this comment.
Thanks for your contribution. Few questions/suggestions. Looks good otherwise.
ssh.go
Outdated
| c.user = c.host[:at] | ||
| c.host = c.host[at+1:] | ||
| // Add default port, if not set | ||
| if _, p, err := net.SplitHostPort(info.Host); err != nil && p == "" { |
There was a problem hiding this comment.
this condition looks suspicious
should this be err == nil && p == ""?
or err != nil || p == "" ?
There was a problem hiding this comment.
oh, It's my mistake! Thanks for your review! :-)
ssh.go
Outdated
| host = "ssh://" + host | ||
| } | ||
|
|
||
| info, err := url.Parse(host) |
There was a problem hiding this comment.
can we call this u or url?
There was a problem hiding this comment.
the object is about host info, can we change the variable name to "h" or "hostInfo"?
There was a problem hiding this comment.
it's host URL :) I prefer u, url or hostURL if you want to be more specific
There was a problem hiding this comment.
it's the same name, "url" and package "net/url". I'll use the "hostURL" :-)
| c.host = info.Host | ||
| if u := info.User.Username(); u != "" { | ||
| c.user = u | ||
| } |
There was a problem hiding this comment.
This is nice refactor, thanks!
ssh.go
Outdated
| } | ||
|
|
||
| v := vs[len(vs)-1] | ||
| if (v[0] == '\'' && v[len(v)-1] == '\'') || (v[0] == '"' && v[len(v)-1] == '"') { |
There was a problem hiding this comment.
I'm not sure what this complex condition is for.
Why don't you strings.Trim() it without these checks?
There was a problem hiding this comment.
the reason is the difference between ' and " in shell
example:
ssh://root:123@456@192.168.16.10:22/~/.ssh/id_rsa?MY_VAR="aa bb cc dd"&ABC_VAR='help, run: echo $HOME'&XYZ_VAR="my home dir is $HOME"&other_var='abc$xyz'
if no the 'complex condition' and just use strings.Trim(), the shell variable in c.env will be:
export MY_VAR="aa bb cc dd";
export ABC_VAR="help, run: echo $HOME";
export XYZ_VAR="my home dir is $HOME";
export other_var="abc$xyz";
but, I want:
export MY_VAR="aa bb cc dd";
export ABC_VAR='help, run: echo $HOME';
export XYZ_VAR="my home dir is $HOME";
export other_var='abc$xyz';
the difference:
mac-dev:~ kadefor$ abc='help, run: echo $HOME'
mac-dev:~ kadefor$ echo $abc
help, run: echo $HOME
mac-dev:~ kadefor$ abc="help, run: echo $HOME"
mac-dev:~ kadefor$ echo $abc
help, run: echo /Users/kadefor
mac-dev:~ kadefor$ abc='abc$xyz'
mac-dev:~ kadefor$ echo $abc
abc$xyz
mac-dev:~ kadefor$ abc="abc$xyz"
mac-dev:~ kadefor$ echo $abc
abc
There was a problem hiding this comment.
Sorry, I don't understand what ssh://root:123@456@192.168.16.10:22/~/.ssh/id_rsa?MY_VAR="aa bb cc dd"&ABC_VAR='help, run: echo $HOME'&XYZ_VAR="my home dir is $HOME"&other_var='abc$xyz' represents.
We should be parsing pure SSH connection string. Imho, there shouldn't be any path after the [scheme://username:passwd@]host[:port].
There was a problem hiding this comment.
I think it is a way to set env for per host, currently. If have a new and better method in the future( save host info to struct in Supfile?), we can disable the feature.
Need to disable it in this PR now? :-)
There was a problem hiding this comment.
you can set env vars via Supfile :)
imho we should just strip off hostUrl.Path
There was a problem hiding this comment.
currently, how to set env for per host in Supfile? (about #111)
Could I leave it as an experimental function? If not, remove it :-D
Thank you for your review, again!
There was a problem hiding this comment.
Interesting, I don't think sup supports setting env vars per host right now. It supports setting env vars globally or per network.
Yes please, remove this feature for now. You can create a new issue for it and we'll see if there's any more interest for it out there. I doubt it, though.
We might think about per-host env vars, though. I like it.
Or, I think you could even set those env vars on the server side in the ~/.ssh/authorized_keys file:
command="export VAR=1; /bin/sh" ssh-key
There was a problem hiding this comment.
ok, I'll remove it. Thanks for your suggestions! :)
VojtechVitek
left a comment
There was a problem hiding this comment.
LGTM.
Any volunteers to test this feature?
| host = "ssh://" + host | ||
| } | ||
|
|
||
| hostURL, err := url.Parse(host) |
There was a problem hiding this comment.
Can you test this with:
127.0.0.1
localhost
localhost:22
ssh://localhost
etc.?
I know url.Parse(host) had some issues with localhost URLs.
There was a problem hiding this comment.
@VojtechVitek what is the issues?
here is a simple test:
sup kadefor$ cat ssh_test.go
package sup
import (
"fmt"
"testing"
)
func Test_parseHost(t *testing.T) {
hosts := []string{
"127.0.0.1",
"localhost",
"localhost:22",
"ssh://localhost",
"tom@127.0.0.1",
"tom@localhost",
"tom@localhost:22",
"ssh://tom@localhost",
"tom:11@@33@127.0.0.1",
"tom:11@@33@localhost",
"tom:11@@33@localhost:22",
"ssh://tom:11@@33@localhost",
}
for _, host := range hosts {
c := &SSHClient{}
err := c.parseHost(host)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n\t%v\n", host, c)
}
}
}
sup kadefor$ go test
127.0.0.1
&{<nil> <nil> kadefor 127.0.0.1:22 <nil> <nil> <nil> false false false export SUP_HOST="127.0.0.1:22"; }
localhost
&{<nil> <nil> kadefor localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
localhost:22
&{<nil> <nil> kadefor localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
ssh://localhost
&{<nil> <nil> kadefor localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
tom@127.0.0.1
&{<nil> <nil> tom 127.0.0.1:22 <nil> <nil> <nil> false false false export SUP_HOST="127.0.0.1:22"; }
tom@localhost
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
tom@localhost:22
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
ssh://tom@localhost
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
tom:11@@33@127.0.0.1
&{<nil> <nil> tom 127.0.0.1:22 <nil> <nil> <nil> false false false export SUP_HOST="127.0.0.1:22"; }
tom:11@@33@localhost
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
tom:11@@33@localhost:22
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
ssh://tom:11@@33@localhost
&{<nil> <nil> tom localhost:22 <nil> <nil> <nil> false false false export SUP_HOST="localhost:22"; }
PASS
ok github.com/pressly/sup 0.014s
|
@VojtechVitek @kadefor any updates on this? thanks. |
|
This is pending QA. Someone from the community should test this PR and then we can merge. I don't have time to test this out at this time. |
Currently, get some info from host string:
ssh env variable (per host env vars #111)