- PR -

telnet(windows ⇒ linux)の文字化け(Perl使用)

1
投稿者投稿内容
kirua
常連さん
会議室デビュー日: 2006/05/30
投稿数: 31
投稿日時: 2006-08-07 16:11
下記の通りにPerlでTelnetを使用して、WindowsからLinuxに接続し、
コマンドを実行しています。コマンドの実行結果を出力していますが、
文字化けを起こします。「set codeset Japanese EUC」も利かないようです。
どこか不味いのかご教授願います。

Windows側:2003server
Linux側:RedHat9
Perl:Active Perl 5.8.8
telnet:Net-Telnet-3.03

**************************************
ソースの内容
**************************************
use strict;
use Net::Telnet ();

# 接続情報(環境に合わせて修正する)
# my $host = 'LinuxServer'; # 接続ホスト名 or IPアドレス
# my $user = 'administrator'; # ログインユーザ名
# my $pass = 'Password'; # ログイン用パスワード
# my $log_file = 'c:\test.log'; # ログファイル名

my $prompt = '/\[.+\]/'; # プロンプト(正規表現)
my $telnet = new Net::Telnet(
Timeout => 10,
Prompt => $prompt,
);

# ホストに接続してログインする
$telnet->open($host);
$telnet->login($user, $pass);

$telnet->print("set codeset Japanese EUC")

open(OUT, ">$log_file"); # LOGファイルオープン

my @result;
@result = $telnet->cmd("ls -l");
print OUT @result;

*******************
結果
*******************
ケ邱ラ 0
-rw-rw-r-- 1 administrator administrator 0 8キ・ 7 13:28 c:test.log

*******************
欲しい結果
*******************
合計 0
-rw-rw-r-- 1 administrator administrator 0 8月 7 13:28 c:test.log

[ メッセージ編集済み 編集者: kirua 編集日時 2006-08-07 16:16 ]

[ メッセージ編集済み 編集者: kirua 編集日時 2006-08-07 16:17 ]
SHR
ベテラン
会議室デビュー日: 2006/06/15
投稿数: 99
投稿日時: 2006-08-07 17:38
Net-Telnetが判らないので当てずっぽうになりますが、
そのままだと接続したサーバに"set codeset Japanese EUC"を入力している事になります。
Microsoft Telnetの場合、set condesetはopen前に入力するのですが、
多分同様の事ではないかと思われます。

クライアント側がSJISのようなので、サーバ側のLANGをSJISにする...
という安直な対応じゃダメですか?
kirua
常連さん
会議室デビュー日: 2006/05/30
投稿数: 31
投稿日時: 2006-08-07 18:45
SHRさん回答ありがとうございます。

SHRさんの言う通りに、"set codeset Japanese EUC"の発行する
タイミングが間違えています…ご指摘ありがとうございます。

実は解決してしまったのですが、
$telnet->print("set codeset Japanese EUC") の行を
$telnet->cmd("export LANG=ja_JP.SJIS") に入れ替えることにより
文字バケがなくなりました。(ただ日本語表示でなくなりましたが)

末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-08-07 20:17
こんばんは
解決済みのようですが

euc-jpを編集できるエディタで表示してみて正常に表示できるようであれば。
取得しているコードがeucなのだからWindowsで扱える文字コードに変換すればいいだけではないでしょうか?

my @result;
@result = $telnet->cmd("ls -l");
print OUT @result;

の部分で取得したレスポンスをprint OUTする前に @resultの内容を euc-jp => Shift_JIS変換すればいいのでは?

1

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