iptables --flush
100を超えるサーバーでコマンドを実行する必要があります。ルート資格情報はありませんが、私のアカウントへのsudoアクセス権があります。だから私はすべてのサーバーでこのコマンドを実行するために以下のスクリプトを考えました。
flashhostsファイルにサーバー名を追加しました。
[root@~]# cat testscript.sh
> for i in `cat /flushhosts`
>
> do
>
> sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
>
> cat << EOF || "Mypwd"
>
> done
[root@~]# ./testscript.sh
./testscript.sh: line 6: syntax error: unexpected end of file
スクリプトに欠落しているコンテンツが見つかりません。
答え1
別のアプローチを使用したい場合は、次のようにExpectを使用することをお勧めします。
小さな期待スクリプトの作成ex1.sh
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn ssh username@$arg1
expect "password: "
send "Mypwd\r"
expect "$ "
send "sudo /sbin/iptables --flush\r"
expect "password "
send "Mypwd\r"
expect "$ "
send "exit\r"
その後、次のループで使用できます。
for i in $(</flushhosts); do ./ex1 $i; done
この場合、Expectをより柔軟に使用できます。
答え2
努力する
for i in $(</flushhosts)
do
echo "Mypwd" | sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
done
- これはうまくいくかもしれませんが、sudoに入るかどうかは
Mypwd
わかりません。echo Mypwd
$(</flushhosts)
$(cat /flushhosts)
後で参照される「cat /flushhosts」と同じです。
~についてcat<<"EOF"||私のパスワード
1) 猫 <<<"EOF"
その後、EOFという単語が表示されるまで行を読み、テキスト全体をcatに送ります。これにはdone
単語が含まれます。
2)||私のパスワード
cat がゼロ以外の値を返す場合、Mypwd はコマンドとして実行されます。
EOF 語が見つからなかったため、bash が文書の終わりに達するとそれfor ... do
で終わらないため、done
構文エラーが発生します。
私はこれがあなたが望むものではないことを願っています。
文法
cat <<EOF
hello world
EOF
ここでドキュメントというのは、シェルスクリプトからデータを提供する方法です。