我有一個腳本使得stdin成爲可能。它還包括內部調用curl,基於stdin數據構建,並需要通過url中的表單變量進行密碼驗證。標準輸入使用時的密碼最佳實踐
我希望能夠在運行腳本時鍵入我的密碼,而不是將它存儲在某個地方,但標準輸入被「取走」。寫這樣的腳本有什麼好方法?我會對保存在文件系統中的一種好方法感興趣,或者有一些可以想象的方式將它作爲實時輸入而不會弄髒輸入管道。
我有一個腳本使得stdin成爲可能。它還包括內部調用curl,基於stdin數據構建,並需要通過url中的表單變量進行密碼驗證。標準輸入使用時的密碼最佳實踐
我希望能夠在運行腳本時鍵入我的密碼,而不是將它存儲在某個地方,但標準輸入被「取走」。寫這樣的腳本有什麼好方法?我會對保存在文件系統中的一種好方法感興趣,或者有一些可以想象的方式將它作爲實時輸入而不會弄髒輸入管道。
從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
在污濁的問題的風險,我需要切換到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);
太棒了。兩者都可以在bash下的mac上正常工作,並且在添加「grep $ password」後,它做了正確的事情(包括不發送提示符和stdout)。 –