[Shell] shスクリプトのwhile文の中でsshを実行すると1回しか実行されない件

2015年5月6日

Shell プログラミング

サーバーを扱う時にshellコマンドやshellスクリプトは必須です。 コマンドは、慣れてくるとGUIで操作するのが馬鹿らしくなってくるほど便利な事が多いことに気が付きます。 所詮GUIはCUIコマンドをマウスを使って操作するだけの事でいかに手が早く動かせるかの勝負だが、 CUIであれば、キーボードのタイピングとコマンドの知識でいかようにでも効率化できます。 そこにスクリプトを覚えれば、自分の行う処理を自動化したり、サーバーでの操作をかなり便利に行う事が用意にわかります。

トラブルの始まり

とりあえず、ここではshellスクリプトの講座を行うのではなく、以下のファイル読み込みの基本構造を使って、複数サーバー管理を行なった以前のブログでハマったので、メモっておきます。 「サーバー管理ツールを作る #1「複数サーバー管理」」

Shellスクリプトの基本

下記のプログラムで、特定のファイルを行毎に読み込み、画面に表示することができる。 dataFile="/data.txt" while read line do echo ${line} done<$dataFile

応用

これを応用して、複数のサーバーに対してsshでコマンドを実行すれば、一般の管理ツールと同じ事ができると思って実行 # vagrantで試しに作ってみてください。 192.168.1.2 192.168.1.3 dataFile="/data.txt" while read line do echo `ssh ${line} hostname` done<$dataFile

結果

> server1 何故か1行しか結果が返ってきません。 途中でサーバーアクセスがハングしているのかとずっと思って悩んでいたら、同じ事でハマった方のページを見つけ解決しました。 http://b.l0g.jp/dev/ssh-inside-while/

解決

dataFile="/data.txt" while read line do echo `ssh -n ${line} hostname` done<$dataFile

結果

> server1 > server2 "-n"オプションをつけるとよかったんですね。 どうやらsshを実行すると、結果に対してコマンドが終了してしまうらしいので、-nオプションをつけて、/dev/nullとして、終了を阻止するという事らしいです。 この-nオプションて、何に使うのかがずっと疑問だったんですが、こういう為だったんですね。 でも、これ以外に何に使うのか?スクリプトの為のオプション?? ますます謎ですが、とりあえず、解決して安心です。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。