2014-03-03 65 views
0

我有一個腳本使得stdin成爲可能。它還包括內部調用curl,基於stdin數據構建,並需要通過url中的表單變量進行密碼驗證。標準輸入使用時的密碼最佳實踐

我希望能夠在運行腳本時鍵入我的密碼,而不是將它存儲在某個地方,但標準輸入被「取走」。寫這樣的腳本有什麼好方法?我會對保存在文件系統中的一種好方法感興趣,或者有一些可以想象的方式將它作爲實時輸入而不會弄髒輸入管道。

回答

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相關的終端,或標準輸入/輸出/標準錯誤,如果操作系統不支持它,並用它來直接讀寫給用戶。

如果它不必是便攜的,例如使用Linux或FreeBSD的使用bash的時候,你可以簡化和改善這一點:

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

太棒了。兩者都可以在bash下的mac上正常工作,並且在添加「grep $ password」後,它做了正確的事情(包括不發送提示符和stdout)。 –

1

在污濁的問題的風險,我需要切換到perl,並認爲這可能是一些人誰在這裏找到自己有用如果我發佈perl翻譯「那個人」的答案。 (不知道這是否是最乾淨的方式,但它對我有用。)

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

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);