Я считаю, что ключом к тому, что вы ищете, является команда 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
Я переписал ваш сценарий, чтобы он не использовал документ здесь, потому что помешал бы чтениюcontent (здесь документы представлены как stdin…) и переключил его на использование нескольких более идиоматических способов выполнения действий (основной доступ к идиоматическому аргументу).
Тем не менее, если бы я делал такого родаВ действительности, я бы хотел использовать пакет ftp
из Tcllib , поскольку он напрямую взаимодействует с протоколом, а не с использованием потенциально проблемного подпроцесса.(Действительно, если вы собираетесь делать это в Windows, у вас будет , чтобы сделать это таким образом, из-за особенностей работы Expect и FTP.EXE на этой платформе).