توقع - احصل على متغير من منطقة الشاشة على أساس الصف والعمود

StackOverflow https://stackoverflow.com/questions/1988811

سؤال

إنني أتعامل مع جلسة SSH وبرنامج ERP باستخدام توقع.

بدلاً من الاعتماد على تعبير منتظم لالتقاط متغير في البرنامج النصي المتوقع ، هل سيكون من الممكن عند تلقي ضغط مفتاح معين من المستخدم لالتقاط منطقة شاشة ، على سبيل المثال ، حقلًا واحدًا ، إلى متغير في الكود؟ إرسال الخادم بعض الأوامر الأخرى وإعادة تقديم الحقل؟

قل أن رقم الطلب موجود في 6 و 12 و 6 و 18 (حيث 6 هو الصف و 12-18 هي الأعمدة) التي تحتوي على رقم طلب 6 أرقام. أرغب في الحصول على رقم الطلب من الصف 6 من 12 إلى 18 نسخة إلى متغير. ثم اسمح للمستخدم بالتفاعل أكثر (أو توقع الانتقال إلى قائمة أخرى) ، ثم أعد تقديم رقم الطلب في قائمة أخرى.

لذلك أعتقد أن سؤالي هو: هل محتويات الشاشة الحالية في مخزن مؤقت واحد؟ (ليست الجلسة بأكملها) هل يمكنك استخراج عنصر بيانات معين فقط في نطاق هذا الصف والعمود على الشاشة؟

عينة الكود الكاذب:

#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1 
        interact {
                -reset $CTRLZ {exec kill -STOP [pid]}
                $CTRLA   {   
                        exp_send "menu_address\ry\r"
                }
                $CTRLO   {   
                        #...acquire order number variable...
                        #...some code I don't understand yet...

                        exp_send "menu_exit_sequence\r"
                        exp_send "menu_address\r"
                        exp_send $ordernumvar

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

المحلول

لا ، لا يمكنك الحصول على شيء من الشاشة في صف/عمود معين. ومع ذلك ، فكر في كيفية وصول المعلومات إلى الشاشة في المقام الأول. إذا كان تطبيقًا قائمًا على TTY باستخدام اللعنات ، فقد تم إخراجها إلى STDOUT مع تسلسل الهروب الخاص الذي تسبب في ظهوره في هذا الصف/العمود. لذلك ، "توقع" تسلسل الهروب المحدد للحصول على ما هو في هذا الموقف.

نصائح أخرى

في الواقع term_expect برنامج مثال يأتي مع توقع يمكن أن يفعل هذا بالضبط. إنه يحاكي محطة قابلة للضغط على المؤشر وتتيح لك اختبار الإخراج في مواقع شاشة محددة. في توزيع ActiveTcl الخاص بي ، يكون في العروض التوضيحية/توقع/term_expect.

لتصحيح الإخراج من ERP الخاص بي وجدت أنني أستطيع استخدام exp_internal للحصول على أحرف الإخراج.

exp_internal -f file 0

أعطاني إخراج ذلك: (تم إدخال رقمي الذي كان 076338)

spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M

حتى الآن أحتاج إلى اكتشاف regex للحصول على الحقل. كان لدي هذا:

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
    set ordernumber $interact_out(0,string)
}

لكن الآن أحتاج إلى دمج هذا:

^([a-zA-Z0-9]{1})?[0-9]{5}

مع بعض regex التي تمثل هذا:

\r\n\u001b[1;14H

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top