كيف يمكنني مسح المخزن المؤقت للمدخلات في برنامج نصي توقع؟
سؤال
أنا أكتب نصا نتوقع ويواجه مشكلة في التعامل مع موجه Shell (على Linux). توقع بلدي تلبي البرامج النصية rlogin
والنظام البعيد يستخدم ksh
. وبعد يحتوي المطالبة على النظام البعيد على الدليل الحالي متبوعا " > "
(مساحة أكبر من الفضاء). قد يكون مقتطف البرنامج النصي:
send "some command here\r"
expect " > "
هذا يعمل لأوامر بسيطة، لكن الأمور تبدأ في الظهور عندما يتجاوز الأمر الذي أرسله بعرض المحطة (أو أكثر بدقة، ما ksh
يفكر هو عرض المحطة). في هذه الحالة، ksh
هل بعض التمرير الأفقي الغريب لسطر الأوامر التفاعلي، والذي يبدو أنه يعيد كتابة المطالبة والعصي ">" الإضافي في الإخراج. بطبيعة الحال، يؤدي هذا إلى الخلط بين البرنامج النصي والخروج من المزامنة عندما يبدو أن هناك أكثر من موجه واحد في الإخراج بعد تنفيذ الأمر (يحتوي البرنامج النصي على عدة send
/expect
أزواج).
لقد حاولت تغيير PS1
على النظام البعيد إلى شيء أكثر تميزا مثل "موجه>" ولكن هناك مشكلة مماثلة تنشأ مما يدل على لي أن هذا ليس هو الطريقة الصحيحة لحل هذا.
ما أفكر فيه قد يساعد هو القدرة على البرنامج النصي لتخيره توقع أن "أعرف أنني متزامن بشكل صحيح مع النظام البعيد في هذه المرحلة، فافهل المخزن المؤقت الإدخال الآن." ال expect
البيان لديه -notransfer
العلم الذي لا تجاهل المخزن المؤقت للإدخال حتى لو كان النمط يتطابق، لذلك أعتقد أنني بحاجة إلى عكس ذلك.
هل هناك أي تقنيات مفيدة أخرى يمكنني استخدامها لجعل الشل البعيد تتصرف أكثر من المتوقع؟ أفهم أن نتوقع يمر الكثير من العمل للتأكد من أن الجلسة المستأجرة يبدو أن تكون تفاعليا في النظام البعيد، لكنني أفضل أن بعض الميزات التفاعلية الأكثر مزعجا (مثل التمرير الأفقي لل ksh
) يتم إيقاف تشغيله.
المحلول
إذا كنت ترغب في التخلص من جميع الإخراج، فقد شهدنا حتى الآن، حاول
expect -re $
هذه هي مباراة Regexp على $ مما يعني نهاية المخزن المؤقت للإدخال، لذلك سوف تخطي كل شيء تلقى حتى الآن. مزيد من التفاصيل في نتوقع صفحة الرجل.
نصائح أخرى
يمكنك تجربة "تعيين -o Multiline" أو الأعمدة = 1000000 (أو بعض قيمة كبيرة أخرى).
لقد واجهت صعوبة في KSH وتتوقع في الماضي. كان الحل الخاص بي لاستخدام شيء آخر غير KSH لقذيفة تسجيل الدخول.
إذا كنت تستطيع تغيير تسجيل الدخول عن بعد إلى غير KSH (باستخدام الأمر Chsh أو تحرير / ETC / Passwd)، فقد تحاول ذلك باستخدام / bin / sh as the shell.
بديل آخر هو معرفة KSH أن المحطة هي محطة غبية - عدم السماح بها من القيام بأي معالجة خاصة.
$ export TERM=""
قد تفعل الخدعة.