Linux でユーザーとグループを管理するための GUI アプリケーションを作成していました。
新しいユーザーを作成する部分は完了しましたが、新しく作成したユーザーに新しいパスワードを与える部分で行き詰まっています。私のアプリは、必要な入力 (ユーザー名、グループのリスト、パスワード) を GUI から取得し、この情報を引数として渡すスクリプトを実行するだけです。ユーザー アカウント xyz があるとします。このアカウントのパスワードを変更するには、次のコマンドを実行するだけです。
passwd xyz
これにより、新しいパスワードが要求されます。必要な情報はすべてコマンド ラインで渡されるため、スクリプトを使用して新しいアカウントを作成できます。
useradd -m -G users -g "groups" -s /bin/bash "UserName"
Qt アプリを通じてスクリプトを実行し、ユーザーを作成できますが、 ではpasswd cmd
、別の行で入力を求められます。どのように対処すればよいでしょうか?
答え1
ここでの正しい答えは次のようになると思います:コマンドラインツールにシェルを実行しないでください。ライブラリ呼び出しを使用してください。これにより、エラーをより適切に処理できるようになり、コマンド ラインでパスワードを渡すリスクを回避できます。
使用できるライブラリの1つはlibuserは比較的シンプルで、C と Python のバインディングを備えています。
答え2
root として、次の方法を使用してスクリプト経由でユーザーのパスワードを体系的に設定できます。
$ echo -n "$passwd" | passwd "$uname" --stdin
パスワードの生成
コマンドラインツールを使うのが好きですpwgen
パスワードを生成します。
$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"
$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
Options supported by pwgen:
-c or --capitalize
Include at least one capital letter in the password
-A or --no-capitalize
Don't include capital letters in the password
-n or --numerals
Include at least one number in the password
-0 or --no-numerals
Don't include numbers in the password
-y or --symbols
Include at least one special symbol in the password
-s or --secure
Generate completely random passwords
-B or --ambiguous
Don't include ambiguous characters in the password
-h or --help
Print a help message
-H or --sha1=path/to/file[#seed]
Use sha1 hash of given file as a (not so) random generator
-C
Print the generated passwords in columns
-1
Don't print the generated passwords in columns
-v or --no-vowels
Do not use any vowels so as to avoid accidental nasty words
しかし、これは安全ではないのでしょうか?
いいえ。パスワードは STDIN 経由で に渡されるので、passwd
経由で誰かがプロセスを覗き見ることは可能かもしれませんがps
、それでもユーザーが root のプロセスを見ることはできないはずです。パスワードを に渡すことはpasswd
遮断されています。
例
あるターミナルで root としてこのコマンドを実行するとします。
$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989
次にps
別のターミナルで実行します:
$ ps -AOcmd | grep pass
14046 passwd samtest --stdin R pts/11 00:00:00 passwd samtest --stdin
1 番目の端末でパスワードが変更された後:
[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.
passwd への echo はどうですか?
これでもパスワードは漏洩しません。これを証明する別のテストを次に示します。まず、セカンダリ ターミナルでこのコマンドを開始します。これにより、からの出力が収集されますps
。
$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt
次に、パスワード設定コマンドを実行します。
$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.
[1]+ Done echo "supersecret" | passwd "samtest" --stdin
内容を確認するとps.txt
、パスワードが漏洩していないことがわかります。
$ grep supersecret ps.txt
$
ps
使用するコマンドを変更してps -eaf
も、漏洩は発生しません。
答え3
passwd --help
私のボックスでは、stdin に新しいパスワードを入力してroot
実行できることを示しています。--stdin
答え4
chpasswdコマンドは、コマンドラインからユーザー名とパスワードのペアのリストを読み取り、既存のユーザーのグループを更新します。各行は次の形式です。
user_name:password
このコマンドは、一度に多数のアカウントが作成される大規模なシステム環境での使用を目的としています。このコマンドのその他のオプションについては、以下を入力してください。
man chpasswd