Bash
使用 echo 將敏感數據傳遞到 chpasswd 是否安全?
我正在嘗試使用
chpasswd
. 密碼應該隨機生成並列印到stdout
(我需要將它們寫下來或將它們放在密碼儲存中),並且還傳遞到chpasswd
.天真地,我會這樣做
{ echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '') echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '') } | tee >(chpasswd)
但是我擔心將新密碼作為命令行參數傳遞給
echo
,因為參數通常對其他使用者可見ps -aux
(儘管我從未看到任何echo
行出現在ps
)。有沒有另一種方法可以在我返回的密碼前面加上一個值,然後將其傳遞給
chpasswd
?
您的程式碼應該是安全的,
echo
因為它是內置的 shell,因此不會出現在程序表中。這是一個替代解決方案:
#!/bin/bash n=20 paste -d : <( seq -f 'student%.0f' 1 "$n" ) \ <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) | tee secret.txt | chpasswd
這將創建您的學生姓名和密碼,
n
而無需在任何命令的任何命令行上傳遞任何密碼。該
paste
實用程序將多個文件作為列粘合在一起,並在它們之間插入一個分隔符。在這裡,我們使用:
它作為分隔符並給它兩個“文件”(程序替換)。第一個包含seq
創建 20 個學生使用者名的命令的輸出,第二個包含創建 20 個長度為 13 的隨機字元串的管道的輸出。如果您有一個已生成使用者名的文件:
#!/bin/bash n=$(wc -l <usernames.txt) paste -d : usernames.txt \ <( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) | tee secret.txt | chpasswd
這些會將密碼和使用者名保存到文件
secret.txt
中,而不是在終端中顯示生成的密碼。