[英]Using the passwd command from within a shell script
我正在編寫一個 shell 腳本來自動添加一個新用戶並更新他們的密碼。 我不知道如何讓 passwd 從 shell 腳本中讀取,而不是交互式地提示我輸入新密碼。 我的代碼如下。
adduser $1 passwd $1 $2 $2
來自“
man 1 passwd<\/code> ”:
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
唯一的解決方案適用於 Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
現在,您可以使用以下命令:
echo "user:pass" | chpasswd
閱讀以下明智的話:
我引用:
您在 bash 中可以做的任何事情都不可能奏效。 passwd(1) 不從標准輸入讀取。 這是故意的。 這是為了保護你。 密碼從未打算放入程序或由程序生成。 它們只能由具有功能性大腦的真實人類的手指輸入,並且永遠不會在任何地方寫下來。
盡管如此,我們還是有成群的用戶詢問他們如何才能繞過 35 年的 Unix 安全性。
它繼續解釋如何正確設置
shadow(5)<\/code>密碼,並向您展示 GNU -I-only-care-about-security-if-it-doesn't-make-me-think-too-much<\/em> - 濫用
passwd(1)<\/code>的方式。
最后,如果您打算使用愚蠢的 GNU passwd(1) 擴展
--stdin<\/code> ,請不要<\/strong>將密碼放在命令行上。
最后一個是你可以用 GNU
passwd<\/code>做的最好的事情。
雖然我還是不推薦。
將密碼放在命令行上意味着任何人甚至可以遠程訪問該框的提示都可以監視
ps<\/code>或類似的東西並竊取密碼。
即使你認為你的盒子是安全的; 這是您真正<\/strong>應該養成不惜一切代價避免的習慣(是的,即使是為了完成工作而付出更多麻煩的代價)。
對於那些需要通過腳本登錄到 sudoers 文件中的用戶帳戶遠程“以 root 身份運行”的人,我發現了一個邪惡的可怕黑客,這無疑是非常不安全的:
sshpass -p 'userpass' ssh -T -p port user@server << EOSSH
sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
如果您的
passwd<\/code>不支持
--stdin<\/code>並且您出於某種原因不想(或不能)使用
chpasswd<\/code> ,則此處文檔<\/em>有效。
例子:<\/strong>
#!/usr/bin/env bash
username="user"
password="pass"
passwd ${username} << EOD
${password}
${password}
EOD
你可以使用 chpasswd
echo $1:$2 | chpasswd<\/code>
"
在我為這類事情保留的 CentOS VMWare 映像上對此進行了測試。 請注意,您可能希望避免將密碼作為命令行參數,因為整個機器上的任何人都可以從“ps -ef”中讀取它們。
也就是說,這將起作用:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
有時設置一個沒人知道的密碼很有用。 這似乎有效:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
我偶然發現了同樣的問題,由於某種原因,--
--stdin<\/code>選項在我使用的
passwd<\/code>版本上不可用(在 Ubuntu 14.04 中提供)。
如果你們中的任何人碰巧遇到同樣的問題,你可以像我一樣使用
chpasswd<\/code>命令來解決它,如下所示:
echo "<user>:<password>" | chpasswd
這是 teradata 節點管理員的明確答案。
轉到
\/etc\/hosts<\/code>文件並在文本文件中創建 IP 或節點名稱列表。
SMP007-1
SMP007-2
SMP007-3
對我來說,在 Raspbian 上它只能以這種方式工作(添加了舊密碼):
#!/usr/bin/env bash
username="pi"
password="Szevasz123"
new_ps="Szevasz1234"
passwd ${username} << EOD
${password}
${new_ps}
${new_ps}
EOD
回聲“你的密碼”| sudo -S yourCommand
<\/blockquote>如果 -S 不起作用,請嘗試使用 -kS
您是否查看過
adduser<\/code>的
-p<\/code>選項(AFAIK 只是
useradd<\/code>的另一個名稱)?
您可能還想查看
luseradd<\/code>的
-P<\/code>選項,它采用明文密碼,但我不知道
luseradd<\/code>是否是標准命令(它可能是 SE Linux 的一部分,也可能只是 Fedora 的一個奇怪之處)。
"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.