سؤال

يمكنني إعداد اتصال Telnet في بيرل أي مشاكل، وقد اكتشفت للتو لعنات، وأتساءل عما إذا كان بإمكاني استخدام الاثنين معا لتشكك الإخراج من جلسة Telnet.

يمكنني عرض على صف واحد، عمود أساس محتويات Stdout باستخدام البرنامج النصي بسيط أدناه:

use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";

واستخدام أدناه يمكنني فتح اتصال Telnet وإرسال أوامر إرسال تلقي بدون مشكلة:

use net::telnet;
my $telnet = new Net::Telnet (Timeout => 9999,);
$telnet->open($ipaddress) or die "telnet open failed\n";
$telnet->login($user,$pass);
my $output = $telnet->cmd("command string");

... ولكن ما أود القيام به حقا هو الحصول على استجابة Telnet (التي ستضم أحرف التحكم المحطة الطرفية) ثم البحث على أساس صف عمود باستخدام اللعنات. هل يعرف أحد بأي طريقة يمكنني توصيل الاثنين معا؟ يبدو لي أن اللعنات يمكن أن تعمل فقط على Stdout

هل كانت مفيدة؟

المحلول

أنت تبحث عن المصطلح :: VT102., التي تحاكي محطة VT102 (تحويل أحرف التحكم المحطة إلى حالة شاشة افتراضية). هناك مثال يوضح كيفية استخدامه نت :: telnet. في VT102 / أمثلة / telnet-usage.pl (دليل الأمثلة داخل دليل VT102 لسبب ما).

لقد كان حوالي 7 سنوات منذ أن استخدمت هذا (النظام الذي كنت أتمتة تحوله إلى واجهة قائمة على الويب)، لكنها كانت تستخدم للعمل.

نصائح أخرى

لعنات يفعل العكس. إنها مكتبة ج تحسين تحديثات الشاشة من برامج كتابة إلى محطة، مصممة أصلا لاستخدامها عبر اتصال تسلسلي بطيء. ليس لديه القدرة على كشط تخطيط من سلسلة من أحرف التحكم.

سيكون أفضل رهان محاكي محطة لديها واجهة برمجة تطبيقات مع القدرة على القيام بهذا النوع من كشط الشاشة. خارج الجزء العلوي من رأسي لست متأكدا مما إذا كان أي محاكاة المحطات الطرفية مفتوحة المصدر القيام بذلك، ولكن هناك بالتأكيد توفر منها تجارية يمكن.

ربما تريد شيئا مثل يتوقع

use strict;
use warnings;

use Expect;

my $exp = Expect->spawn("telnet google.com 80");

$exp->expect(15, #timeout
        [
                qr/^Escape character.*$/,
                sub {
                        $exp->send("GET / HTTP/1.0\n\n");
                        exp_continue;
                }
        ]
);

إذا كنت تفاعل بحتة مع أوامر وردود نصية عادية، يمكنك استخدامها يتوقع إلى البرنامج النصي، وإلا، يمكنك استخدامها المصطلح :: VT102., ، مما يتيح لك فحص الكشط (قراءة الأجزاء المحددة من الشاشة، وإرسال النص، والتناول الأحداث على التمرير، وحركة المؤشر، وتغييرات محتوى الشاشة، وغيرها) التطبيقات باستخدام تسلسل Escape VT102 للتحكم في الشاشة (على سبيل المثال، تطبيق باستخدام مكتبة اللعنات) وبعد

أو يمكنك استخدام النصي أمر لهذا.

من Solaris Man Page:

وصف

ال script الأداة تقدم سجل كل شيء مطبوع على الشاشة. السجل مكتوب اسم الملف. وبعد إذا لم يتم تقديم اسم ملف، فسيتم حفظ السجل في الملف أنفسريبت...

فوركس أمر البرنامج النصي ويخلق شل فرعي، وفقا لقيمة شل $، ويسجل النص من هذه الجلسة. ينتهي البرنامج النصي عند خروج Shell Forked أو عند كتابة التحكم D-D.

أود أن أصوت أيضا للحصول على إجابة. كان علي أن أفعل شيئا مشابها من تطبيق غوي. كانت الخدعة (وإن كانت مملة) للحصول على أحرف التحكم هي تجريد جميع أحرف متفرقات من السلاسل المرتجعة. إنه نوع من ذلك يعتمد على كيفية فوضى كشط الشاشة ينتهي.

هنا هي وظيفتي من هذا البرنامج النصي كمثال:

# Trim out the curses crap
sub trim {
    my @out = @_;
    for (@out) {
        s/\x1b7//g;
        s/\x1b8//g;
        s/\x1b//g;   # remove escapes
        s/\W\w\W//g;
        s/\[\d\d\;\d\dH//g;  # 
        s/\[\?25h//g;
        s/\[\?25l//g;
        s/\[\dm//g;
        s/qq//g;
        s/Recall//g;
        s/\357//g;
        s/[^0-9:a-zA-Z-\s,\"]/ /g;
        s/\s+/ /g;    # Extra spaces

    }
    return wantarray ? @out : $out[0];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top