我使用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。
谢谢
答案 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 ...)并切换它使用一些更惯用的做事方式(习惯性的论证访问是主要的)。
那就是说,如果我真的在做这类事情,我会考虑使用来自ftp
的Tcllib软件包来直接协商协议,而不是使用可能有问题的子进程。 (事实上,如果您要在Windows上执行此操作,那么 这样做是因为Expect和FTP.EXE在该平台上如何工作的怪癖。)