Linux 期望从不检查匹配项

Linux 期望从不检查匹配项,linux,expect,Linux,Expect,我有一个简单的测试脚本test.sh: #!/bin/bash ssh username@server.net ls ssh username@server.net ls exit 0 我还有一个Expect脚本: #!/usr/bin/expect -- set timeout -1 spawn ./test.sh expect -exact "username@server.net's password: " send -- "mypassword\r&quo

我有一个简单的测试脚本test.sh:

#!/bin/bash
ssh username@server.net ls
ssh username@server.net ls
exit 0
我还有一个Expect脚本:

#!/usr/bin/expect --
set timeout -1
spawn ./test.sh
expect -exact "username@server.net's password: "
send -- "mypassword\r"
expect eof
这在第一次调用
ssh
时可以正常工作,但当然不会填充第二个密码提示。看起来解决方案是这样的:

#!/usr/bin/expect --
set timeout -1
spawn ./test.sh
expect {
      "username@server.net's password: " {
            send -- "mypassword\r"
            exp_continue
      }
}
expect eof
不幸的是,这不起作用。它只是向我显示密码提示,并没有填充它,甚至不是第一次

当我用
expect-d
调用它时,工作版本输出以下内容:

expect version 5.45
argv[0] = expect  argv[1] = -d  argv[2] = test.exp
set argc 0
set argv0 "test.exp"
set argv ""
executing commands from command file test.exp
spawn ./test.sh
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {23031}

expect: does "" (spawn_id exp8) match exact string "username@server.net's password: "? no
username@server.net's password:
expect: does "username@server.net's password: " (spawn_id exp8) match exact string "username@server.net's password: "? yes
expect: set expect_out(0,string) "username@server.net's password: "
expect: set expect_out(spawn_id) "exp8"
expect: set expect_out(buffer) "username@server.net's password: "
send: sending "mypassword\r" to { exp8 }
非工作版本通过
spawn:returns{…}
(当然,它是一个不同的数字)以字符对字符的方式相同。但是,它只是跳转到密码提示,而不进行任何匹配检查,并停留在那里:

expect version 5.45
argv[0] = expect  argv[1] = -d  argv[2] = test.exp
set argc 0
set argv0 "test.exp"
set argv ""
executing commands from command file test.exp
spawn ./test.sh
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {85647}
username@server.net's password:
我做错了什么


(我使用循环来实现这一点,因为在我的真实脚本中,不知道密码提示需要填充多少次。我没有使用SSH密钥,因为服务器管理员已经禁用了它。)

一件事是,在expect命令中,只有一个分支,exp_continue,没有“break”条件。试试这个:

expect {
      " password: " {
            send -- "mypassword\r"
            exp_continue
      }
      eof
}

一件事是,在expect命令中,只有一个分支和exp_continue,不存在“break”条件。试试这个:

expect {
      " password: " {
            send -- "mypassword\r"
            exp_continue
      }
      eof
}

查看非工作版本的调试输出会很有帮助。当然,如果您切换到SSH密钥,并且根本不需要输入密码,这不会是一个问题
ssh-keygen
然后
ssh-copy-id
diff
显示非工作版本的输出是字符对字符相同的,直到行
spawn:returns{…}
中的数字为止。正如我所说,它的不同之处在于它跳过了第一行
expect:
,然后显示密码提示并停在那里。另外,正如我提到的,我不能使用SSH密钥。请发布非工作版本的
expect-d
输出。我现在为非工作版本添加了
expect-d
输出。查看非工作版本的调试输出会很有帮助。当然,如果切换到SSH密钥,这不会是一个问题,而且你根本不需要输入密码
ssh-keygen
然后
ssh-copy-id
diff
显示非工作版本的输出是字符对字符相同的,直到行
spawn:returns{…}
中的数字为止。正如我所说,它的不同之处在于它跳过了第一行
expect:
,然后显示密码提示并停在那里。另外,正如我提到的,我不能使用SSH密钥。请发布非工作版本的
expect-d
输出。我现在为非工作版本添加了
expect-d
输出。不幸的是,这似乎没有什么不同。不幸的是,这似乎没有什么不同。