2009-04-03 24 views
43

シェルスクリプトを作成して、自動的に新しいユーザーを追加し、パスワードを更新します。パスワードを入力する代わりにシェルスクリプトからpasswdを読み込む方法がわかりません。私のコードは以下の通りです。 "man 1 passwd" からシェルスクリプト内からのpasswdコマンドの使用

adduser $1 
passwd $1 
$2 
$2
+0

質問:http://askubuntu.com/questions/94060/run-adduser-non-interactively/667842#667842 – ThorSummoner

答えて

71

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

で[更新]いくつかの問題は、コメントで育った:

あなたpasswdコマンドにはが含まれていない可能性がありますオプション: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 
+0

パラメータ拡張を引用する必要があります。さらに、これは決して形や形ではありません。トピックについての詳細は、私の返信を参照してください。 – lhunath

+1

エコーを使用しないでください... |パスワード! psを実行している他のユーザは、パスワードを見ることができます。パスワードを渡す場所が多いほど(異なるプログラム、ファイル、パイプなど)、どこかに漏れてしまう可能性が高くなります。 –

+0

@lhunath:あなたは引用について正しいです、私はそれを修正します。 @Brian: "echo"はbashの組み込みですが、psの出力には表示されません(少なくともbashではshではわからない) – 8jean

0

あなたは(私の知る限りはuseraddのためのちょうど別の名前である)adduser-pオプションで見たことがありますか? の-Pオプションが平文のパスワードを取ることもありますが、luseraddが標準コマンド(SE Linuxの一部であるか、おそらくはFedoraの奇妙なものかもしれません)であるかどうかわかりません。

1

これをCentOS VMWareイメージでテストしました。マシン全体の誰もが 'ps -ef'からそれらを読むことができるので、パスワードをコマンドライン引数として置かないようにしたいと考えていることに注意してください。

user="$1" 
password="$2" 
adduser $user 
echo $password | passwd --stdin $user 
24

から賢明な言葉を読む:

私は引用:

何もYこれは動作します、と述べ

bashでできることはおそらく動作する可能性があります。 passwd(1)は標準入力から読み込みません。これは意図的です。あなたの保護のためです。パスワードは、プログラムに入れられるようには意図されておらず、プログラムによって生成されることもありませんでした。彼らは、実際の人間の指だけで、機能的な脳で、そして決してどこにでも書かれたことがないように意図されていました。

しかし、私たちは、35年のUnixセキュリティを克服する方法を尋ねているユーザーがたくさんいます。

それはあなたが適切にあなたのshadow(5)パスワードを設定する方法を説明するために行く、とあなたにGNU-を示しそれは-doesn't I-のみのケア-に関するセキュリティ-IF--作る-meが-考えます-too-much -way of abusing passwd(1)あなたは(1)延長--stdin愚かなGNUのpasswdのを使用しようとしている場合

最後に、は、コマンドラインにそれを置くパスワードを渡しません。

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などを監視してパスワードを盗むことができます。たとえあなたの箱が安全だと思っても;それはあなたがするべきである実際にすべてのコスト(はい、仕事をやっているより多くのトラブルを行うのコストも)で避ける習慣を取得します。

+1

私はなぜこれが「まだかなり不安ですか」と尋ねることがありますか? $ passwd --stdin <<< $(somehost/someuserを渡す) –

+1

@JackTangあなたのパラメータ拡張には引用符が必要です。 <<<が<より安全性が低い理由は、<<<が暗黙のうちに外部から読める一時ファイルを作成する可能性があるためです。 – lhunath

0

the expect utilityを使用すると、ttyから読み込んだすべてのプログラムを実行できます(stdinとは異なり、passwdと同じです)。 Expectには、passwdのようなあらゆる種類の対話型の問題の例を実行する準備が整いました。

40

唯一の解決策は、Ubuntuの12.04で動作します:

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

しかし、私はから変更されたときに2番目のオプションは、のみ動作します:

echo "user:password" | chpasswd 

がオリジナルで説明を参照してください:

echo "password:name" | chpasswd 

へ投稿:Changing password via a script

+0

'echo 'user:newpassword' | sudo chpasswd'、またはsudoをrootとして使用しないでください。 – ThorSummoner

+1

スクリプトから呼び出すときのsudoの使用は良い考えではありません... –

+0

最初のケースでパスワードに "\ n"が含まれているとどうなりますか?これを処理する方法がありますか? 'my @ secret \ npasword123'のように –

1

あなたは今日で

echo $1:$2 | chpasswd

17

をchpasswd使用することができます

echo "user:pass" | chpasswd

+3

なんらかの理由で、コマンドを実行しようとしたときに「認証トークン操作エラー」というメッセージが表示されました。 chpasswdの前にsudoを追加すると、これは私のために修正されました。 –

0

は、時には誰もが知っているパスワードを設定すると便利です。これが動作しているようです:

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

アカウントを無効にする/ログインを無効にする方が、未知のパスワードを与えたままログインを有効にしておく方が良いです。 – DanFromGermany

+1

passwd --deleteまたは--lock – temoto

0

私は同じ問題時と「--stdin」オプションは、私は(Ubuntuの14.04で出荷)を使用したpasswdのバージョンでは利用できませんでした何らかの理由でつまずきました。あなたのうちのどれかが同じことを試してしまった場合、私が行ったように

、あなたはそれを回避することができます。このようchpasswdコマンドを使用して:

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

0

これは、Teradataのノード管理のための決定的な答えであります

1:後藤あなたの/ etc/hostsファイルと------------------テキストファイルに

をIPのか、ノード名のリストを作成しますseの設定ファイルrversは---エンドファイルはcfgファイルからこれらのコメントを残し------ ------------
SMP007-1
SMP007-2
SMP007-3
を開始します

今スクリプト
すべてのノード間でパスワードを設定


printfの "ユーザID:"
はMYUSERID
を読みますprintfの "新しいパスワード:"
`猫で私のためにMYPASS

を読んで`
を/usr/bin/setpwd.srvrs
は$ I sudoのエコー@ $ I
のsshルートのパスワードを変更するエコーありません"$ MYUSERID": "$ MYPASS" | chpasswd
エコーパスワードが行わ$ I
に変更

私はsshと根 との基本的なセキュリティルールを破ってきましたが、私はあなたがセキュリティの人々がそれに対処もらおう知っている大丈夫

_________________________________
はあなたのsetpwd.srvrs設定ファイルと一緒にあなたの/ usr /ビンサブディレクトリにこれを入れ

あなたはそれがあなたのユーザーID
のための1時間を促し、コマンドを実行するとパスワードはです。その後、スクリプトはsetpwd.srvrsファイル内のすべてのノード
を横断する各ノード
にパスワードなしのSSHは、次いで、任意のユーザインタラクションまたは二
パスワード検証なしにパスワードを設定しません。今度は何回このことをしたかったのですか?
しかし、どのように知りませんでしたか?大きなニーズがあると、大きな革新が起こります。

このような便利な機能は、数百台のサーバがある
の管理者になります。リモートでsudoersファイル内のユーザーアカウントにログインスクリプトを使用して「rootとして実行」する必要がある人のために

0

、私はそれは間違いなく非常に危険ではない、邪悪な恐ろしいハックを見つけました:

同様
sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH 
sudo -S su - << RROOT 
userpass 
echo "" 
echo "*** Got Root ***" 
echo "" 
#[root commands go here] 
useradd -m newuser 
echo "newuser:newpass" | chpasswd 
RROOT 
EOSSH 
関連する問題