我正在尝试将字符串传送到命令的标准输入(在本例中为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会话?