Передайте строку в команду и позвольте команде читать с клавиатуры впоследствии - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь передать строку в стандартный ввод команды (в данном случае 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?

...