Skip to content

Commit 94b6247

Browse files
committed
fix -p 8080:127.0.0.1:80
Signed-off-by: Akihiro Suda <[email protected]>
1 parent 4437ed2 commit 94b6247

File tree

5 files changed

+75
-15
lines changed

5 files changed

+75
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ $ sshocker -p 8080:80 -v .:/mnt/sshfs [email protected]
4141

4242
Flags (similar to `docker run` flags):
4343
* `-v LOCALDIR:REMOTEDIR[:ro]`: Mount a reverse SSHFS
44-
* `-p [LOCALIP:]LOCALPORT:[REMOTEIP:]REMOTEPORT`: Expose a port
44+
* `-p [[LOCALIP:]LOCALPORT:]REMOTEPORT`: Expose a port
4545

4646
SSH flags:
4747
* `-F`, `--ssh-config=FILE`: specify SSH config file used for `ssh -F`

cmd/sshocker/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func newApp() *cli.App {
1212
app := cli.NewApp()
1313
app.Name = "sshocker"
1414
app.Usage = "ssh + reverse sshfs + port forwarder, in Docker-like CLI"
15-
app.UsageText = "sshocker run -p LOCALPORT:REMOTEPORT -v LOCALDIR:REMOTEDIR USER@HOST"
15+
app.UsageText = "sshocker run -p LOCALIP:LOCALPORT:REMOTEPORT -v LOCALDIR:REMOTEDIR USER@HOST"
1616

1717
app.Flags = []cli.Flag{
1818
&cli.BoolFlag{

cmd/sshocker/run.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,3 @@ func parseFlagV(s string) (mount.Mount, error) {
123123
}
124124
return m, nil
125125
}
126-
127-
// parseFlagP parses -p flag, akin to `docker run -p` flags.
128-
// The returned value conforms to the `ssh -L` syntax
129-
func parseFlagP(s string) (string, error) {
130-
split := strings.Split(s, ":")
131-
if len(split) >= 3 {
132-
return s, nil
133-
}
134-
if len(split) == 2 {
135-
return split[0] + ":localhost:" + split[1], nil
136-
}
137-
return "", errors.Errorf("cannot parse %q", s)
138-
}

cmd/sshocker/run_p.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
8+
"github.com/pkg/errors"
9+
)
10+
11+
// parseFlagP parses -p flag, akin to `docker run -p` flags.
12+
// The returned value conforms to the `ssh -L` syntax
13+
func parseFlagP(s string) (string, error) {
14+
split := strings.Split(s, ":")
15+
switch len(split) {
16+
case 1:
17+
port, err := strconv.Atoi(split[0])
18+
if err != nil {
19+
return "", errors.Errorf("invalid port %q", split[0])
20+
}
21+
return fmt.Sprintf("0.0.0.0:%d:localhost:%d", port, port), nil
22+
case 2:
23+
localPort, err := strconv.Atoi(split[0])
24+
if err != nil {
25+
return "", errors.Errorf("invalid port %q", split[0])
26+
}
27+
remotePort, err := strconv.Atoi(split[1])
28+
if err != nil {
29+
return "", errors.Errorf("invalid port %q", split[1])
30+
}
31+
return fmt.Sprintf("0.0.0.0:%d:localhost:%d", localPort, remotePort), nil
32+
case 3:
33+
localIP := split[0]
34+
localPort, err := strconv.Atoi(split[1])
35+
if err != nil {
36+
return "", errors.Errorf("invalid port %q", split[1])
37+
}
38+
remotePort, err := strconv.Atoi(split[2])
39+
if err != nil {
40+
return "", errors.Errorf("invalid port %q", split[2])
41+
}
42+
return fmt.Sprintf("%s:%d:localhost:%d", localIP, localPort, remotePort), nil
43+
}
44+
return "", errors.Errorf("cannot parse %q, should be [[LOCALIP:]LOCALPORT:]REMOTEPORT", s)
45+
}

cmd/sshocker/run_p_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package main
2+
3+
import "testing"
4+
5+
func TestParseFlagP(t *testing.T) {
6+
testCases := map[string]string{
7+
"80": "0.0.0.0:80:localhost:80",
8+
"8080:80": "0.0.0.0:8080:localhost:80",
9+
"127.0.0.1:8080:80": "127.0.0.1:8080:localhost:80",
10+
"127.0.0.1:8080:127.0.0.1:80": "",
11+
}
12+
for k, v := range testCases {
13+
got, err := parseFlagP(k)
14+
if v == "" {
15+
if err == nil {
16+
t.Errorf("error is expected for %q", k)
17+
}
18+
continue
19+
}
20+
if err != nil {
21+
t.Errorf("failed to parse %q: %v", k, err)
22+
continue
23+
}
24+
if got != v {
25+
t.Errorf("expected %q, got %q for %q", v, got, k)
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)