将字符串传递给命令,然后让命令从键盘读取

时间:2018-12-14 15:53:05

标签: bash stream pipe stdin tty

我正在尝试将字符串传送到命令的标准输入(在本例中为sftp),并且一旦管道为空(因为命令处理了完整的字符串),它应该继续从键盘读取。 / p>

我的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#

即使这可以某种方式起作用,但看到自己在输出下方键入并按Enter键后,我的输入再次出现在 sftp> 行中,这确实让我感到很奇怪。

那么,如何将临时文件的字符串/内容通过管道传输到sftp命令的标准输入,然后让用户继续sftp会话?

0 个答案:

没有答案