SOFTELメモ

Softel Inc.

【linux】リモートのコマンド実行結果を全部取得できない?

問題

expect経由で、sshコマンドを実行して、各リモートのサーバーでコマンドを実行して結果を収集しようとしたんだけど、実行結果が途中で切れてしまう。なぜ?

答え

sshコマンドを -t オプションなしで実行すると、1回だけのコマンド実行のために疑似端末を割り当ててもらえなくて、標準出力を全部もらえないこともあるらしい(たぶん)。

-t オプションを付けると、安定して最後まで結果を取得できている様子(たぶん)。

なお、-t オプションを付けると、最後に「Connection to 192.0.2.123 closed.」がついてくるので、そのつもりで対応すること。

例) get_crontab.exp … リモートのサーバーからcronの設定内容を取得する

#!/usr/bin/expect

set h [lindex $argv 0]  ;#host
set p [lindex $argv 1]  ;#port
set u [lindex $argv 2]  ;#user
set s [lindex $argv 3]  ;#password

set timeout 30
spawn ssh -tt $u@$h -p $p crontab -l
expect {
        "*yes/no*" {send "yes\r";exp_continue}
        "*password:*" {send "$s\r";exp_continue}
}

以下のように実行(引数にパスワードを渡すのはあまりしたくないけど)

get_crontab.exp ホスト名 ポート番号 ユーザー名 ハスワード > ログファイル

-t オプションを付けていないと、リモートで実行した crontab -l の結果(ある程度文字数がある)が全部取得できず、途中で切れる現象が発生していたが、-t や -tt を付けると、安定して結果が取得できるようになった。

関連するメモ

コメント