サーバーOS情報の取得
Perl/CGIプログラム を使って、インターネットサーバーのオペレーティングシステム(OS)情報を取り出す方法について説明します。
自分が使っているレンタルサーバーの情報というのは、そのレンタルサーバーのホームページを見てもなかなか見つけられないものです。
たとえレンタルサーバーのスペックを見つけたとしても、最低限の情報しか載っていなかったりします。
まぁ普通にホームページを公開するだけなら問題ないですが…。
Perl/CGIプログラム を設置する場合は、自分が使っているレンタルサーバーのオペレーティングシステム(OS)の名前ぐらいは知っておく必要があります。
なぜならPerl/CGIプログラムの中には、Windows系サーバーでしか動作しなかったり、UNIX系サーバーでしか動作しなかったりするものがあるからです。
Perl/CGIプログラミングをする場合でも、OSの違いにより使えるPerl関数が違ったりします。
なので、最低限Perl/CGIプログラムを設置するインターネットサーバーのOSが、Windows系なのかUNIX系なのかぐらいは知っておきましょう。
Perl/CGIソースコード
Perl/CGIプログラムから、インターネットサーバーのOS情報を取得します。
#!/usr/bin/perl
use strict;
my $server = &GetServerInfo;
print "Content-type: text/html\n\n";
foreach ('os','sysname','nodename','machine','release','version') {
next unless $server->{$_};
print "$_ : $server->{$_}<br>\n";
}
exit;
sub GetServerInfo {
my %info = ();
$info{'os'} = $^O;
if ($info{'os'} =~ /MSWin32/i) {
$info{'sysname'} = `ver`;
my $net_config_server = `NET CONFIG SERVER`;
my $line = (split("\n", $net_config_server))[0];
my @parts = split(/\s/, $line);
$info{'nodename'} = pop @parts;
} else {
$info{'machine'} = `uname -m`;
$info{'nodename'} = `uname -n`;
$info{'release'} = `uname -r`;
$info{'sysname'} = `uname -s`;
$info{'version'} = `uname -v`;
}
return \%info;
}
__END__
Perl/CGIプログラムサンプルを実行すると例えば以下のように表示されます。
os : linux
sysname : Linux
nodename : users131.heteml.jp
machine : i686
release : 2.6.9-89.0.25.ELsmp
version : #1 SMP Thu May 6 12:28:03 EDT 2010
これを見ると、このインターネットサーバーのOSがlinuxつまりUNIX系であることがわかります。
Perl/CGIスクリプト解説
上記サンプルのPerl/CGIプログラムを見ていただければ、だいたいのことはわかると思います。
サブルーチン GetServerInfoでインターネットサーバーのOS情報を取得しています。
戻り値は リファレンス 形式の ハッシュ配列 なので、連想配列のキーを手がかりに foreachループ を使って取得した情報をすべて表示させています。
この中でも大切なところは、OS名を取得しているところです。
「$server->{'os'}」でOS名のみをピンポイントで取り出せます。
では、GetServerInfo関数の中身を見てみましょう。
インターネットサーバーのOS名を取得しているところは「$info{'os'} = $^O;」というところです。
Perl/CGIプログラム内で、「$^O」とするとサーバーのOS名を参照することができます。
Windows系のサーバーであれば、「MSWin32」という文字を含んだ文字列が帰ってきます。
UNIX系のサーバーであれば、「linux」「freebsd」「solaris」などの文字列が帰ってきます。
これでサーバーOS名は取得できました。
そのほかの情報については、Windows系サーバーとUNIX系サーバーで、取得する方法が違います。
なので、 if文 の パターンマッチ でその後の処理を分岐させています。
Windows系サーバーであれば、Perlから直接verコマンドを起動します。
「$info{'sysname'} = `ver`;」
このように「`」ではさむことにより、Perlから直接verコマンドを実行できます。
UNIX系サーバーであれば、Perlから直接unameコマンドを起動します。
さらに、unameコマンドだけではOS名しか取得できないので、「-v」などのスイッチを付加して情報を取り出します。
Perlから直接UNIXコマンドを実行してその結果を得るためには…
「$info{'version'} = `uname -v`;」
のように「`」ではさみます。