web-dev-qa-db-ja.com

シェルスクリプト内からpasswdコマンドを使用する

新しいユーザーを自動的に追加し、パスワードを更新するシェルスクリプトを作成しています。新しいパスワードの入力を対話形式で要求する代わりに、シェルスクリプトからpasswdを読み取る方法がわかりません。私のコードは以下です。

adduser $ 1 
 passwd $ 1 
 $ 2 
 $ 2
58
Jared

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
83
8jean

唯一のソリューションはUbuntu 12.04で動作します。

echo -e "new_password\nnew_password" | (passwd user)

しかし、2番目のオプションは、以下から変更した場合にのみ機能します。

echo "password:name" | chpasswd

に:

echo "user:password" | chpasswd

元の投稿の説明を参照してください: スクリプトによるパスワードの変更

49
Fernando Kosh

賢明な言葉を読んでください:

引用:

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などを監視し、パスワードを盗むことができます。あなたの箱が安全だと思っても;それはあなたがすべきことです本当にすべてのコストで回避する習慣をつけましょう(はい、仕事を終わらせるためにもう少し苦労するコストですら)。

26
lhunath

最近:

echo "user:pass" | chpasswd

23
BlackNoxis

Chpasswdを使用できます

echo $1:$2 | chpasswd

1
bsmoo

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
1
Raydude

私は同じ問題に出くわし、何らかの理由で、「-stdin」オプションは、使用しているpasswdのバージョンで利用できませんでした(Ubuntu 14.04で出荷)。

誰かが同じことを試した場合、次のようにchpasswdコマンドを使用することで回避できます。

echo "<user>:<password>" | chpasswd

0
Mariano Anaya

誰も知らないパスワードを設定すると便利な場合があります。これはうまくいくようです:

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
0
user3811862

adduser-pオプション(これはuseraddの別名です)を見ましたか?また、プレーンテキストパスワードを取るluseradd-Pオプションを確認することもできますが、luseraddが標準コマンドであるかどうかはわかりません(SE Linuxの一部である可能性があります)または、おそらくFedoraの奇妙な点です)。

0
rmeador

これは、テラデータノード管理者にとって決定的な答えです。

/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次パスワード検証なしでパスワードを設定します。

0
JohnS

私はこの種のことのために保管しているCentOS VMWareイメージでこれをテストしました。マシン全体の誰でも 'ps -ef'からパスワードを読み取ることができるため、コマンドライン引数としてパスワードを使用することは避けたいことに注意してください。

とはいえ、これは機能します:

user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
0
Don Werve