1

我刚刚在使用Expect的SFTP连接期间自动输入密码方面获得了一些帮助。

然后我尝试发出一个 put 命令,事情又变得复杂起来。我正在使用以下代码:

#!/usr/bin/expect
#!/bin/sh

expect -c "
spawn sftp remoteuser@*.*.*.*
expect \"remoteuser@*.*.*.*'s password:\"
send \"passwrd\r\"
interact "

echo "put output/data.xml\r"
echo "quit\r"

我的密码输入和与远程服务器的连接工作正常,但我很难让put output/data.xml命令在 SFTP 提示符下显示和执行。

我的echo "put output/data.xml\r"echo "quit\r"行只是打印为文本,这并不完全令人惊讶,但我真的不知道还有什么可能起作用。

4

1 回答 1

3

我知道您需要一些帮助,但您至少应该尝试阅读。当您说 时expect -c 'some stuff ...',您将整个期望脚本指定为-c选项的参数。之后,Expect 会话将不存在。

此外,尝试了解interact命令的作用,而不是盲目地应用某人的建议。

无论如何,解决方案:

expect  <<'END_EXPECT'
set timeout -1
spawn sftp remoteuser@1.2.3.4
expect "[Pp]assword:"
send "passwrd\r"
expect "whatever the sftp prompt looks like"
send "put output/data.xml\r"
expect "whatever the sftp prompt looks like"
send "quit\r"
expect eof
END_EXPECT

请注意,当您第一次看到 here-doc 分隔符时,它会被引用。这样,您将不会受到任何外壳扩展的影响。就像整个 here-doc 都是单引号的。

于 2013-01-04T18:49:29.473 回答