Tcl 使用spawing SSH的过程不会';我不能与expect一起正常工作

Tcl 使用spawing SSH的过程不会';我不能与expect一起正常工作,tcl,expect,Tcl,Expect,我有一个expect脚本,当使用一个过程生成SSH时,然后使用expect不起作用,当直接使用SSH spawn时,expect似乎可以正常工作。 你知道这里有什么不对吗 我在另一种情况下使用相同的代码片段,效果很好 proc sshLogin {serverName userName password} { global logfd set timeout 10 logMessage "Connecting to server = $serverName, please wait

我有一个expect脚本,当使用一个过程生成SSH时,然后使用expect不起作用,当直接使用SSH spawn时,expect似乎可以正常工作。 你知道这里有什么不对吗

我在另一种情况下使用相同的代码片段,效果很好

proc sshLogin {serverName userName password} {
  global logfd
  set timeout 10
  logMessage "Connecting to  server = $serverName, please wait..."
  log_user 0
  spawn -noecho ssh -X "$userName\@$serverName"
  expect { 
    "password:" {
      send "$password\r"
      expect {
        "]#" {
          log_user 1
          logMessage "Logged in to Server = $serverName"
          return 1
        }
        "Permission denied" {
          log_user 1
          logMessage "Incorrect password!"
        }
      }
    }
    timeout {
      log_user 1
      logMessage "Connection to $serverName timed out"
    }
    eof {
      log_user 1
      logMessage "Connection to $serverName failed!"
    }
  }
  return 0
}

您还应该声明
spawn\u id
是过程中的全局变量,方法是添加:

global spawn_id
或通过将
global logfd
更改为:

global logfd spawn_id
这是因为
spawn\u id
变量的当前值用于确定要控制的内容(如果希望控制两个子流程,则这一点至关重要)。Expect尝试做一些“聪明”的事情来处理这样的情况:您将
Expect
/
发送
调用放在一个过程中,而不声明任何东西,但是它不是一个非常可靠的方法,而且它不能与
spawn
本身一起工作:您必须使其显式(在处理过程时这是一个好主意)