将stdin导入“expect”脚本

时间:2011-06-24 11:03:35

标签: ftp pipe tcl stdin expect

我使用expect通过ftp上传文件。该文件通过管道传输到我的bash脚本中。

#!/bin/bash
HOST='example.com'
USER='XXX'
PASSWD='XXX'

expect << EOT
spawn ftp $HOST
expect "Name*:"
send "$USER\r"
expect "Password:"
send "$PASSWD\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "prompt\r"
expect "ftp>"
send "put - $1\r"  ####
expect "ftp>"
send "bye\r"
expect eof
EOT

在突出显示的行上,我想让ftp访问主脚本stdin。

谢谢

1 个答案:

答案 0 :(得分:2)

我相信你所寻找的关键是Expect的interact命令。你会得到一个这样的脚本:

#!/usr/bin/env expect

# Set these in the Tcl way, not the bash way
set HOST "example.com"
set USER "XXX"
set PASSWD "YYY"

# You should recognize this bit...
spawn ftp $HOST
expect "Name*:"
send "$USER\r"
expect "Password:"
send "$PASSWD\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "prompt\r"
expect "ftp>"

# New stuff starts here
send "put - [lindex $argv 0]\r"
interact {
    "ftp>" { return }
}
send "bye\r"
wait
exit

我已经重写了你的脚本,所以它不使用here文档,因为干扰内容的阅读(这里 - 文档显示为stdin ...)并切换它使用一些更惯用的做事方式(习惯性的论证访问是主要的)。

那就是说,如果我真的在做这类事情,我会考虑使用来自ftpTcllib软件包来直接协商协议,而不是使用可能有问题的子进程。 (事实上​​,如果您要在Windows上执行此操作,那么 这样做是因为Expect和FTP.EXE在该平台上如何工作的怪癖。)