IT環境には多数のRed Hat Linuxサーバーがあります。チームメンバーから、SSHを使用して1回でユーザーのパスワードを変更するスクリプト(できればシェルスクリプト)を作成するように求められています。
私は解決策を見つけようとしましたが、見つけたスクリプトの多くはExpectを使用しています。サーバーにExpectがインストールされておらず、システム管理者がインストールを許可していません。また、ユーザーにはルートアクセス権がないため、passwd --stdin
またはchpasswd
は使用できません。
ユーザーがスクリプトを実行し、リスト内のすべてのサーバーで自分のユーザーのみのパスワードを変更できるように、スクリプトを作成する方法はありますか?
リモートマシンにインストールする必要はありません。 expectをローカルワークステーションまたはVM(virtualbox)またはいずれかの* nixボックスにインストールし、この.ex(expect)スクリプトを呼び出すラッパーを作成できます(ディストリビューションからディストリビューション、これはCentOS 5/6でテスト済み):
#!/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
passwd
を使用するためにルートアクセスは必要ありません。
このシャウドは問題なく動作します。
passwd <<EOF
old password
new password
new password
EOF
pssh (同時に並列ssh)を試してください。
cat>~/ssh-hosts<<EOF
user100@Host-foo
user200@Host-bar
user848@Host-qux
EOF
pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'
Squashbuffの例に基づいて、次のことを試しましたが、うまくいきました。
#!/ bin/bash `cat hostlist`のサーバー用; do echo $ server; ssh username @ $ server 'passwd <&ltEOF old_password new_password new_password EOF'; 完了
セキュリティに関しては、画面にエコーせずに入力を取得するように改善できましたORプレーンテキストをディスクに保存します。
echo "name:password" | chpasswd
別の可能性:1つのサーバーで手動で変更します。/etc/shadowから暗号化されたパスワードを取得します。さて、次のようなことをしてください:
for Host in $Host_LIST; do
ssh $Host "passwd -p 'encrypted_passwd' user"
done
もちろん、「encrypted_passwd」は、パスワードを手動で変更した/ etc/shadowから取得したものです。また、$ Host_LISTは、パスワードを変更したいホストのリストです。
export Host_LIST="server1 server2 server15 server67"
または、おそらくファイルを使用して(他の人が示唆しているように):
export Host_LIST=`cat Host_list.txt`
ファイル「Host_list.txt」には、パスワードを変更するすべてのシステムのリストが含まれています。
編集:passwdのバージョンが-pオプションをサポートしていない場合は、「usermod」プログラムを使用できる可能性があります。上記の例は同じままで、単に「passwd」を「usermod」に置き換えます。
さらに、 便利なツールpdsh を検討することもできます。これにより、上記の例は次のように単純化されます。
echo $Host_LIST | pdsh -Rssh -w- "usermod -p 'encrypted_passwd' user"
注意すべき最後の「落とし穴」:暗号化されたパスワードには、フィールド区切り文字としてドル記号文字( '$')が含まれている可能性があります。おそらくforループまたはpdshコマンドでこれらをエスケープする必要があります(つまり、「$」は「\ $」になります)。
スクリプトを実行する任意のサーバーに sshpass をインストールします。
yum -y install sshpass
Host、User Name、PasswordおよびPort。 (要件に基づいて)。
192.168.1.2|sachin|dddddd|22
以下の詳細を使用してスクリプトファイルを準備します。
#!/bin/bash
FILE=/tmp/ipaddress.txt
MyServer=""
MyUser=""
MyPassword=""
MyPort=""
exec 3<&0
exec 0<$FILE
while read line
do
MyServer=$(echo $line | cut -d'|' -f1)
MyUser=$(echo $line | cut -d'|' -f2)
MyPassword=$(echo $line | cut -d'|' -f3)
MyPort=$(echo $line | cut -d'|' -f4)
Host=$MyServer
USR=$MyUser
PASS=$MyPassword
sshpass -p $PASS ssh -p $MyPort -o StrictHostKeychecking=no $USR@$Host \
-T "echo 'sachin@patel' | passwd --stdin root" \
< /dev/null | tee -a output.log
done
exec 0<&3
Perlを使用できますか?
ここ ホストのセットでパスワードを変更するスクリプトがあります。
スクリプトを実行しているローカルマシンにインストールされたいくつかのPerlモジュール( Net :: OpenSSH :: Parallel 、 Expect およびそれらの依存関係)が必要な場合変更する必要があります。
ピアに提示したい代替手段は、パスワードなしの認証を使用することです。彼らは公開鍵/秘密鍵のペアを生成し、公開鍵をログインする各サーバーの〜/ .ssh/authorized_keysファイルに登録します。
試しましたか App :: Unix :: RPasswd
echo -e "wakka2\nwakka2\n" |パスワードルート
cat /tmp/passwords | ssh $server Sudo chpasswd -e
パスワードが暗号化されている場合、または
cat /tmp/passwords | ssh $server Sudo chpasswd
パスワードが暗号化されていない場合。
/ tmp/passwordsの形式は「user:password」にする必要があります
私は自分の解決策を回答フィールドに入れるべきだと思った-これが質問の一部であるかどうかわからない..
OK、デニスの提案を使用して、部分的に機能するソリューションをまとめました。
servers.txtは次のようになります。
server1
server2
server3
.
.
.
私は使っている:
for server in `cat servers.txt`; do
ssh $server -l user 'passwd <<EOF
old_pass
new_pass
new_pass
EOF';
done
これにより、以下が生成されます。
user@server1's password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.
user@server2's password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.
そのため、ここでも、サーバーごとに古いパスワードを1回入力する必要があります。これは回避できますか?
Sshを使用している場合、最初にパスワードがあるのはなぜですか?ユーザーの公開sshキーを、使用および実行が許可されているすべてのサーバーにプッシュします。これにより、必要なすべてのアクセスを簡単に許可および取り消しできます。
文字通り何万ものサーバーがあった以前の$ dayjobでは、どのサーバーでどのエンジニアが許可されているかというデータベースがあり、sshキーのインストールは自動化されたプロセスでした。ほとんどのNOBODYには、どのマシンでもパスワードがありました。