لاگین اتوماتیک به ماشین‌های راه دور

وقتی به طور مرتب با ماشین‌های راه دور کار می‌کنیم، وارد کردن اسم کاربری و پسورد تبدیل به یه پروسه حوصله سربر می‌شه. واسه همین بهتره راه حلی پیدا کنیم که مشکل لاگین رو حل کنه.
لاگین اتوماتیک به ماشین‌های راه دور دو تا روش اصلی داره:
روش اول: استفاده از فایل ‪.netrc‬
خیلی از برنامه‌هایی که با ماشین‌های راه دور کار می‌کنند می‌تونند از فایل ‪.netrc‬‬ استفاده کنند. در واقع می‌شه یوزر و پسورد برای هر ماشین رو تو این فایل ذخیره کرد تا برنامه‌های دیگه ازش استفده کنند. فرمت این فایل به این شکله:

[bash]
machine github.com
login technoweenie
password SECRET

machine api.github.com
login technoweenie
password SECRET
[/bash]

فکر کنم به قدر کافی واضحه.

نکته مهم این که این روش برای هر پروتکلی که با OpenSSH کار می‌کنه (مثل ssh، scp و sftp) کار نمی‌کنه.
روش دوم: استفاده از کلیدهای ssh
برای استثناهای حالت قبل می‌شه به راحتی از کلیدهای ssh استفاده کرد.
مراحل کار:
اول جفت کلیدهای نامتقارنمون رو می‌سازیم: (یک بار برای همیشه)
[bash]
ssh-keygen
[/bash]
چند تا سوال تو این مرحله پرسیده می‌شه که همش رو مقادیر پیش‌فرض رو قبول می‌کنیم.
تو مرحله بعد کلید عمومی به کامپوتر مقصد کپی می‌شه:
[bash]
ssh-copy-id user@example.com
[/bash]

به همین راحتی.

یه نکته درباره git: وقتی داریم از git استفاده می‌کنیم باید دقت کنیم که داریم از کدوم پروتکل استفاده می‌کنیم. برای پروتکل https راه حل اول و برای پروتکل ssh راه دوم باید استفاده بشه.

من و راسبری-پی و دانلودهای شبانه

یه دونه راسبری پی خریدم که تو خونه گذاشتم و باهاش عشق دنیا رو می‌کنم. چند وقتی بود که می‌خواستم مثل این یادداشت بیت نیم‌سوز یه مدیر دانلود روش راه بندازم. چیزی که هدفم بود این بود که (۱) خیلی راحت بتونم فایل‌هام رو به لیست دانلودهام اضافه کنم (۲) دانلود خیلی اتوماتیک و تمیز انجام بشه.

ساختن لیست دانلودها
تو یه پوشه از هاستم یه اسکرپت کوچیک php گذاشتم که هر چی براش بفرستم، به آخر یه فایل تکست اضافه می‌کنه. به این ترتیب هر جا که باشم، لینکایی که می‌خوام دانلود شن رو خیلی تمیز برای این اسکریپت می‌فرستم و و این اسکریپت برام لیست دانلودهام رو می‌سازه. مثلا:
[html]
http://melmi.ir/downloads/append.php?link_to_download_file
[/html]
من php بلد نیستم، واسه همین هم اصل اسکریپت رو از این‌جا برداشتم و یه کم تغییرش دادم. این هم اسکریپت تغییر پیدا کرده:

البته برای اینکه هر کسی نتونه به این فایل چیزی اضافه کنه، رو فولدر این اسکرپت پسورد گذاشتم. نتیجتا برای دسترسی به این اسکرپت، یه همچین چیزی لازمه:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?link_to_download_file
[/html]
امن‌ترین روش توی دنیا نیست، اما برای من کافیه.

تو مرحله بعد برای اینکه تنبلی رو به اوجش برسونم، دنبال یه افزونه گشتم که از تو کروم با یه کلیک مستقیما بتونم لینکم رو به این ارسال کنم. با یه کم گشتن افزونه خیلی خوب Context Menus رو پیدا کردم که اجازه می‌ده به راحتی برای کانتکست منوی کروم، آیتم‌های اضافه با اسکرپت‌های سفارشی تعریف کنیم. من البته کار خاصی نداشتم و فقط همون دستور بالا رو با یه کم تغییر به قسمت Custom از منوی LinkMenu اضافه کردم:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?%s
[/html]
و تمام. حالا می‌تونم با یه کلیک از هر جای دنیا لینک دانلود فایلی که می‌خوام رو تو سایتم ثبت کنم.

انجام دانلود
نظم دادن به خود دانلود دردسر زیادی نداره. باید یه اسکرپت داشته باشم که تو یه فاصله زمانی مشخص دانلودهام رو انجام بده.
تو اسکریپت اول از هم می‌رم به فولدر دانلودها و فایل dllist.txt رو (بعد از پاک کردن فایل قبلی) از سرور می‌گیرم:
[bash]
cd ~/Downloads/auto/
rm dllist.txt
wget –user=folani –password=passwordesh melmi.ir/downloads/dllist.txt
[/bash]
برای استفاده از این فایل به دو تا فایل دیگه هم احتیاج دارم. یه فایل به اسم done.txt که لیست فایلایی رو نگه می‌داره که دانلودشون تکمیل شده، و یه فایل به اسم active.txt که لیست فایلایی هست که هنوز دانلودشون انجام یا کامل نشده. بعد از دانلود فایل dllist.txt، اولین کار اینه که ازش فایل done.txt رو فریق کنم تا فایل active.txt تشکیل بشه:
[bash]
comm dllist.txt done.txt -23 –nocheck-order > active.txt
[/bash]
دستور comm تفریق رو انجام می‌ده. معنی پارامترهاش رو هم می‌شه راحت تو منوال‌هاش دید.
مرحله بعد اینه که یه حلقه بنویسم که تا وقتی فایل active.txt خالی نشده، فایلای اون تو رو یکی یکی (۱) دانلود کنه (۲) بعد از اینکه دانلودشون تموم شد، بذاره تو done.txt و (۳) فایل دانلود شده رو از active.txt خارج کنه:
[bash]
while [ -s active.txt ]
do
head -n 1 active.txt | sed -e’s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g’ | xargs echo -e | xargs -I {} wget -c “{}”
head -n 1 active.txt >> done.txt
tail -n +2 active.txt > tmp.txt
mv tmp.txt active.txt
done
[/bash]
فقط خط اول حلقه یه کم توضیح می‌خواد. لینک‌ها تو فایل لینکای من به شکل کدبندی درصدی می‌یاد. از طرف دیگه wget میونش زیاد با این فرمت کدبندی درصدی خوب نیست و ممکنه اسم فایلا رو به هم بریزه. برای همین با استفاده از بخش sed و echo اون پایپ‌لاین لینک‌ها رو به شکل اول برمی‌گردونم. (راستش این مشکل رو با پرسیدن سوال حل کردم.)
و نهایتا اسکریپت ما این شکلی خواهد بود:

والبته یادم نمی‌ره که مجوز اجرایی هم بهش بدم.
[bash]
sudo chmod +x dl.sh
[/bash]

خوب برای اجرای این اسکریپت به شکل منظم یه cron احتیاج دارم که البته کار باهاش رو قبلا این‌جا تجربه کرده بودم. اینا هم دستورایی هستن که تو cron می‌ذارم. به این ترتیب اسکریپت عزیز دانلودها رو ساعت یک شب شروع و ساعت ۹ صبح قطع می‌کنه. فکر کنم واضح باشن:
[bash]
۰ ۱ * * * /home/pi/Downloads/auto/dl.sh
۰ ۹ * * * kill $(pgrep dl.sh)
۰ ۹ * * * killall wget
[/bash]

والسلام. دو تا نکته. اول این که برای این کار حتی یه برنامه اضافه هم تو rpi نصب نکردم و فقط با ابزارای ساده لینوکس و وصل کردن اون‌ها به هم کل این سیستم رو راه انداختم. نکته دیگه اینکه این ویندوزیا با همه دانلود منیجرای غول تشنشون نمی‌تونن به سادگی یه همچین سیستمی راه بندازن.

آپدیت: اسکریپت‌ها به گیست اضافه شد و از آنجا در متن قرار گرفت.

چرا گنو/لینوکس رو دوست دارم؟ چون خط فرمانش یه ابزار کامله

جریان اینه که می‌خوام آی پی خارجی شبکه رو داشته باشم. یه راه حل پرسش از سایتای خارج از شبکست. اما روتر شبکه هم حتما این اطلاعات رو داره. مساله فقط اینه که بتونم استخراجش کنم.

خوب آی پی شبکه رو میشه از روی صفحه روتر دید. این آدرس اون صفحست: ۱۹۲.۱۶۸.۱.۲۵۴/status/status_deviceinfo.htm و برای رفتن به اون صفحه هم یوزر (admin) پسورد (۱۲۳۴) می‌خواد. حالا باید یه جوری به خط فرمان بگم که این صفحه رو بخونه. برای این کار از دستور curl استفاده می‌کنم:
[bash]
curl -s admin:1234@192.168.1.254/status/status_deviceinfo.htm
[/bash]
سوییچ s می‌گه مرراحل دریافت نشون داده نشه. خروجی این دستور یه سری کد html اه. بعد باید تو خروجی دنبال IP Address بگردم. چون خود آی پی تو خط بعد از خطی که کلمه IP Address توشه، با سوییچ A1 می‌م هر جا این بود، خط بعدیش رو هم نمایش بده. تا حالا دستورمون این شده:
[bash]
curl -s admin:1234@192.168.1.254/status/status_deviceinfo.htm | grep ‘IP Address’ -A1
[/bash]
توی خروجی، آی پی تو خط آخره، پس باید خط آخر رو بکشم بیرون:
[bash]
curl -s admin:1234@192.168.1.254/status/status_deviceinfo.htm | grep ‘IP Address’ -A1
| tail -n1
[/bash]
حالا یه خط دارم که آی پی توشه، کد html هم توشه. کد html از کاراکتر > شروع می‌شه. با دستور کات می‌گم رشته ورودی رو با اون کاراکتر بشکون و فیلد اول رو برگردون:
[bash]
curl -s admin:1234@192.168.1.254/status/status_deviceinfo.htm | grep ‘IP Address’ -A1
| tail -n1 | cut -d’<' -f1 [/bash] والسلام. آی پیم رو دارم. با این که از قبل کلا می‌دونستم این دستورا هستن، بازم اونا رو با سرچ و سعی و خطا کنار هم چیدم. ولی کل فرایند ۱۰ دقیقه بیشتر ازم وقت نگرفت.