Skip to content

Commit e02ab45

Browse files
authored
Merge pull request docker-archive-public#4388 from docker/4302-scp-commandline-win
Fix argument escaping for scp on Windows
2 parents d8b1195 + 7055c02 commit e02ab45

File tree

3 files changed

+61
-21
lines changed

3 files changed

+61
-21
lines changed

commands/scp.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"os/exec"
88
"strings"
99

10-
"github.com/docker/machine/libmachine"
1110
"github.com/docker/machine/libmachine/log"
1211
"github.com/docker/machine/libmachine/persist"
1312
)
@@ -54,26 +53,6 @@ func (s *storeHostInfoLoader) load(name string) (HostInfo, error) {
5453
return host.Driver, nil
5554
}
5655

57-
func cmdScp(c CommandLine, api libmachine.API) error {
58-
args := c.Args()
59-
if len(args) != 2 {
60-
c.ShowHelp()
61-
return errWrongNumberArguments
62-
}
63-
64-
src := args[0]
65-
dest := args[1]
66-
67-
hostInfoLoader := &storeHostInfoLoader{api}
68-
69-
cmd, err := getScpCmd(src, dest, c.Bool("recursive"), c.Bool("delta"), c.Bool("quiet"), hostInfoLoader)
70-
if err != nil {
71-
return err
72-
}
73-
74-
return runCmdWithStdIo(*cmd)
75-
}
76-
7756
func getScpCmd(src, dest string, recursive bool, delta bool, quiet bool, hostInfoLoader HostInfoLoader) (*exec.Cmd, error) {
7857
var cmdPath string
7958
var err error

commands/scp_unix.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// +build !windows
2+
3+
package commands
4+
5+
import (
6+
"github.com/docker/machine/libmachine"
7+
)
8+
9+
func cmdScp(c CommandLine, api libmachine.API) error {
10+
args := c.Args()
11+
if len(args) != 2 {
12+
c.ShowHelp()
13+
return errWrongNumberArguments
14+
}
15+
16+
src := args[0]
17+
dest := args[1]
18+
19+
hostInfoLoader := &storeHostInfoLoader{api}
20+
21+
cmd, err := getScpCmd(src, dest, c.Bool("recursive"), c.Bool("delta"), c.Bool("quiet"), hostInfoLoader)
22+
if err != nil {
23+
return err
24+
}
25+
26+
return runCmdWithStdIo(*cmd)
27+
}

commands/scp_windows.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package commands
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"syscall"
7+
8+
"github.com/docker/machine/libmachine"
9+
)
10+
11+
func cmdScp(c CommandLine, api libmachine.API) error {
12+
args := c.Args()
13+
if len(args) != 2 {
14+
c.ShowHelp()
15+
return errWrongNumberArguments
16+
}
17+
18+
src := args[0]
19+
dest := args[1]
20+
21+
hostInfoLoader := &storeHostInfoLoader{api}
22+
23+
cmd, err := getScpCmd(src, dest, c.Bool("recursive"), c.Bool("delta"), c.Bool("quiet"), hostInfoLoader)
24+
if err != nil {
25+
return err
26+
}
27+
28+
// Default argument escaping is not valid for scp.exe with quoted arguments, so we do it ourselves
29+
// see golang/go#15566
30+
cmd.SysProcAttr = &syscall.SysProcAttr{}
31+
cmd.SysProcAttr.CmdLine = fmt.Sprintf("%s %s", cmd.Path, strings.Join(cmd.Args, " "))
32+
33+
return runCmdWithStdIo(*cmd)
34+
}

0 commit comments

Comments
 (0)