理論上
如果以「一般USER」的角色,
且不用「交談模式」、
且利用 passwd 改密碼的話,
原則上、在系統管理上應是不可能的。
但執意要的話,
用簡單的 script 再加上「有風險」的設定,
也是可行的。
Linux 版本的考量
需要 man passwd 看看,
是否有 --stdin 的參數。
ubuntu/debian 之類或大部份的 linux 版本會是:
<pre class="c" name="code">passwd [options] [LOGIN]
Fedora/CentOS/RedHat 之類的是:
<pre class="c" name="code"> passwd [-k] [-l] [-u [-f]] [-d] [-n mindays] [-x maxdays] [-w warndays] [-i inac-
tivedays] [-S] [--stdin] [username]
若後者的話,就可以利用 鳥哥的chpasswd 範例說明,
來用這樣的指令實現免交談模式:
<pre class="c" name="code">echo 新密碼 | passwd 帳號 --stdin
簡而言之,如果你 Linux 版本非 readhat 之類的話,
基本上是無解。
利用SUID實現
當然這必須是 root 的身份執行,
因為 --stdin 的參數,是要求以root身分執行。
所以只要寫個 script,
確認「帳號」這個參數不會被改,
然後把這個 script 設為 suid root 的話,
把各安全的問題疑慮都設防好了的話,
這就是可行的;
如果你知道你在做什麼的話。
-bash-3.2$ echo "james:testabc" | /usr/sbin/chpasswd -m
chpasswd: can't lock password file
dear前輩,使用user去更改密碼出現以上error
剛測試了一下,不用suid而用sudo的方式:
編輯一個 /usr/bin/mypass.sh 內容為:
<pre class="c" name="code">#!/bin/sh
echo $SUDO_USER:$1 | chpasswd -m
#echo $1 | passwd $SUDO_USER --stdin
當然要使之有可被執行的屬性。
然後 visudo
<pre class="c" name="code">%users ALL=NOPASSWD: /usr/bin/mypass.sh
這樣任何使用者執行:
<pre class="c" name="code">sudo mypass.sh 新密碼
就會直接改成新密碼。
如果怕使用者忘記打 sudo 的話,
就用 alias 類似:
<pre class="c" name="code">alias mypass='sudo /usr/bin/mypass.sh'
當然script檔裡要加上檢查是否有新密碼的參數,
或新密碼的規則檢查,需自行參閱shell script的教學。