Procházet zdrojové kódy

ssh system commands: wait on write from command out to network

we only need to wait for the write from the local command to
the ssh channel. There is no need to wait for the write from ssh
channel to the local command stdin
Nicola Murino před 5 roky
rodič
revize
bc844105b2
2 změnil soubory, kde provedl 5 přidání a 7 odebrání
  1. 1 1
      sftpd/sftpd.go
  2. 4 6
      sftpd/ssh_cmd.go

+ 1 - 1
sftpd/sftpd.go

@@ -424,7 +424,7 @@ func executeAction(operation, username, path, target, sshCmd string) error {
 		if _, err = os.Stat(actions.Command); err == nil {
 			command := exec.Command(actions.Command, operation, username, path, target, sshCmd)
 			err = command.Start()
-			logger.Debug(logSender, "", "start command %#v with arguments: %v, %v, %v, %v %v, error: %v",
+			logger.Debug(logSender, "", "start command %#v with arguments: %#v, %#v, %#v, %#v, %#v, error: %v",
 				actions.Command, operation, username, path, target, sshCmd, err)
 			if err == nil {
 				// we are in a goroutine but we don't want to block here, this way we can send the

+ 4 - 6
sftpd/ssh_cmd.go

@@ -174,8 +174,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error {
 		c.connection.channel.Close()
 	}
 	var once sync.Once
-	var wg sync.WaitGroup
-	wg.Add(2)
+	commandResponse := make(chan bool)
 
 	go func() {
 		defer stdin.Close()
@@ -207,7 +206,6 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error {
 		if e != nil {
 			once.Do(closeCmdOnError)
 		}
-		wg.Done()
 	}()
 
 	go func() {
@@ -235,7 +233,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error {
 		if e != nil {
 			once.Do(closeCmdOnError)
 		}
-		wg.Done()
+		commandResponse <- true
 	}()
 
 	go func() {
@@ -265,7 +263,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error {
 		}
 	}()
 
-	wg.Wait()
+	<-commandResponse
 	err = command.cmd.Wait()
 	c.sendExitStatus(err)
 	c.rescanHomeDir()
@@ -290,7 +288,7 @@ func (c *sshCommand) getSystemCommand() (systemCommand, error) {
 		args = args[:len(args)-1]
 		args = append(args, path)
 	}
-	c.connection.Log(logger.LevelDebug, logSenderSSH, "new system command: %v, with args: %v path: %v", c.command, args, path)
+	c.connection.Log(logger.LevelDebug, logSenderSSH, "new system command %#v, with args: %v path: %v", c.command, args, path)
 	cmd := exec.Command(c.command, args...)
 	uid := c.connection.User.GetUID()
 	gid := c.connection.User.GetGID()