使用stdin时的密码最佳实践

时间:2014-03-03 20:32:04

标签: perl bash shell unix passwords

我有一个stdin的脚本。它还包括内部调用curl,它是基于stdin数据构建的,并且需要通过url中的表单变量进行密码验证。

我希望能够在运行脚本时输入密码,而不是将其存储在某处,但是stdin是“被采用”的。编写这样的脚本有什么好方法?我会对将它保存在文件系统中的好方法感兴趣,或者是否有一些可以想象的方法将其作为实时输入而不会污染传入的管道。

2 个答案:

答案 0 :(得分:1)

从TTY阅读:

if terminal=$(tty < /dev/tty || tty || tty 0<&1 || tty 0<&2) 2> /dev/null
then
  echo "Enter password: " > "$terminal"
  IFS= read -r password < "$terminal"
else
  echo "There is no terminal to read a password from." >&2
  exit 1
fi

如果操作系统不支持终端,则尝试获取与/dev/tty或stdin / stdout / stderr关联的终端,并使用它直接读写用户。

如果它不必是便携式的,例如当在Linux或FreeBSD上使用Bash时,您可以简化并改进它:

if ! IFS= read -rs -p "Enter password: " password < /dev/tty 2> /dev/tty
then
  echo "Password entry failed"
  exit 1
fi

答案 1 :(得分:1)

冒着弄糊涂问题的风险,我需要切换到perl,并认为如果我发布了“那个其他人”的答案的perl翻译,那么对于发现自己的人来说这可能是有用的。 (不知道这是否是最干净的方式,但它对我有用。)

open (TTY, "+< /dev/tty" )
  or eval 'sub Term::ReadLine::findConsole { ("&STDIN", "&STDERR") }';
    die $@ if $@;

print TTY "Enter your password: ";
use Term::ReadKey;
ReadMode('noecho', *TTY);
my $password = ReadLine(0, *TTY);
chomp $password;
ReadMode('normal', *TTY);
print TTY "\n";
close (TTY);