English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحقيق التفاعل التلقائي مع Shell باستخدام أمر expect

الخلفية

هناك العديد من السيناريوهات في سكريpts Linux لتنفيذ العمليات عن بعد، مثل تسجيل الدخول عن بعد ssh، نسخ عن بعد scp، نقل الملفات sftp وما إلى ذلك. تشمل هذه الأوامر إدخال كلمات المرور الأمنية، ويجب على المستخدمين إدخال كلمات المرور يدويًا وتقبل التحقق الأمني أثناء استخدام الأوامر بشكل طبيعي. من أجل تحقيق العمليات التلقائية عن بعد، يمكننا الاستعانة بميزات expect.

expect هو لغة برمجة أدوات برمجة مجانية، تستخدم لتحقيق التواصل بين المهام التلقائية والتفاعلية دون الحاجة إلى تدخل بشري. يتطور expect باستمرار، ويزداد قوة مع مرور الوقت، ويصبح مساعدًا قويًا للمسؤولين عن النظام. يتطلب expect دعم لغة البرمجة Tcl، ويجب تثبيت Tcl أولاً قبل تشغيل expect على النظام.

تثبيت expect

تم إنشاء expect على أساس Tcl، لذا يجب علينا تثبيت Tcl أولاً قبل تثبيت expect.

(أولاً) تثبيت Tcl

الصفحة الرئيسية: http://www.tcl.tk

الرابط التحميل: http://www.tcl.tk/software/tcltk/downloadnow84.tml

1. تنزيل ملف المصدر

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

2. فك الضغط للملف المصدر

tar xfvz tcl8.4.11-src.tar.gz 

3. التثبيت والتكوين

cd tcl8.4.11/unix 
./configure --prefix=/usr/tcl --enable-shared 
make 
make install 

النصيحة:

1. بعد إكمال التثبيت، انتقل إلى مجلد جذور مصدر Tcl، وقم بنسخ ملف tclUnixPort.h من مجلد unix إلى مجلد generic.

2. لا تدع删除 مصدر Tcl، لأن عملية تثبيت expect تحتاج إليها.

(باء)تثبيت expect (يحتاج إلى مكتبة Tcl)

الصفحة الرئيسية: http://expect.nist.gov/

1. تنزيل ملف المصدر

wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 

2. فك الضغط للملف المصدر

tar xzvf expect5.45.tar.gz 

3. التثبيت والتكوين

cd expect5.45 
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic 
make 
make install 
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect 

expect

النواة لـ expect هي spawn، expect، send، set.

spawn لتنفيذ الأمر المطلوب

  • expect ينتظر ظهور رسالة طلب الأمر، أي يلتقط توجيهات المستخدم:
  • send لإرسال القيمة التي تتطلب تفاعل، ويستبدل المحتوى المدخل يدويًا
  • set لتعيين قيمة المتغير
  • يحافظ interact على حالة التفاعل بعد الإكمال، يمنح التحكم لـ console، في هذه الحالة يمكن التدخل يدويًا. إذا لم يكن هناك هذا السطر، فإنه سيتم الخروج بعد الولوج وليس البقاء في terminal عن بعد.
  • يجب إضافة expect eof هذا بالضرورة، ويتناسب مع spawn لاستقبال معلومات输ود النهاية، يشبه if...endif

يجب أن تنتهي سكربت expect بـ interact أو expect eof، عادةً يكفي استخدام expect eof لتنفيذ المهام التلقائية.

إعدادات أخرى

  • إعداد timeout لا يتعاقب أبداً
  • إعداد timeout 300 ثانية، إذا لم يظهر أي محتوى expect بعد 300 ثانية، يتم الخروج

يُكتب لغة expect باستخدام لغة التكليفات

يُستخدم لغة Tcl في expect

  • يُقسم الأمر التكليفي إلى كلمات من خلال الفراغات. حيث يكون الكلمة الأولى اسم الأمر، والكلمات الأخرى هي معلمات الأمر
    cmd arg arg arg
  • يُمثل الرمز "$" قيمة المتغير. في هذا المثال، اسم المتغير هو foo.
    $foo
  • تُستخدم الأقواس المربعة لتنفيذ أمر مضمن. على سبيل المثال، إذا كنت ترغب في نقل نتيجة الأمر إلى الأمر الآخر كمعلمات، فإنك تستخدم هذا الرمز
    [cmd arg]
  • تُستخدم الأقواس المزدوجة لوضع الكلمات في نطاق الأمر. يُفسر رمز "$" وأقواس المربع داخل الأقواس المزدوجة
    "some stuff"
  • تُستخدم الأقواس الكبيرة لوضع الكلمات في نطاق الأمر. ولكن، لا تُفسر الرموز الأخرى داخل الأقواس الكبيرة
    {some stuff}
  • استخدام الرمز المائل للاعتماد على الرموز الخاصة. على سبيل المثال: n يمثل النسخة. يستخدم الرمز المائل أيضًا لإغلاق معاني "$"، الأسلاك، الأقواس المربعة والأقواس الكبيرة

مثال

login.exp مخصص للاتصال عن بُعد، طريقة الاستخدام المُختصرة: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f
##########################################################
# تنفيذ الأوامر عبر SSH
# المعلمات:1.Use_Type [check/execute]
#  2.SSHServerIp
#  3.SSHUser
#  4.SSHPassword
#  5.CommandList [تُفصل الأوامر بفاصلة]
# قيمة العودة:
#  0 نجاح
#  1 عدد المعلمات غير صحيح
#  2 لم يفتح خدمة سرور SSH
#  3 كلمة المرور للمستخدم SSH غير صحيحة
#  4 إزالة الاتصال بسرور SSH بسبب انتهاء الصلاحية
##########################################################
proc usage {} {
 يُحل محل ".*" $::argv0 "" name
 يُرسل المستخدم "استخدام:\n"
 يُرسل المستخدم " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
 يخرج 1
} 
## التحقق من عدد المعلمات
إذا كان [عدد الأدوار $argv] لا يساوي 5 {
 usage
}
# set variable values
set Use_Type [lindex $argv 0]
set SSHServerIp [lindex $argv 1]
set SSHUser [lindex $argv 2]
set SSHPassword [lindex $argv 3]
set CommandList [lindex $argv 4]
#spawn ping ${SSHServerIp} -w 5
#expect {
# -nocase -re "100% packet loss" {
#  send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n"
#  exit 1
# }
#}
set timeout 360
set resssh 0
# define variable to mark whether yes confirmation is entered during ssh connection
set inputYes 0
set ok_string LOGIN_SUCCESS
if {$Use_Type=="check"} {
 # activate ssh connection, if you need to enter yes to confirm, enter yes, set inputYes to 1, otherwise enter ssh password
 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"
} else {   
 spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"
}
expect {
 -nocase -re "yes/no" {
  send -- "yes\n"
  set inputYes 1
 }
 -nocase -re "assword: " {
  send -- "${SSHPassword}\n"
  set resssh 1
 }
 #-nocase -re "Last login: " { 
 #  send -- "${CommandList}\n"
 #}
 $ok_string {}
 -nocase -re "Connection refused" {
  send_error "SSH services at ${SSHServerIp} is not active.\n"
  exit 2
 }
 timeout {
  send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n"
  exit 4
 }
}
# إذا تم إدخال yes للإقرار، أدخل كلمة المرور ssh
if {$inputYes==1} {
 expect {
  -nocase -re "assword: " {
   send -- "${SSHPassword}\n"
   set resssh 1
  }
 }
}
# إذا ظهر رسالة try again أو password:، فإن ذلك يعني أن كلمة المرور المستخدمة غير صحيحة، اخرج مباشرة.
if {$resssh==1} {
 expect {
  -nocase -re "try again" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  -nocase -re "assword:" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  eof {}
 }
}
send_error -- "$expect_out(buffer)"
#-nocase -re "No such user" {
#  send_error "No such user.\n"
#  exit 5
# }
#exit

الإجمال

هذا هو نهاية محتويات هذا المقال، نأمل أن يكون محتويات هذا المقال لهذا الدليل أو العمل ذي قيمة مرجعية، إذا كان لديك أي أسئلة، يمكنك ترك تعليق للتفاعل، شكرًا لدعم دليل النفخ.

بيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات للمالك الأصلي، تم جمع المحتويات من قبل المستخدمين عبر الإنترنت وتم تحميلها بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتويات مشبوهة تتعلق بالحقوق الطبع والنشر، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف المحتويات المشبوهة فورًا.

أنت قد تعجبك