سؤال

أحتاج إلى أتمتة تسجيل الدخول إلى جلسة Telnet باستخدام توقع, ، لكنني بحاجة إلى رعاية كلمات مرور متعددة لنفس اسم المستخدم.

هذا هو التدفق الذي أحتاجه لإنشاء:

  1. فتح جلسة telnet إلى IP
  2. إرسال اسم المستخدم
  3. إرسال كلمة المرور
  4. كلمة مرور خاطئة؟ أرسل نفس اسم المستخدم مرة أخرى ، ثم كلمة مرور مختلفة
  5. كان ينبغي أن يكون تسجيل الدخول بنجاح في هذه المرحلة ...

لما يستحق ، هذا ما لدي حتى الآن:

#!/usr/bin/expect
spawn telnet 192.168.40.100
expect "login:"
send "spongebob\r"
expect "password:"
send "squarepants\r"
expect "login incorrect" {
  expect "login:"
  send "spongebob\r"
  expect "password:"
  send "rhombuspants\r"
}
expect "prompt\>" {
  send_user "success!\r"
}
send "blah...blah...blah\r"

وغني عن القول أن هذا لا يعمل ، ولا يبدو جميلًا جدًا. من مغامراتي مع Google توقع يبدو أنه شيء من الفنان المظلم. شكرا مقدما لأي شخص للمساعدة في هذا الأمر!

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

المحلول

يجب أن توصي استكشاف توقع كتاب لجميع المبرمجين المتوقعين - لا يقدر بثمن.

لقد أعادت كتابة الكود الخاص بك: (لم يخبر)

proc login {user pass} {
    expect "login:"
    send "$user\r"
    expect "password:"
    send "$pass\r"
}

set username spongebob 
set passwords {squarepants rhombuspants}
set index 0

spawn telnet 192.168.40.100
login $username [lindex $passwords $index]
expect {
    "login incorrect" {
        send_user "failed with $username:[lindex $passwords $index]\n"
        incr index
        if {$index == [llength $passwords]} {
            error "ran out of possible passwords"
        }
        login $username [lindex $passwords $index]
        exp_continue
    }
    "prompt>" 
}
send_user "success!\n"
# ...

exp_continue تعود إلى بداية الكتلة المتوقعة - إنها مثل بيان "redo".

لاحظ أن send_user ينتهي \n ليس \r

ليس عليك الهروب من > الشخصية في مطالبك: إنها ليست خاصة لـ TCL.

نصائح أخرى

مع القليل من الضرب وجدت حل. تبين أنه يتوقع استخدام بناء جملة TCL لا أعرفه على الإطلاق:

#!/usr/bin/expect
set pass(0) "squarepants"
set pass(1) "rhombuspants"
set pass(2) "trapezoidpants"
set count 0
set prompt "> "
spawn telnet 192.168.40.100
expect {
  "$prompt" {
    send_user "successfully logged in!\r"
  }
  "password:" {
    send "$pass($count)\r"
    exp_continue
  }
  "login incorrect" {
    incr count
    exp_continue
  }
  "username:" {
    send "spongebob\r"
    exp_continue
  }
}
send "command1\r"
expect "$prompt"
send "command2\r"
expect "$prompt"
send "exit\r"
expect eof
exit

نأمل أن يكون هذا مفيدًا للآخرين.

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

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

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

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