- PR -

シェルスクリプト中のwhileループ内でsshの実行

1
投稿者投稿内容
syscat
会議室デビュー日: 2003/06/05
投稿数: 8
投稿日時: 2005-12-14 11:49
こんなスクリプトを書いています。

最初の hosta の分だけ実行してスクリプトが終了してしまいます。
もちろん ssh は実行可能な環境になっています。

ssh の行をコメントアウトすると、echo文だけが hostd まで正常に実行されます。
sshを行うことで、何か環境が変わってしまうのでしょうか。
いいお知恵をお持ちでしたら、ご教授下さい。

----------------------------------
#!/bin/sh

while read server
do
    echo $server
    ssh root@${server} 'hostname'
done <<EOF!
hosta
hostb
hostc
hostd
EOF!
----------------------------------

[ メッセージ編集済み 編集者: syscat 編集日時 2005-12-14 12:05 ]
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-12-14 12:31
こんにちは

サンプル試してみました。
原因は良くわかりませんけど
なぜか、ヒアドキュメントがうまく処理されなくなってしまうみたいですね。

こんな書き換えは不可ですか?

コード:
#servers=`cat ./hosts.lst` #ホストリスト別ファイル
servers=`cat<<SERVERS_END
hosta
hostb
hostc
SERVERS_END`

for server in ${servers}
do
  echo ${server}
  ssh user@${server} 'hostname'
done



syscat
会議室デビュー日: 2003/06/05
投稿数: 8
投稿日時: 2005-12-14 13:56
jkさま

早速ありがとうございました。

例示頂いたように、for文に書き換えてみますと、問題なくループ出来ました。
while文にこだわりすぎていました。

while文については、気にはなりますね。

とりあえず目的の動作が出来るようになりましたので、助かりました。
ありがとうございました。
portulaca
会議室デビュー日: 2005/11/30
投稿数: 12
投稿日時: 2005-12-14 18:57
原因は「while 文」じゃなくて、ssh でしょう。
ssh に -n を付けると解決するはずです。
syscat
会議室デビュー日: 2003/06/05
投稿数: 8
投稿日時: 2005-12-15 10:00
portulacaさま
ご返信頂きありがとうございました。

確かに-nを付けるとうまくいきました。
ただ、なぜそうなるのか、よく分かりません。
man によると、-n オプションの説明として

---
標準入力を /dev/null からリダイレクトするように (つまり標準入力か
らの読み込みを禁止した状態に) します。 ssh をバックグラウンドで走
らせるときには、このオプションが不可欠です。
---

とあります。
今回のスクリプトはバックグラウンドで動かそうとしているわけではない
のですが、標準入力とつながっていないということが重要なのでしょうか。

ここに書かれていることと、while文が途中で抜けてしまうことが頭の中で
つながりません。

for文だと -n 無しでも中断しないことも関係があるのでしょうか。

申し訳ありませんが、この部分をお教え頂ければありがたいです。
1

スキルアップ/キャリアアップ(JOB@IT)