web-dev-qa-db-ja.com

ssh経由でLinuxサーバーのパスワードを変更するスクリプト

IT環境には多数のRed Hat Linuxサーバーがあります。チームメンバーから、SSHを使用して1回でユーザーのパスワードを変更するスクリプト(できればシェルスクリプト)を作成するように求められています。

私は解決策を見つけようとしましたが、見つけたスクリプトの多くはExpectを使用しています。サーバーにExpectがインストールされておらず、システム管理者がインストールを許可していません。また、ユーザーにはルートアクセス権がないため、passwd --stdinまたはchpasswdは使用できません。

ユーザーがスクリプトを実行し、リスト内のすべてのサーバーで自分のユーザーのみのパスワードを変更できるように、スクリプトを作成する方法はありますか?

19
squashbuff

リモートマシンにインストールする必要はありません。 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
23
Randy Katz

passwdを使用するためにルートアクセスは必要ありません。

このシャウドは問題なく動作します。

passwd <<EOF
old password
new password
new password
EOF
12
Dennis

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'
9
Gilles Quenot

Squashbuffの例に基づいて、次のことを試しましたが、うまくいきました。

#!/ bin/bash 
 `cat hostlist`のサーバー用; do 
 echo $ server; 
 ssh username @ $ server 'passwd <&ltEOF 
 old_password 
 new_password 
 new_password 
 EOF'; 
完了

セキュリティに関しては、画面にエコーせずに入力を取得するように改善できましたORプレーンテキストをディスクに保存します。

6
fsckin
echo "name:password" | chpasswd
4
Poma

別の可能性:1つのサーバーで手動で変更します。/etc/shadowから暗号化されたパスワードを取得します。さて、次のようなことをしてください:

for Host in $Host_LIST; do
    ssh $Host "passwd -p 'encrypted_passwd' user"
done

もちろん、「encrypted_pa​​sswd」は、パスワードを手動で変更した/ 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コマンドでこれらをエスケープする必要があります(つまり、「$」は「\ $」になります)。

3
Matt
  1. スクリプトを実行する任意のサーバーに sshpass をインストールします。

    yum -y install sshpass
    
  2. HostUser NamePasswordおよびPort。 (要件に基づいて)。

    192.168.1.2|sachin|dddddd|22
    
  3. 以下の詳細を使用してスクリプトファイルを準備します。

    #!/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
    
2
Sachin Patel

Perlを使用できますか?

ここ ホストのセットでパスワードを変更するスクリプトがあります。

スクリプトを実行しているローカルマシンにインストールされたいくつかのPerlモジュール( Net :: OpenSSH :: ParallelExpect およびそれらの依存関係)が必要な場合変更する必要があります。

1
salva

ピアに提示したい代替手段は、パスワードなしの認証を使用することです。彼らは公開鍵/秘密鍵のペアを生成し、公開鍵をログインする各サーバーの〜/ .ssh/authorized_keysファイルに登録します。

1
phatfingers

Expectに付属する passmass スクリプト( manページ )では、リモートマシンにExpectをインストールする必要はありません。

1

試しましたか App :: Unix :: RPasswd

1
Kris

echo -e "wakka2\nwakka2\n" |パスワードルート

0
Lance Badger
cat /tmp/passwords | ssh $server Sudo chpasswd -e

パスワードが暗号化されている場合、または

cat /tmp/passwords | ssh $server Sudo chpasswd

パスワードが暗号化されていない場合。

/ tmp/passwordsの形式は「user:password」にする必要があります

0
Tom Mullahey

私は自分の解決策を回答フィールドに入れるべきだと思った-これが質問の一部であるかどうかわからない..

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回入力する必要があります。これは回避できますか?

0
squashbuff

Sshを使用している場合、最初にパスワードがあるのはなぜですか?ユーザーの公開sshキーを、使用および実行が許可されているすべてのサーバーにプッシュします。これにより、必要なすべてのアクセスを簡単に許可および取り消しできます。

文字通り何万ものサーバーがあった以前の$ dayjobでは、どのサーバーでどのエンジニアが許可されているかというデータベースがあり、sshキーのインストールは自動化されたプロセスでした。ほとんどのNOBODYには、どのマシンでもパスワードがありました。

0
Edward Falk