رفتن به محتوا

آزمون بخش ۲: شبکه و وب

این آزمون درس‌های بخش دوم را می‌سنجد: شبکه و آدرس IP، پورت، پروتکل و بسته‌ها، DNS، کلاینت و سرور، وب و HTTP، رمز عبور، هش و رمزنگاری، HTTPS و گواهی و سرور، دیتاسنتر و ابر. بعد از هر پاسخ، جواب درست و توضیح نشان داده می‌شود. نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

آزمون بخش ۲
  1. همکارت می‌گوید «سرور روی 192.168.1.50 است» و تو از خانه نمی‌توانی وصل شوی. محتمل‌ترین علت؟

  2. در 10.20.5.7/24 چند آدرس در همان شبکه است؟

  3. ping 192.168.1.1 (روتر) جواب می‌دهد، ping 8.8.8.8 جواب می‌دهد، ولی هیچ سایتی باز نمی‌شود. اول چه چیزی را بررسی می‌کنی؟

  4. nc -zv server 5432 جواب «Connection refused» داد. یعنی…

  5. کدام برای تماس تصویری زنده مناسب‌تر است؟

  6. IP سایت را در پنل دامنه عوض کردی. تو سایت جدید را می‌بینی ولی همکارت هنوز قدیمی را. چرا؟

  7. در /etc/hosts خط «127.0.0.1 shop.test» هست. dig +short shop.test چه می‌دهد؟

  8. python3 -m http.server 8000 در یک پوشه اجرا شده و از گوشی در همان Wi-Fi باز می‌شود. اگر با --bind 127.0.0.1 اجرا شود چه؟

  9. پاسخ «HTTP/1.1 502 Bad Gateway» از nginx یعنی…

  10. کدام بخش URL زیر هرگز به سرور فرستاده نمی‌شود؟ https://shop.ir/p/42?color=red#reviews

  11. سایتی کوکی «role=user» می‌گذارد و اگر «role=admin» بیاید، پنل مدیریت را نشان می‌دهد. مشکل چیست؟

  12. چرا برای ذخیره‌ی رمز عبور SHA-256 ساده کافی نیست؟

  13. در فایل تنظیمات یک برنامه «password: UzNjdXJlLVBhc3M=» دیدی. درباره‌اش چه می‌گویی؟

  14. مرورگر برای https://www.shop.ir خطای «certificate is not valid for this name» می‌دهد ولی https://shop.ir درست است. چه کنی؟

  15. یک سایت فیشینگ با آدرس شبیه بانک، قفل HTTPS معتبر دارد. چه نتیجه‌ای می‌گیری؟

  16. می‌خواهی یک ربات تلگرام پایتونی را همیشه روشن نگه داری. کدام میزبانی؟

🏁 چالش: بررسی‌کننده‌ی سایت‌هامتوسط

یک اسکریپت check-sites.sh بنویس که یک فایل از آدرس‌ها (هر خط یک آدرس) بگیرد و برای هر آدرس این‌ها را در یک خط چاپ کند: وضعیت (ok، ERROR برای کد ۴۰۰ به بالا، DOWN وقتی اصلاً جوابی نیامد)، کد HTTP، زمان کل و خود آدرس. در آخر تعداد مشکل‌ها را بگوید و اگر مشکلی بود با کد غیر صفر خارج شود. با سرور python3 -m http.server 8000 در ~/site (درس کلاینت و سرور) و یک پورت خاموش امتحانش کن.

راهنمایی

curl -s -o /dev/null -m 5 -w "%{http_code} %{time_total}" URL کد و زمان را می‌دهد؛ اگر وصل نشود، کد 000 است. با while read -r url; do ... done < file فایل را خط به خط بخوان. ${result%% *} تکه‌ی قبل از اولین فاصله و ${result##* } تکه‌ی بعد از آخرین فاصله را می‌دهد.

راه‌حل
check-sites.sh
#!/usr/bin/env bash
# check-sites.sh: کد وضعیت و زمان هر آدرس در یک فایل
problems=0
while read -r url; do
[ -z "$url" ] && continue
result=$(curl -s -o /dev/null -m 5 -w "%{http_code} %{time_total}" "$url")
code=${result%% *}
time=${result##* }
if [ "$code" = "000" ]; then
status="DOWN"
elif [ "$code" -ge 400 ]; then
status="ERROR"
else
status="ok"
fi
[ "$status" = "ok" ] || problems=$((problems + 1))
printf "%-6s %s %ss %s\n" "$status" "$code" "$time" "$url"
done < "${1:-urls.txt}"
echo "problems: $problems"
[ "$problems" -eq 0 ]
urls.txt
http://localhost:8000/
http://localhost:8000/notes.txt
http://localhost:8000/missing.html
http://localhost:8000/images
http://localhost:8001/
Terminal window
chmod +x check-sites.sh
./check-sites.sh urls.txt; echo "exit=$?"
خروجی
ok 200 0.003883s http://localhost:8000/
ok 200 0.000969s http://localhost:8000/notes.txt
ERROR 404 0.000862s http://localhost:8000/missing.html
ok 301 0.000735s http://localhost:8000/images
DOWN 000 0.000086s http://localhost:8001/
problems: 2
exit=1

ریدایرکت 301 را مشکل حساب نکردیم (کمتر از ۴۰۰)؛ اگر بخواهی مقصد نهایی را بسنجی، -L به curl اضافه کن. 000 یعنی curl اصلاً پاسخ HTTP نگرفت (این‌جا Connection refused؛ ممکن بود DNS یا timeout باشد). خط آخر ([ "$problems" -eq 0 ]) کد خروج اسکریپت را تعیین می‌کند تا cron یا اسکریپت دیگر بفهمد چیزی خراب است. همین اسکریپت، با cron (دوره‌ی لینوکس)، یک «مانیتورینگ» ساده و واقعی است.