Я пытаюсь передать строку в стандартный ввод команды (в данном случае sftp), и как только канал пуст (поскольку команда обработала всю строку), он должен продолжить чтение с клавиатуры.
Мой скрипт bash выглядит следующим образом.Обратите особое внимание на вторую последнюю строку , где я объединяю ввод временного файла с потоком клавиатуры, чтобы передать его всей команде sftp:
#!/bin/bash
usage=$(cat /some/path/.upload.usage)
host=$(cat /some/path/.upload.host)
user=$(cat /some/path/.upload.user)
pass=$(cat /some/path/.upload.pass)
no_bye=false
cmd=""
for i in "$@"; do
case $i in
--help)
echo "$usage"
exit 0
shift
;;
--no-bye)
echo "option: --no-bye : will keep terminal open"
no_bye=true
shift
;;
*)
if [ -f "$i" ]; then
cmd+="put \"$(realpath $i)\"\n"
elif [ -d "$i" ]; then
cmd+="mkdir \"$(basename $i)\"\n"
cmd+="put -r \"$(realpath $i)\"\n"
else
cmd+="$i\n"
fi
;;
esac
done
if [[ "$no_bye" = "false" && "$cmd" != "" ]]; then
cmd+="bye\n"
fi
tmp=$(mktemp)
echo -e -n "$cmd" > "$tmp"
cat "$tmp" /dev/tty | sshpass -p "$pass" sftp "$user"@$host
rm "$tmp"
Вывод выглядит так:
user@localhost:/some/path# upload ls --no-bye
option: --no-bye : will keep terminal open
Connected to sftp.example.com.
sftp> ls
backup
ls -a
sftp> ls -a
. .. backup
bye
sftp> bye
user@localhost:/some/path#
Несмотря на то, что это работает как-то, очень странно видеть, как я печатаю под выводом, и после нажатия клавиши ввода мой ввод снова появляется в строке sftp> .
Итак, как я могу передать строку / содержимое временного файла на стандартный ввод команды sftp и после этого позволить пользователю продолжить сеанс sftp?