Bash

使用 echo 將敏感數據傳遞到 chpasswd 是否安全?

  • August 3, 2018

我正在嘗試使用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中,而不是在終端中顯示生成的密碼。

引用自:https://unix.stackexchange.com/questions/460030