passwd コマンドは色々聞いてくるし、既存のパスワードが必要。
RedHat 系の Linux だと --stdin コマンドがあるらしいけれども、Debian 系はそのオプションは使えないようだ。
代わりに chpasswd コマンドを使う。
環境
- Debian Testing (2024/7/6時点のDebian 13)
chpasswd の実行権限を調べる
フルパス指定すれば root でなくても実行できるけれど、操作していると認証トークン操作エラーとなる。
$ /usr/sbin/chpasswd
.
.
.
chpasswd: (user a) pam_chauthtok() failed, error:
Authentication token manipulation error
.
.
.
結局、 sudo つけて実行することにします。
$ sudo chpasswd
nanbuwwks:hogehoge
ここまで入力しエンターしたら、Ctrl+D で終了する。そうすればユーザ nanbuwks のパスワードが hogehoge となる。
非対話的に実行
以下のようにすればOK
$ printf "nanbuwks:hogehoge" | sudo chpasswd
しかしながらプロセス情報からパスワードが見えてしまうので、このやりかたは望ましくない。
暗号化したパスワードを chpasswd に渡す
$ sudo grep nanbuwks /etc/shadow
nanbuwks:$y$abc$abcdefgh...$abcdefg.....:19910:0:99999:7:::
となる。
この $y$ は、yescrypt形式
cf.,https://www.cyberciti.biz/faq/understanding-etcshadow-file/
となっていて、同様のものを以下のように指定すれば良い。
$ printf "nanbuwks:$y$abc$abcdefgh...$abcdefg....." | sudo chpasswd --encrypted
ここの、暗号化パスワード部分を生成するのは mkpasswd を使い、以下のようにして作る
$ echo hogehoge | mkpasswd --stdin
$y$j9T$K1qIOyzqHzYPSmBplHpjC0$uBkDA/frN6YLKZE21XcfIimUWgLcov1Q.kMAIp7hXE0
これに、ユーザ名 'nanbuwks:' を頭につけて、
nanbuwks:$y$j9T$K1qIOyzqHzYPSmBplHpjC0$uBkDA/frN6YLKZE21XcfIimUWgLcov1Q.kMAIp7hXE0
を用いる。
mkpasswd についての詳細はこちら
「yepasswd で パスワードを生成」
https://qiita.com/nanbuwks/items/5715007b63c454c22c7e
プレーンテキストパスワードでもセキュアに処理する
よく考えたら以下のようにしてプロセス情報からパスワードが見えてしまうというリスクは、
$ printf "nanbuwks:hogehoge" | sudo chpasswd
単にコマンドラインにプレーンテキストパスワードを書いているからだった。
なのでプレーンテキストでも、単に別プロセスから stdin にフレーズを流してリダイレクトすれば良かった。
例としてこのような方法。
$ cat | sudo chpasswd
cat だと対話的になるけれども、 cat の代わりになるプロセスを動かすと良い。