اینکه نتونیم وارد یکسری سایتها مثل developer.google.com ،php.net و یا quora.com بشیم اصلاً مسئله جدیدی نیست و این اواخر هم که تلگرام به لیست بلند بالای ما اضافه شده!
پیش از این در مقالهای تحت عنوان آموزش نصب Cisco OpenConnect VPN روی لینوکس توزیع اوبونتو گفتم که به چه شکل میشه OpenConnect رو روی لینوکس نصب کرد اما هر دفعه که ما بخواهیم این ابزار رو از طریق ترمینال اجرا کنیم، با شرایط زیر روبهرو میشیم:
- وارد کردن نام سرور + اینتر
- تأیید کردن شروع کار ارتباط با تاپپ کلمهٔ yes + اینتر
- وارد کردن یوزرنیم + اینتر
- وارد کردن پسورد + اینتر
به نظر میرسه که تایپ موارد فوق هر دفعه که نیاز به این نرمافزار داشته باشیم چیزی در حدود ۱۵ ثانیه طول بکشه و اگر هم فرض کنیم که ما روزی ۵ بار بخواهیم این پروسه رو تکرار کنیم، در سال چیزی در حدود ۷ الی ۸ روز زمان کاری از دست میدیم!
خب بیخوابی زده بود به سرم و با خود گفتم ببینم میتونم یک Bash Script بنویسم که فقط اون رو اجرا کنم و اون اسکریپت همهٔ این کارها رو بکنه که خوشبختانه تونستم اول بش اسکریپت عمرم رو با موفقیت بنویسم (البته فکر میکنم خیلی اصولی نیست و Best Practice داخلش دخیل نشده اما به هر حال داره کارم رو راه میاندازه و همین کافی هست.)
نصب ابزار expect
برای این منظور، نیاز به نصب برنامهای داریم تحت عنوان expect که همانطور که از نامش پیداست، ما به این برنامه دستور میدهیم که «به دنبال چیزی گشته» سپس وقتی که آن را پیدا کرد، تَسک مد نظر ما را انجام میده. برای نصب expect داریم:
$ sudo apt-get install expect
چنانچه کانکشن اینترنت قطع نشه و مشکل خاصی پیش نیاد، این ابزار خیلی ساده روی سیستم نصب میشه.
حال فایلی در یک مسیر دلخواه (مثلاً روی دکستاپ) میسازیم تحت عنوان vpn.sh که این نام کاملاً دلخواه هست و داخلش کدهای زیر رو مینویسیم:
#!/bin/bash
openconnect servername.com
echo "Enter 'yes' to accept, 'no' to abort; anything else to view:"
echo "Usrename:"
echo "Password:"
خط اول که مسیر مفسر بَش رو تعیین کرده سپس کامندی که مرتبط با اجزای ویپیان هست رو مینویسیم و در نهایت هم در سه خط مختلف، عباراتی که پس از اجرای کامند openconnect servername.com در معرض دید ما قرار میگیره رو مینویسیم (آدرس servername.com باید با IP سرویس ویپیان شما جایگزین شود.) از این پس با این فایل دیگری کاری نداریم اما باید اول قابلاجرا بکنیمش که برای این منظور هم کامند زیر رو اجرا میکنیم:
$ chmod +x vpn.sh
حال میرسیم به اصل موضوع که ساخت فایل دیگری است با نامی دلخواه همچون expect.sh که قرار هست ابزار expect که پیش از این نصب کردیم رو فعال کنه. برای این منظور داریم:
#!/usr/bin/expect
spawn ./vpn.sh
expect -exact "Enter 'yes' to accept, 'no' to abort; anything else to view:\r"
send -- "yes\r"
expect -exact "Usrename:"
send -- "MY_USERNAME\r"
expect -exact "Password:"
send -- "MY_PASSWORD\r"
expect eof
sleep 1000000
در خط اول فایل قبلی مسیر مفسر bash که به صورت پیش فرض روی اوبونتو نصب هست رو دادیم اما از آنجا که قصد داریم این فایل توسط ابزار expect تفسیر بشه، در خط اول مسیر این فایل رو میدهیم.
البته توجه داشته باشید که بسته به تنظیمات سیستم، پس از نصب هر ابزاری، شاید مسیر متفاوتی انتخاب بشه. در همین راستا، با استفاده از دستور زیر در ترمینال میتونید ببنید که این ابزار در کجا نصب شده است:
$ whereis expect
expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
حال در خط بعد، ابتدا کلیدواژهٔ spawn رو نوشته سپس نام فایل قبلی رو پس از علامت /. مینویسیم. در ادامه، همانطور که مشاهده میکنید سه بار از ساختار زیر استفاده کردهایم:
expect -exact "XXX"
send -- "XXX"
که دستور r\ هم به معنی New Line هست. در نهایت هم دستور expect eof رو نوشتهایم که eof مخفف end of file هست که نقطهٔ پایانی اسکریپت رو نشون میده (MY_USERNAME و MY_PASSWORD هم باید با نام کاربری و رمزعبوری که در اختیار دارید جایگزین شود.) اما اگر خط آخر یعنی sleep به علاوه یک عددی رو ننویسیم، ابزار ویپیان ما به درستی اجرا میشه اما خیلی سریع از برنامه خارج میشیم لذا دستور داده ایم که برنامه قبل از اینکه خارج شود، به مدت 1000000 ثانیه بخوابد!
حال مجدد همچون گذشته، این فایل را هم به اصطلاح executable (قابلاجرا) میکنیم:
$ chmod +x expect.sh
حال ممکنه این سوال پیش بیاد که دستورات expect -exact و send چهکار میکنند. در حقیقت، دستور expect -exact میرود و میگردد ببنید که در فایل قبلی آیا چنین Promptیی وجود داشته که نرمافزار از ما خواسته باشد، اگر بود استرینگ مقابل send اجرا میشود که به همین شکل میتوانیم کلمهٔ yes به علاوه یوزرنیم و پسورد را به صورت خودکار وارد برنامه کنیم و در سال چیزی در حدود ۷ الی ۸ روز زمان سیو کنیم (راستی دکستاپ درست نیست بلکه بگیم دسکتاپ!)