كيفية إرسال ضغطة مفتاح إلى نص برمجي في نقطة معينة أثناء تشغيله في باش؟

0

أحاول كتابة برنامج نصي لأتمتة تثبيت برنامج في Linux. يتطلب بعض مدخلات المستخدم أثناء التثبيت. معظمهم مباشرة إلى الأمام مثل البساطة y أو n . أضيف هذه الردود إلى ملف responses.txt وقم فقط بتوجيهه إلى برنامج التثبيت مثل هذا: ./start < responses.txt .

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

أريد تثبيت البرنامج بدون هذا المكون. كيف يمكنني إرسال CTRL+C خلال هذه الفترة الزمنية برمجيا؟

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

هل من الممكن فعل شيء كهذا؟

2 الاجابة

1
افضل جواب

يؤدي الحرف Ctlr C عند إدخاله في لوحة المفاتيح إلى قيام برنامج تشغيل الجهاز أو الوحدة الطرفية الزائفة بإرسال إشارة مقاطعة (SIGINT). وبالتالي ، فإن Ctlr C الفعلي لا يصل أبدًا إلى البرنامج. الاستثناء من ذلك هو إذا تم تعيين الجهاز في الوضع الخام ، ولكن هذا غير مرجح.

يمكنك إرسال إشارة SIGINT باستخدام الأمر kill:

kill -2 pid

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

قد تتمكن من العثور على معرف العملية باستخدام ps و grep ، إذا كنت تعرف ما يطلق عليه.

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

( echo "response 1"
  echo "response-2"
  sleep 1
  pid=$(ps -something | grep something | sed something)
  kill -2 $pid
) | installer

قد يمنحك ذلك فكرة عن كيفية القيام بذلك.

ومع ذلك ، كما هو مقترح في مكان آخر ، هناك أدوات يمكنها القيام بهذا النوع من الأشياء نيابة عنك. صدى صوت

:مؤلف
0

إذا كنت ترغب في محاكاة التفاعل مع برنامج آخر ، فتوقع أن تكون الأداة المناسبة بشكل عام. وفقا لهذا SO أخرى آخر ، فإنه يمكن بسهولة إرسال أحرف CTLR C التي من شأنها أن تفسر على أنها SIGINT بواسطة عملية الرقيق.

:مؤلف
فوق
قائمة طعام