miau's blog?

Poderosa 導入

今までは TeraTerm 使ってたんだけど、もっと柔軟なマクロが使いたかったので試しに Poderosa 使ってみました。

そんな感じで Poderosa マクロの話。




■準備

まず Poderosa では現在マクロがサポートされてないので、プラグイン→マクロ を一緒に入れておく必要あり。

■小手調べ

サンプルをちょこちょこいじって、こんな感じに。

import Poderosa;
import Poderosa.ConnectionParam;
import Poderosa.Terminal;
import Poderosa.Macro;
import Poderosa.View;
import System.Drawing;

var env = new Environment();

var c = telnetViaProxy02('server01', EncodingType.SHIFT_JIS);

waitAndTransmit(c, 'Login:', 'user');
waitAndTransmit(c, 'Password:', 'pass');

// 直接 telnet で接続
function telnetDirect(host, enc)
{
var param = new TelnetTerminalParam(host);
param.Encoding = enc;

//Telnet negotiation
var c = env.Connections.Open(param);

return c;
}

// Proxy01(Delegete)経由で telnet 接続
function telnetViaProxy01(host, enc)
{
var param = new TelnetTerminalParam('proxy01');
param.Encoding = enc;

//Telnet negotiation
var c = env.Connections.Open(param);

waitAndTransmit(c, 'Host name:', host);
waitAndTransmit(c, 'Username:', 'user01');
waitAndTransmit(c, 'Password:', 'pass01');

return c;
}

// Proxy02 を踏み台にして telnet 接続
function telnetViaProxy02(host, enc)
{
var param = new TelnetTerminalParam('proxy02');
param.Encoding = enc;

//Telnet negotiation
var c = env.Connections.Open(param);

waitAndTransmit(c, 'login:', 'user02');
waitAndTransmit(c, 'Password:', 'pass02');
waitAndTransmit(c, 'user02@proxy01[1]%', 'telnet ' + host);

return c;
}

// wait & transmit
function waitAndTransmit(c, w, t)
{
var r = c.ReceiveData();
while (r.indexOf(w) == -1) r = c.ReceiveData(); //waiting prompt for account
c.TransmitLn(t);
}

普段は proxy01 を経由して telnet してるんだけど、現在このサーバが使えないので proxy02 を踏み台にしてログインが必要だったりする。TeraTerm マクロでは処理を関数化できない(Call って関数あるけど、実質 goto なので引数を受け取れない)けど、Poderosa マクロは JScript .NET だからこういうことができて便利。というか、これがやりたくて Poderosa 試してるんだけど。

と、ここでいくつか不満が。

・JScript だから組み込みっぽいオブジェクトに関しても容易に拡張できると思ってたんだけど、どうやらそうではないらしい。

 JScript オブジェクト

 JScript にはクラスベースのオブジェクトとプロトタイプベースのオブジェクトがあって、どうやら組み込みっぽいオブジェクトに関しては prototype とか使えないようで。オブジェクトを関数に渡さないといけないので、あまり美しくないですね。

・Encoding 指定が Open 前にしかできない仕組みになってそう。Proxy の文字コードは EUC-JP で、その先が Shift_JIS とかもあるので、柔軟に切り替えられるようにして欲しい。

・ウィンドウのタイトル指定ができない?気がする。見落としかもしれないけど。

■関数の外だし(挫折)

実際には接続したいサーバが複数あるので、関数を外に出してしまおうと。JavaScript には include() やら require() やらは存在しない(2.0 ではできるようになるっぽいけど)ので、FileSystemObject 使って読み込んでみる。

// include functions
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile("D:\\Poderosa\\Macro\\Sample\\login_common.js", 1); // 1: ForReading
var lines = f.ReadAll();
eval(lines, 'unsafe');
f.Close();

試してみたところ、

マクロの実行中に例外がスローされました。
[変数 'TelnetTerminalParam' が宣言されていません。]

こんなエラーが。なんだか知らないけど、名前空間が使えてないっぽい?
名前空間で修飾してもダメだし、import も eval 中で使えないらしい。ここで挫折。やり方わかる方は教えて下さい。

ちなみに eval() で 'unsafe' ってつけないと、

マクロの実行中に例外がスローされました。
[型 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。]

こんなエラーが発生する。解決策はここに載ってた。

MBR IT/.NET 247 : EVAL security Exceptions on microsoft.public.dotnet.languages.jscript

■結局のところ

自前でプラグイン用意するしかないっぽい?
自分だけが使うぶんにはそれでいいんだけど、周囲に展開しようと思うと敷居が高いと思われそうなので、どうしたもんだか・・・。
posted at 07:58:46 on 2007-03-07 by miau - Category: General No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。