9

私のチームは多くのサーバーを管理しており、会社のポリシーでは、これらのサーバーのパスワードは数週間ごとに変更する必要があると定められています。パスワードの公式データベースが何らかの理由で古くなることがありますが(通常、人々はパスワードを更新するのを忘れます)、すべてのサーバーを一貫して使用しているわけではないため、数か月後までこれを特定できないことがあります。

データベースからパスワードを取得するスクリプトを作成し、それらのパスワードを使用して毎晩各サーバーへの(ssh)ログインを試行し、結果を記載した電子メールをチームに送信したいと思います。ログイン情報のためにデータベースをスクレイプすることはできますが、sshログインが期待どおりに成功したかどうかを確認する方法がわかりません

このタスクに公開鍵認証を使用できません。パスワードを確認できるように、パスワード認証が必要です

次のファイルを指定して、公開鍵認証を無効にします。

PasswordAuthentication=yes
PubkeyAuthentication=no

期待スクリプトでの私の試み:

# $1 = host, $2 = user, $3 = password, $4 = config file
expect -c "spawn ssh $2@$1 -F $4
expect -re \".*?assword.*?\"
send \"$3\n\"
...
send \'^D\'"

終了ステータスが成功を示しているのではないかと思いました。しかし、manページには何も見つかりませんでした。

4

4 に答える 4

7

私は同様のタスクのために以下のスクリプトのようなものを使用しています。

#!/bin/sh
# Run using expect from path \
exec expect -f "$0" "$@"
# Above line is only executed by sh
set i 0; foreach n $argv {set [incr i] $n}
set pid [ spawn -noecho ssh $1@$3 $4 ]
set timeout 30
expect {
    "(yes/no)" {
        sleep 1
        send "yes\n"
        exp_continue
    }
    "(y/n)" {
        sleep 1
        send "y\n"
        exp_continue
    }
    password {
        sleep 1
        send "$2\n"
        exp_continue
    }
    Password {
        sleep 1
        send "$2\n"
        exp_continue
    }
    "Last login" {
        interact
    }
    "Permission denied" {
        puts "Access not granted, aborting..."
        exit 1
    }
    timeout {
        puts "Timeout expired, aborting..."
        exit 1
    }
    eof {
        #puts "EOF reached."
    }
}
set status [split [wait $pid]]
set osStatus [lindex $status 2]
set procStatus [lindex $status 3]
if { $osStatus == 0 } {
    exit $procStatus
} else {
    exit $procStatus
}
于 2012-09-05T14:55:02.050 に答える
1

シェルを取得できるかどうか、またはコマンドを実行しようとしているかどうかを具体的に確認する必要がありますか?

認証を確認したいだけの場合は、( 、、などssh asimplecommandを使用して)実行し、期待どおりの結果が得られるかどうかを確認することをお勧めします。echohostname

-vオプションを指定してsshを起動Authentication succeededし、(debug1ログレベルで)検索することもできます。

于 2012-09-05T13:20:28.657 に答える
1

crowbentは、sshログインをテストするためのexpectスクリプトを提供していますが、ssh/sftpのテストには非対話型のsshパスワード認証を使用することをお勧めします。sshpassは、予想よりもはるかに安全で、エラーが発生しにくくなっています。

于 2012-09-05T15:47:09.303 に答える
0

根本的な問題(パスワードデータベースが同期しなくなる)の解決策は、公開鍵認証を使用することです。すべての人のために。SSHに関しては、パスワードを気にしないでください。

ログインが成功したかどうかは、次のように確認できます。

ssh -o PasswordAuthentication=no USER@HOST 'exit' || echo "SSH login failed."
于 2012-09-05T13:33:34.320 に答える