ぐぅたらな活動

管理人の仕事・活動等で得た知識を残す為のブログ

5月 30th, 2011

sshを利用してFWから値を取得する方法(続き)

サーバ管理, 仕事関係, by 管理人.

こんにちは。

前にsshを利用してFWから値を取得する方法をまとめましたが、違う方法で取得することにしたので、備忘録を残しておきます。
前回のお話では、プロンプトからechoコマンドとsshコマンドを利用して結果を得ることを考えました。
sshを利用してFWから値を取得する方法
実際には様々な制約があるため他の方法で取得できるように変更しました。

まず前回の話では以下の目的で考えました。
■前回の目的
SNMP経由でFWから得られない情報(MIB情報が無い)場合にSSHでログインし必要な値を取得すること。
上記の実装としてsshコマンドを利用してFWから値を取得するにはいくらかの条件があります。
また、FWへ値を取得しにいくのはcron等に登録して自動的にすることを考えていました。

(条件)
1.sshの鍵認証でログイン出来ること(パスフレーズ無し)
2.パスワード無しであるユーザでログインで出来ること

1もしくは2の条件の下でならsshコマンドを利用して値が取れます。
ここで、1.の場合、FW側で公開鍵を設置することが出来ることが条件です。今回使用するFWは公開鍵認証はサポートされていないため出来ません。
2はFW上でパスワード無しのユーザを作成できない(さすがにセキュリティ的に禁止されているか)ので却下です。

ということでプロンプトからsshコマンドを使用してFWから値を定期的に取得する方法が見つかりません(必ずパスワードを入力しなければいけないので)。

そこで、perlのモジュールを使用して、FWからデータを取得することとしました。
スクリプト内にパスワードを記入しなければいけないためセキュリティ的によろしくないですが、アクセスできるサーバが限られているのでOKとしました(今後どうするかは決めていない)。

Net::SSH::PerlとNet::SSH2を用いてみるも、モジュールの実装で駄目なのか、値を取得できませんでした。

そこでアドバイスを頂き、Net::SSH::Expectを使用することとしました。

Net::SSH::Expect

#!/usr/bin/perl

use strict;
use warnings;
use Net::SSH::Expect;

## target settings #######################
my $IPADDRESS   = '${serverip}';
my $USERNAME    = '${username}';
my $PASSWORD    = '${password}';

## command setting #######################
my $COMMAND     = '${command}';

$| = 1;

my $ssh = Net::SSH::Expect->new (
    host        => "$IPADDRESS",
    password    => "$PASSWORD",
    user        => "$USERNAME",
    timeout     => 3,
    no_terminal => 1,
);
my $login_output = $ssh->login();
my $retval = $ssh->exec($COMMAND);
$retval =~ s/\r\n/\n/g;

my @buffer = split /\n/, $retval;
foreach my $line (@buffer) {
    chomp $line;
    print "$line\n";
}
$ssh->close();
exit 0;

${hogehoge}には任意の文字列が入ります。
エラー処理していませんが上記の内容で取得できるようになりました。感謝ですm(_ _ )m
表示までにs/とかやっていますけど、改行の違いからCR+LFとなっていたので、CRのみに変更とかしています。環境によって要らなくなるかもですね。

ということで続きの作業しまっす。

Back Top

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です