@@ -5,8 +5,11 @@ import (
55 "context"
66 "net"
77 "net/url"
8+ "os"
9+ "strconv"
810 "strings"
911
12+ "github.com/docker/cli/cli/config"
1013 "github.com/docker/cli/cli/connhelper/commandconn"
1114 "github.com/docker/cli/cli/connhelper/ssh"
1215 "github.com/pkg/errors"
@@ -52,6 +55,7 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*ConnectionHelper
5255 args = append (args , "--host" , "unix://" + sp .Path )
5356 }
5457 sshFlags = addSSHTimeout (sshFlags )
58+ sshFlags = addMultiplexingArgs (sshFlags )
5559 args = append (args , "system" , "dial-stdio" )
5660 return commandconn .New (ctx , "ssh" , append (sshFlags , sp .Args (args ... )... )... )
5761 },
@@ -73,6 +77,22 @@ func GetCommandConnectionHelper(cmd string, flags ...string) (*ConnectionHelper,
7377 }, nil
7478}
7579
80+ func addMultiplexingArgs (sshFlags []string ) []string {
81+ if v := os .Getenv ("DOCKER_SSH_NO_MUX" ); v != "" {
82+ if b , err := strconv .ParseBool (v ); err == nil && b {
83+ return nil
84+ }
85+ }
86+ if err := os .MkdirAll (config .Dir (), 0o700 ); err != nil {
87+ return nil
88+ }
89+ sshFlags = append (sshFlags , "-o" , "ControlMaster=auto" , "-o" , "ControlPath=" + config .Dir ()+ "/%r@%h:%p" )
90+ if v := os .Getenv ("DOCKER_SSH_MUX_PERSIST" ); v != "" {
91+ sshFlags = append (sshFlags , "-o" , "ControlPersist=" + v )
92+ }
93+ return sshFlags
94+ }
95+
7696func addSSHTimeout (sshFlags []string ) []string {
7797 if ! strings .Contains (strings .Join (sshFlags , "" ), "ConnectTimeout" ) {
7898 sshFlags = append (sshFlags , "-o ConnectTimeout=30" )
0 commit comments