スクリプトを介してユーザーのパスワードを変更しようとしています。別のユーザーがパスワードを変更した場合、ユーザーが再度パスワードを変更する必要がある機能があるため、Sudoを使用できません。
AIXはシステム上で実行されています。
残念ながら、chpasswdは使用できません。
インストールする予定ですが、それでも問題があります。
これが私がうまくいくと思ったものです
echo "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user
ただし、一度スクリプトを実行すると、please enter user's old password
のプロンプトが表示されますが、それらはすべてエコーされませんか?
私はシェルスクリプトの初心者であり、これには困惑しています。
あなたが試すことができます:
echo "USERNAME:NEWPASSWORD" | chpasswd
GNUpasswd
stdinフラグを使用します。
man
ページから:
--stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
注:rootユーザーのみ。
例
$ adduser foo
$ echo "NewPass" |passwd foo --stdin
Changing password for user foo.
passwd: all authentication tokens updated successfully.
または、expect
を使用することもできます。次の簡単なコードでトリックを実行できます。
#!/usr/bin/expect
spawn passwd foo
expect "password:"
send "Xcv15kl\r"
expect "Retype new password:"
send "Xcv15kl\r"
interact
結果
$ ./passwd.xp
spawn passwd foo
Changing password for user foo.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
他の提案に加えて、 HEREDOC を使用してこれを実現することもできます。
差し当たりのケースでは、これは次のようになります。
$ /usr/bin/passwd root <<EOF
test
test
EOF
改行文字を有効にするにはecho -eが必要です
あなたが書いた
echo "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user
試してみてください
echo -e "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user
おそらく、そのコマンドのoldpassword\nの部分は必要ありません。2つの新しいパスワードが必要です。感嘆符の前後に単一引用符を使用することを忘れないでください!
echo -e "new"'!'"passwd123\nnew"'!'"passwd123" | passwd user
あなたが試すことができます :
echo -e "newpasswd123\nnnewpasswd123" | passwdユーザー
これだけ
passwd <<EOF
oldpassword
newpassword
newpassword
EOF
Ubuntuマシンからの実際の出力(AIXは利用できません):
user@Host:~$ passwd <<EOF
oldpassword
newpassword
newpassword
EOF
Changing password for user.
(current) UNIX password: Enter new UNIX password: Retype new UNIX password:
passwd: password updated successfully
user@Host:~$
これは: ssh経由でLinuxサーバーのパスワードを変更するスクリプト
以下のスクリプトは、ファイル(例:./passwdWrapper
)として保存し、実行可能(chmod u+x ./passwdWrapper)
)にする必要があります
#!/usr/bin/expect -f
#wrapper to make passwd(1) be non-interactive
#username is passed as 1st arg, passwd as 2nd
set username [lindex $argv 0]
set password [lindex $argv 1]
set serverid [lindex $argv 2]
set newpassword [lindex $argv 3]
spawn ssh $serverid passwd
expect "assword:"
send "$password\r"
expect "UNIX password:"
send "$password\r"
expect "password:"
send "$newpassword\r"
expect "password:"
send "$newpassword\r"
expect eof
次に、./passwdWrapper $user $password $server $newpassword
を実行して、実際にパスワードを変更します。
注:これには、コマンドを実行するマシンにexpect
をインストールする必要があります。 (Sudo apt-get install expect
)このスクリプトはCentOS 5/6およびUbuntu 14.04で動作しますが、passwd
のプロンプトが変更された場合、expect
行を微調整する必要がある場合があります。
Here is the script...
#!/bin/bash
echo "Please enter username:"
read username
echo "Please enter the new password:"
read -s password1
echo "Please repeat the new password:"
read -s password2
# Check both passwords match
if [ $password1 != $password2 ]; then
echo "Passwords do not match"
exit
fi
# Does User exist?
id $username &> /dev/null
if [ $? -eq 0 ]; then
echo "$username exists... changing password."
else
echo "$username does not exist - Password could not be updated for $username"; exit
fi
# Change password
echo -e "$password1\n$password1" | passwd $username
以下のリンクも参照してください...
http://www.putorius.net/2013/04/bash-script-to-change-users-password.html
あなたが試すことができます
LINUX
エコーパスワード| passwdユーザー名--stdin
UNIX
echo username:password | chpasswd -c
「-c」引数を使用しない場合、次回パスワードを変更する必要があります。
Ansibleを使用して、その中にSudo権限を設定できる場合、このスクリプトを簡単に使用できます。このようなスクリプトを作成する場合は、複数のシステムで実行する必要があります。したがって、それも自動化する必要があります。
私にとっては、これは迷惑なVMで機能しました:
Sudo /usr/bin/passwd root <<EOF
12345678
12345678
EOF