新しいユーザーを自動的に追加し、パスワードを更新するシェルスクリプトを作成しています。新しいパスワードの入力を対話形式で要求する代わりに、シェルスクリプトからpasswdを読み取る方法がわかりません。私のコードは以下です。
adduser $ 1 passwd $ 1 $ 2 $ 2
「man 1 passwd
」から:
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
あなたの場合
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Update]コメントでいくつかの問題が提起されました。
passwd
コマンドには--stdin
オプションがない場合があります。代わりに、 ashawley で提案されているchpasswd
ユーティリティを使用してください。
Bash以外のシェルを使用する場合、「echo」は組み込みコマンドではない可能性があり、シェルは/bin/echo
を呼び出します。パスワードはプロセステーブルに表示され、ps
などのツールで表示できるため、これは安全ではありません。
この場合、別のスクリプト言語を使用する必要があります。 Perlの例を次に示します。
#!/usr/bin/Perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
唯一のソリューションはUbuntu 12.04で動作します。
echo -e "new_password\nnew_password" | (passwd user)
しかし、2番目のオプションは、以下から変更した場合にのみ機能します。
echo "password:name" | chpasswd
に:
echo "user:password" | chpasswd
元の投稿の説明を参照してください: スクリプトによるパスワードの変更
賢明な言葉を読んでください:
引用:
Bashでできることは何もできません。 passwd(1)は標準入力から読み取りません。これは意図的なものです。それはあなたの保護のためです。パスワードがプログラムに入れられることも、プログラムによって生成されることも意図されていませんでした。それらは、機能的な脳を持つ実際の人間の指によってのみ入力されるように意図されており、決してどこにも書き留められませんでした。
それにもかかわらず、35年にわたるUnixのセキュリティをどのように回避できるかを尋ねるユーザーの大群がいます。
shadow(5)
パスワードを適切に設定する方法を説明し、GNU-I-only-care-about-security-if-it-doesn't-makeを示します-me-think-too-much-悪用の方法passwd(1)
。
最後に、愚かなGNU passwd(1)拡張--stdin
を使用する場合、do notパスワードをコマンドラインに入力します。
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
最後は、GNU passwd
でできる最善の方法です。私はまだそれをお勧めしませんが。
パスワードをコマンドラインに入力すると、ボックスへのアクセスの最も遠いヒントを持っている人でもps
などを監視し、パスワードを盗むことができます。あなたの箱が安全だと思っても;それはあなたがすべきことです本当にすべてのコストで回避する習慣をつけましょう(はい、仕事を終わらせるためにもう少し苦労するコストですら)。
最近:
echo "user:pass" | chpasswd
Chpasswdを使用できます
echo $1:$2 | chpasswd
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
私は同じ問題に出くわし、何らかの理由で、「-stdin」オプションは、使用しているpasswd
のバージョンで利用できませんでした(Ubuntu 14.04で出荷)。
誰かが同じことを試した場合、次のようにchpasswd
コマンドを使用することで回避できます。
echo "<user>:<password>" | chpasswd
誰も知らないパスワードを設定すると便利な場合があります。これはうまくいくようです:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
adduser
の-p
オプション(これはuseradd
の別名です)を見ましたか?また、プレーンテキストパスワードを取るluseradd
の-P
オプションを確認することもできますが、luseradd
が標準コマンドであるかどうかはわかりません(SE Linuxの一部である可能性があります)または、おそらくFedoraの奇妙な点です)。
これは、テラデータノード管理者にとって決定的な答えです。
/etc/hosts
ファイルに移動して、テキストファイルにIPまたはノード名のリストを作成します。
SMP007-1
SMP007-2
SMP007-3
次のスクリプトをファイルに入れます。
#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS
while read -r i; do
echo changing password on "$i"
ssh root@"$i" Sudo echo "$MYUSERID":"$MYPASS" | chpasswd
echo password changed on "$i"
done< /usr/bin/setpwd.srvrs
さて、私はsshとrootで基本的なセキュリティルールを破ったことは知っていますが、セキュリティ関係者に対処させます。
これを/usr/bin
configファイルとともにsetpwd.srvrs
サブディレクトリに配置します。
コマンドを実行すると、ユーザーIDを1回、パスワードを1回要求されます。次に、スクリプトはsetpwd.srvrs
ファイル内のすべてのノードを走査し、各ノードに対してパスワードなしのsshを実行し、ユーザーの操作や2次パスワード検証なしでパスワードを設定します。
私はこの種のことのために保管しているCentOS VMWareイメージでこれをテストしました。マシン全体の誰でも 'ps -ef'からパスワードを読み取ることができるため、コマンドライン引数としてパスワードを使用することは避けたいことに注意してください。
とはいえ、これは機能します:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user