3

100台のリモートサーバーからユーザー情報を収集する必要があります。認証用の公開鍵/秘密鍵インフラストラクチャがあり、ssh-agent鍵を転送するコマンドを構成しました。つまり、パスワードプロンプトなしで任意のサーバーにログインできます(自動ログイン)。

次に、すべてのサーバーでスクリプトを実行して、ユーザー情報(すべてのサーバーにあるユーザーアカウントの数)を収集します。

これは、ユーザー情報を収集するための私のスクリプトです。

#!/bin/bash
_l="/etc/login.defs"
_p="/etc/passwd"

## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)

## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)

awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max  && $7 != "/sbin/nologin" ) print $0 }' "$_p"

対話なしでsshを使用してこのスクリプトを実行する方法がわかりませんか?

4

6 に答える 6

3

あなたがexpectを使ってできることのように聞こえます。

http://linux.die.net/man/1/expect

Expectは、スクリプトに従って他の対話型プログラムと「対話」するプログラムです。スクリプトに続いて、Expectは、プログラムから何が期待できるか、そして正しい応答がどうあるべきかを知っています。

于 2012-10-17T15:20:44.960 に答える
3

リモートマシンにログインする必要があるため、「sshなしで」これを行う方法はありません。ただし、sshログインするとリモートマシンで実行するコマンドを受け入れます(シェルの代わりに起動します)。したがって、スクリプトをリモートマシンに保存できる場合、たとえば、として~/script.sh、インタラクティブシェルを起動せずにスクリプトを実行できます。

$ ssh remote_machine ~/script.sh

スクリプトが終了すると、接続は自動的に閉じられます(意図的に構成しなかった場合)。

于 2012-10-17T15:23:22.783 に答える
2

各マシンにキーがありssh remotehost、監視ホストから取得できる場合は、要求した情報を収集するために必要なすべてのものを入手できます。

#!/bin/bash

servers=(wopr gerty mother)

fmt="%s\t%s\t%s\n"
printf "$fmt" "Host" "UIDs" "Highest"
printf "$fmt" "----" "----" "-------"

count='awk "END {print NR}" /etc/passwd' # avoids whitespace problems from `wc`
highest="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print n}' /etc/passwd"

for server in ${servers[@]}; do
    printf "$fmt" "$server" "$(ssh "$server" "$count")" "$(ssh "$server" "$highest")"
done

私にとっての結果:

$ ./doit.sh
Host    UIDs    Highest
----    ----    -------
wopr    40      2020
gerty   37      9001
mother  32      534

これにより、各サーバーに2つのssh接続が確立され、各データが収集されることに注意してください。これをもう少し効率的に実行したい場合は、情報を1つの少し複雑な収集スクリプトにバンドルできます。

#!/usr/local/bin/bash

servers=(wopr gerty mother)

fmt="%s\t%s\t%s\n"
printf "$fmt" "Host" "UIDs" "Highest"
printf "$fmt" "----" "----" "-------"

gather="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print NR,n}' /etc/passwd"

for server in ${servers[@]}; do
    read count highest < <(ssh "$server" "$gather")
    printf "$fmt" "$server" "$count" "$highest"
done

(同じ結果です。)

于 2012-10-17T15:37:28.293 に答える
2

ssh remoteserver.example / bin / bash <localscript.bash

于 2013-11-15T17:44:05.970 に答える
0

(注:パスワードを手動で入力せずに認証する「適切な」方法は、SSHキーを使用することです。ローカルスクリプトでもパスワードをプレーンテキストで保存すると、潜在的なセキュリティの脆弱性になります)

bashスクリプトの一部としてexpectを実行できます。既存のスクリプトをハックできる簡単な例を次に示します。

login=user
IP=127.0.0.1
password='your_password'

expect_sh=$(expect -c "
spawn ssh $login@$IP
expect \"password:\"
send \"$password\r\"
expect \"#\"
send \"./$remote_side_script\r\"
expect \"#\"
send \"cd /lib\r\"
expect \"#\"
send \"cat file_name\r\" 
expect \"#\"
send \"exit\r\"
")

echo "$expect_sh"

pscpを使用して、スクリプトの一部としてファイルを前後にコピーすることもできるため、対話の一部としてパスワードを手動で指定する必要はありません。

パテツールをインストールします。

$ sudo apt-get install putty-tools

スクリプトでのpscpの使用:

pscp -scp -pw $password file_to_copy $login@$IP:$dest_dir
于 2012-10-17T15:30:39.903 に答える
0

次のようにexpectコマンドを試してみたいと思うかもしれません

#!/usr/bin/expect
set timeout 30
spawn ssh -p ssh_port -l ssh_username ssh_server_host
expect "password:" 
send "your_passwd\r"
interact

expectコマンドは「password:」をキャッチし、上記で送信したパスワードを自動的に入力します。

ssh_port、ssh_username、ssh_server_host、your_passwdを独自のconfigureに置き換えることを忘れないでください

于 2013-11-15T14:54:46.923 に答える