My folder vip
76 subscribers
202 photos
82 videos
622 files
499 links
آرشیو یادگیری هک/امنیت

اینجا فولدر شخصی من برای یادگیری و ثبت مطالب Linux، Networking و Cyber Security است.

🔐 LPIC | Network+ | CEH | SANS
🐧 Linux & System Administration
🌐 Networking & Troubleshooting
💻 Python & Security Tools
🧪 Labs | CTF | Prac
Download Telegram
My folder vip
فصل هشتم - قسمت هفتاد و سوم 🐧 شبکه در لینوکس ——————— در فصل با قسمت های زیر اشنا میشویم 1 : آشنایی اولیه باشبکه 2 : تنظیم شبکه در لینوکس 3 : فرمان های اولیه در عیب یابی شبکه 4 : پیکربندی dns در لینوکس
فصل هشتم - قسمت هفتاد و چهارم 🐧
1 : آشنایی اولیه باشبکه
———————
هدف اصلی شبکه خیلی ساده است:
انتقال اطلاعات از یک دستگاه به دستگاه دیگر.

مثلاً وقتی در کامپیوترت می‌زنی:
google.com

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


——————-

1️⃣ چرا شبکه لایه‌ای طراحی شده؟
برای اینکه هر قسمت از ارتباط یک وظیفه مشخص داشته باشد.
مدل معروف:
OSI
دارای ۷ لایه است:
7. Application
6. Presentation
5. Session
4. Transport
3. Network
2. Data Link
1. Physical

در مقابل، مدل TCP/IP معمولاً به ۴ لایه تقسیم می‌شود:
Application
Transport
Internet
Network Access

📌 برای LPIC بیشتر باید مفهوم TCP/IP و وظایف لایه‌ها را بفهمی.


————————

2️⃣ هدر چیست؟
یکی از مهم‌ترین مفاهیم این قسمت همین است.
وقتی برنامه‌ای می‌خواهد اطلاعات بفرستد، داده در مسیر عبور از لایه‌ها، اطلاعات کنترلی دریافت می‌کند.
مثلاً:
Application
↓
Data
↓
Transport
↓
TCP Header + Data
↓
Network
↓
IP Header + TCP Header + Data
↓
Data Link
↓
Ethernet Header + IP Header + TCP Header + Data

به این اطلاعات اضافه‌شده در هر لایه، Header می‌گوییم.


————————

3️⃣ یک مثال واقعی؛ باز کردن Google
فرض کن در مرورگر می‌نویسی:
https://google.com

مرورگر اطلاعات را ایجاد می‌کند.
در لایه Application:
HTTP/HTTPS Data

سپس در Transport مثلاً TCP قرار می‌گیرد:
TCP Header
+
Application Data

بعد در Network:
IP Header
+
TCP Header
+
Application Data

بعد در Data Link:
Ethernet Header
+
IP Header
+
TCP Header
+
Application Data

و در نهایت اطلاعات به صورت Frame/Bits روی شبکه ارسال می‌شوند.
در سمت مقصد این فرآیند برعکس می‌شود و Headerهای مربوط به هر لایه بررسی و کنار گذاشته می‌شوند تا برنامه بتواند داده اصلی را دریافت کند.

————————

4️⃣ لایه Network
یکی از وظایف اصلی این لایه، انتقال Packet بین شبکه‌های مختلف است.
مهم‌ترین پروتکل این لایه:
IP

است.
IP به دستگاه‌ها آدرس می‌دهد و کمک می‌کند Packet بداند باید به کدام مقصد برود.


————

5️⃣ IPv4 و IPv6
دو نسخه اصلی IP داریم:
IPv4
مثلاً:
192.168.1.20

IPv4 دارای آدرس ۳۲ بیتی است.
IPv6
مثلاً:
2001:db8::1

IPv6 دارای آدرس ۱۲۸ بیتی است.
پس:
IPv4 → 32 bit
IPv6 → 128 bit


—————

6️⃣ Netmask چیست؟
Netmask مشخص می‌کند کدام قسمت IP مربوط به Network و کدام قسمت مربوط به Host است.
مثلاً:
IP:
192.168.1.20

Netmask:
255.255.255.0

یا به شکل CIDR:
192.168.1.20/24

در این مثال:
Network → 192.168.1
Host → 20

یعنی دستگاه 20 در شبکه 192.168.1.0/24 قرار دارد.
🧠 خیلی ساده:
Netmask مرز بین Network و Host را مشخص می‌کند.


——————

7️⃣ لایه Transport
این لایه وظیفه ارتباط بین برنامه‌ها و کنترل انتقال داده را بر عهده دارد.
دو پروتکل اصلی:
TCP
UDP

TCP
قابل‌اعتماد است.
ویژگی‌های مهم:
Connection-oriented
ترتیب داده‌ها را حفظ می‌کند
دریافت داده را تأیید می‌کند
در صورت نیاز داده را مجدداً ارسال می‌کند
مثلاً:
Client ───────→ Server
Data 1
Data 2
Data 3

اگر Data 2 گم شود، TCP می‌تواند آن را مجدداً درخواست/ارسال کند.


UDP
ساده‌تر و سریع‌تر است و تضمین تحویل مانند TCP ندارد.
مثلاً:
Client ───────→ Server
Data 1
Data 2
Data 3

اگر Data 2 از بین برود، UDP خودش تضمین نمی‌کند که آن را دوباره ارسال کند.
کاربردهای رایج:
DNS
VoIP
Streaming
Online Gaming

البته بعضی برنامه‌های
———————

8️⃣ Port چیست؟
IP مشخص می‌کند:
کدام دستگاه؟

Port مشخص می‌کند:
کدام سرویس/برنامه؟

مثلاً:
192.168.1.20:22

یعنی:
IP   → 192.168.1.20
Port → 22

پورت 22 معمولاً برای SSH استفاده می‌شود.



———————

9️⃣ Application Layer
اینجا جایی است که سرویس‌ها و پروتکل‌هایی که برنامه‌ها مستقیماً با آن‌ها کار می‌کنند قرار دارند.
مثلاً:
HTTP
HTTPS
DNS
DHCP
SSH
FTP
SMTP

ساختار کلی معمولاً به شکل Client/Server است:
Client
│
│ Request
↓
Server
│
│ Response
↓
Client



————————

🔟 DNS چیست؟
DNS یعنی:
Domain Name System
کارش تبدیل نام دامنه به IP است.
مثلاً:
google.com
↓
DNS
↓
IP Address

چرا؟
چون برای انسان راحت‌تر است بگوید:
google.com

تا اینکه یک IP را حفظ کند.


———————-

1️⃣1️⃣ DNS در عمل چه اتفاقی می‌اندازد؟
فرض کن مرورگر می‌خواهد به:
google.com

وصل شود.
ابتدا سیستم باید IP آن را پیدا کند.
تقریباً:
Browser
↓
DNS Resolver
↓
DNS Server
↓
IP Address
↓
Connection to Server

مثلاً نتیجه DNS می‌تواند یک یا چند IP باشد.
بعد مرورگر با IP مقصد ارتباط برقرار می‌کند.
📌 نکته مهم:
DNS خودش ارتباط HTTP را انجام نمی‌دهد؛ فقط نام را به آدرس تبدیل/Resolve می‌کند.





——————-

1️⃣2️⃣ DHCP چیست؟
DHCP مخفف:
Dynamic Host Configuration Protocol
است.
وظیفه DHCP این است که تنظیمات شبکه را به‌صورت خودکار به Client بدهد.
مثلاً کامپیوتر تازه وارد شبکه می‌شود و هنوز IP ندارد.
DHCP می‌تواند به آن بدهد:
IP Address
Subnet Mask
Default Gateway
DNS Server

————————
1️⃣3️⃣ روند DHCP
چهار مرحله معروف DHCP را حفظ کن:
DORA

D → Discover
Client می‌گوید:
آیا DHCP Serverای در شبکه هست؟

O → Offer
DHCP Server پیشنهاد IP می‌دهد.
R → Request
Client می‌گوید:
این IP را می‌خواهم.

A → Acknowledge
Server تأیید می‌کند:
این IP برای تو ثبت شد.

پس:
Discover
↓
Offer
↓
Request
↓
ACK

🧠 DORA را برای امتحان حتماً حفظ کن.




—————————

| سرویس        |   پورت پیش‌فرض   |
| ------------ | ----------------: |
| FTP Control | 21/TCP |
| FTP Data – Active | 20/TCP |
| SSH | 22/TCP |
| Telnet | 23/TCP |
| SMTP | 25/TCP |
| DNS | 53/TCP/UDP |
| DHCP Server | 67/UDP |
| DHCP Client | 68/UDP |
| HTTP | 80/TCP |
| POP3 | 110/TCP |
| NTP | 123/UDP |
| IMAP | 143/TCP |
| HTTPS | 443/TCP |
| SMB | 445/TCP |




📌 چند مورد مهم‌تر برای LPIC:
22  → SSH
25 → SMTP
53 → DNS
67 → DHCP Server
68 → DHCP Client
80 → HTTP
123 → NTP
443 → HTTPS
My folder vip
فصل هشتم - قسمت هفتاد و سوم 🐧 شبکه در لینوکس ——————— در فصل با قسمت های زیر اشنا میشویم 1 : آشنایی اولیه باشبکه 2 : تنظیم شبکه در لینوکس 3 : فرمان های اولیه در عیب یابی شبکه 4 : پیکربندی dns در لینوکس
فصل هشتم - قسمت هفتاد و پنجم 🐧
2 : تنظیم شبکه در لینوکس
———————
اینجا می‌خواهیم یاد بگیریم تنظیمات شبکه در Linux کجا قرار دارند و امروزه چطور آن‌ها را مدیریت می‌کنیم.
نکته مهم این قسمت:
در Linuxهای جدید، NetworkManager نقش اصلی را در مدیریت شبکه دارد.

——————————-

1️⃣ قبلاً تنظیمات شبکه کجا بودند؟
بسته به Distribution فرق داشت.
🔴 Red Hat / CentOS قدیمی
در سیستم‌های قدیمی‌تر فایل‌های Interface معمولاً در:
/etc/sysconfig/network-scripts/

بودند.
مثلاً:
/etc/sysconfig/network-scripts/ifcfg-eth0

داخلش تنظیماتی مثل IP، Gateway و نوع دریافت IP قرار می‌گرفت.
مثلاً:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

——————-
🔵 Debian / Ubuntu قدیمی
در Debian و Ubuntu قدیمی معمولاً:
/etc/network/interfaces

استفاده می‌شد.
مثلاً:
auto eth0
iface eth0 inet static
address 192.168.1.20
netmask 255.255.255.0
gateway 192.168.1.1




————-
🟢 openSUSE
در openSUSE هم روش‌های مخصوص خودش وجود داشته، اما در نسخه‌های جدیدتر مدیریت شبکه بیشتر به NetworkManager منتقل شده است.


—————

2️⃣ امروزه چه چیزی مهم است؟
امروزه در بسیاری از Distributionهای Desktop و Server:
NetworkManager
↓
مدیریت Network Interface
↓
IP / Gateway / DNS / Connection

ابزار اصلی خط فرمان آن:
nmcli

است.


——————
3️⃣ NetworkManager چیست؟
NetworkManager یک سرویس برای مدیریت اتصال‌های شبکه است.
می‌تواند مواردی مثل:
Ethernet
Wi-Fi
IP
Gateway
DNS
VPN
Connection Profiles
را مدیریت کند.
پس این دو را قاطی نکن:
NetworkManager
→ سرویس مدیریت شبکه

nmcli
→ ابزار Command Line برای کنترل NetworkManager





—————


4️⃣ nmcli
اول وضعیت کلی NetworkManager:
nmcli general status

مثلاً:
STATE      CONNECTIVITY  WIFI-HW  WIFI  WWAN-HW  WWAN
connected full enabled ... enabled ...

یعنی NetworkManager فعال است و سیستم اتصال شبکه دارد.

——————————


5️⃣ نمایش Connectionها
nmcli connection show

این دستور تمام Connection Profileها را نشان می‌دهد.
مثلاً:
NAME    UUID                                  TYPE      DEVICE
eth0 xxxx-xxxx-xxxx-xxxx ethernet eth0



————————-

6️⃣ فقط Connectionهای فعال
دستوری که خودت نوشتی:
nmcli connection show --active

یا کوتاه‌تر:
nmcli con show --active

فقط اتصال‌های فعال را نمایش می‌دهد.


——————————

7️⃣ بالا آوردن Connection
مثلاً:
nmcli connection up eth0

یعنی Connection مربوط به eth0 را فعال کن.
پایین آوردن:
nmcli connection down eth0


—————————-

8️⃣ تغییر IP
اینجا یکی از قسمت‌های مهم nmcli است.
فرض کنیم Connection ما اسمش eth0 است.
می‌خواهیم IP را:
192.168.1.20/24

قرار دهیم.
sudo nmcli connection modify eth0 ipv4.addresses 192.168.1.20/24

Gateway:
sudo nmcli connection modify eth0 ipv4.gateway 192.168.1.1

DNS:
sudo nmcli connection modify eth0 ipv4.dns "8.8.8.8"

و مشخص می‌کنیم IP به صورت دستی تنظیم شود:
sudo nmcli connection modify eth0 ipv4.method manual

بعد Connection را دوباره فعال می‌کنیم:
sudo nmcli connection down eth0
sudo nmcli connection up eth0



—————————

9️⃣ DHCP با nmcli
اگر بخواهیم IP را DHCP بگیریم:
sudo nmcli connection modify eth0 ipv4.method auto

بعد:
sudo nmcli connection down eth0
sudo nmcli connection up eth0

حالا DHCP Server برای سیستم IP می‌فرستد.


———————-

🔟 یک مثال واقعی
فرض کن سرور Linux داری.
می‌خواهی:
IP      → 192.168.1.50/24
Gateway → 192.168.1.1
DNS → 8.8.8.8

تنظیم کنیم:
sudo nmcli con mod eth0 ipv4.addresses 192.168.1.50/24
sudo nmcli con mod eth0 ipv4.gateway 192.168.1.1
sudo nmcli con mod eth0 ipv4.dns 8.8.8.8
sudo nmcli con mod eth0 ipv4.method manual

بعد:
sudo nmcli con down eth0
sudo nmcli con up eth0

بررسی:
ip addr
ip route
nmcli connection show




—————————


1️⃣1️⃣ nmtui
یک ابزار جالب دیگر:
nmtui

برخلاف nmcli که Command Line است، nmtui یک رابط متنی تعاملی دارد.
یعنی داخل Terminal یک محیط منویی می‌بینی.
مثلاً:
┌───────────────────────────┐
│ NetworkManager TUI │
│ │
│ Edit a connection │
│ Activate a connection │
│ Set system hostname │
└───────────────────────────┘

برای کسی که نمی‌خواهد تمام Syntaxهای nmcli را حفظ کند، خیلی راحت است.



——————-

1️⃣2️⃣ وضعیت NetworkManager
سرویس:
systemctl status NetworkManager

ری‌استارت:
sudo systemctl restart NetworkManager

⚠️ چیزی که نوشتی:
systemctl restart networkmanager

ممکن است روی بعضی سیستم‌ها به خاطر نام Unit کار کند، اما نام استاندارد سرویس در سیستم‌های مبتنی بر NetworkManager معمولاً:
NetworkManager

است.


———————-

1️⃣3️⃣ /etc/resolv.conf
قبلاً خیلی وقت‌ها مستقیماً:
/etc/resolv.conf

را برای DNS تغییر می‌دادند.
مثلاً:
nameserver 8.8.8.8

اما در سیستم‌های جدید، این فایل ممکن است توسط یکی از سرویس‌های مدیریت شبکه مثل:
NetworkManager
systemd-resolved

مدیریت شود.
بنابراین ممکن است تغییر دستی آن دائمی نباشد.
📌 برای تنظیم DNS بهتر است از ابزار مدیریت شبکه خود سیستم استفاده کنی.
مثلاً با NetworkManager:
nmcli con mod eth0 ipv4.dns 8.8.8.8




—————————

1️⃣4️⃣ mtr چیست؟
mtr یکی از ابزارهای بسیار خوب برای Network Troubleshooting است.
ترکیبی از ایده‌های:
ping + traceroute

است.
مثلاً:
mtr google.com

مسیر Packet را نمایش می‌دهد و همزمان اطلاعاتی درباره Latency و Packet Loss هر Hop می‌دهد.
مثلاً:
HOST              Loss%   Snt   Last   Avg
192.168.1.1 0.0% 20 1ms 1ms
10.x.x.x 0.0% 20 5ms 5ms
...
google.com 0.0% 20 30ms 31ms

برای پیدا کردن مشکلات مسیر شبکه خیلی کاربردی است.





—————————

1️⃣5️⃣ dhclient چی شد؟
dhclient یک DHCP Client قدیمی و معروف بود.
مثلاً قبلاً ممکن بود ببینی:
dhclient eth0

برای گرفتن IP از DHCP.
اما نکته‌ای که گفتی را این‌طور حفظ کن:
در بسیاری از سیستم‌های جدید که NetworkManager مدیریت شبکه را بر عهده دارد، معمولاً نیازی نیست مستقیماً

dhclient
را اجرا کنیم.

NetworkManager خودش DHCP را مدیریت می‌کند.
مثلاً:
nmcli con mod eth0 ipv4.method auto
nmcli con up eth0


————————

1️⃣6️⃣ Desktop Linux چطور؟
در Desktop معمولاً اصلاً لازم نیست Terminal باز کنی.
مثلاً در GNOME:
Settings
↓
Network
↓
Wired / Wi-Fi
↓
IPv4
↓
Automatic / Manual

و می‌توانی IP، Gateway و DNS را از رابط گرافیکی تنظیم کنی.
در KDE هم تنظیمات شبکه از رابط گرافیکی خودش انجام می‌شود.
اما پشت صحنه، در بسیاری از سیستم‌ها NetworkManager مدیریت اتصال را انجام می‌دهد.
My folder vip
فصل هشتم - قسمت هفتاد و سوم 🐧 شبکه در لینوکس ——————— در فصل با قسمت های زیر اشنا میشویم 1 : آشنایی اولیه باشبکه 2 : تنظیم شبکه در لینوکس 3 : فرمان های اولیه در عیب یابی شبکه 4 : پیکربندی dns در لینوکس
فصل هشتم - قسمت هفتاد و ششم 🐧
3 : فرمان های اولیه در عیب یابی شبکه
———————
اینجا وارد بخش Network Troubleshooting می‌شویم؛ یعنی وقتی شبکه مشکل دارد، بتوانیم مرحله‌به‌مرحله بفهمیم مشکل دقیقاً کجاست.

———————


1️⃣ ping — اولین ابزار عیب‌یابی
ping برای بررسی دسترسی و ارتباط IP استفاده می‌شود.
مثلاً:
ping 8.8.8.8

یا:
ping google.com

اگر جواب بگیری:
64 bytes from ...

یعنی ارتباط برقرار است.
مثال واقعی
فرض کن سرور اینترنت ندارد.
اول:
ping 192.168.1.1

اگر Gateway جواب داد، شبکه داخلی احتمالاً سالم است.
بعد:
ping 8.8.8.8

اگر این هم جواب داد، اینترنت از نظر IP در دسترس است.
بعد:
ping google.com

اگر این آخری جواب نداد ولی 8.8.8.8 جواب داد، احتمالاً مشکل DNS است.
🧠 این سه تست خیلی مهم‌اند:
ping Gateway
↓
ping IP Internet
↓
ping Domain


—————————-

2️⃣ traceroute — مسیر Packet را ببین
فرمان:
traceroute google.com

نشان می‌دهد Packet برای رسیدن به مقصد از چه Hopهایی عبور می‌کند.
مثلاً:
1   192.168.1.1
2 10.10.0.1
3 ...
4 ...
5 google.com

هر خط تقریباً یک Router/Hop در مسیر است.
مثال واقعی
فرض کن:
ping google.com

داریم ولی Latency خیلی بالاست.
با:
traceroute google.com

می‌توانیم ببینیم تأخیر از کدام بخش مسیر بیشتر شده است.
📌 در بعضی سیستم‌ها ممکن است لازم باشد نصبش کنی:
sudo apt install traceroute


——————-

3️⃣ dig — بررسی DNS
dig یکی از ابزارهای حرفه‌ای DNS است.
مثلاً:
dig google.com

اطلاعاتی درباره DNS Query و پاسخ DNS نشان می‌دهد.
اگر بخواهی مستقیماً از یک DNS خاص سؤال کنی:
dig @8.8.8.8 google.com

یعنی:
از DNS Server

8.8.8.8
درباره

google.com
سؤال کن.



———————

4️⃣ host
ساده‌تر از dig است:
host google.com

مثلاً:
google.com has address xxx.xxx.xxx.xxx

برای بررسی سریع DNS خیلی کاربردی است.





———————————-

5️⃣ nslookup
یکی دیگر از ابزارهای DNS:
nslookup google.com

مثلاً:
Server: 8.8.8.8
Name: google.com
Address: xxx.xxx.xxx.xxx

پس:
dig
host
nslookup

هر سه برای DNS Troubleshooting کاربرد دارند، ولی dig معمولاً جزئیات بیشتری می‌دهد.



———————————

6️⃣ iftop — چه کسی دارد ترافیک مصرف می‌کند؟
iftop برای مشاهده مصرف شبکه به صورت لحظه‌ای استفاده می‌شود.
مثلاً:
sudo iftop

می‌توانی ببینی:
Client A  → Server
Client B → Server
Client C → Server

و چه مقدار Traffic بین آن‌ها ردوبدل می‌شود.
مثال واقعی
فرض کن سرورت ناگهان اینترنت زیادی مصرف می‌کند.
به جای حدس زدن:
sudo iftop

را اجرا می‌کنی و می‌بینی کدام ارتباط‌ها بیشترین Traffic را دارند.
📌 نصب در Debian/Ubuntu:
sudo apt install iftop



———————

7️⃣ netstat
فرمانی که نوشتی:
natstat

احتمالاً منظورت:
netstat

است.
netstat برای مشاهده اطلاعات شبکه استفاده می‌شد؛ مثل:
Connectionها
Portهای باز
Listening Serviceها
Routing Table
Interface Statistics
مثلاً:
netstat -tuln

یعنی Portهایی که در حال Listen هستند را ببین.
مثلاً:
Proto Local Address
tcp 0.0.0.0:22
tcp 0.0.0.0:80

یعنی سرویس‌هایی روی پورت‌های 22 و 80 در حال Listen هستند.
⚠️ netstat در سیستم‌های جدید تا حد زیادی با ss جایگزین شده است.


——————
8️⃣ ss — نسخه مدرن‌تر
امروزه بیشتر از:
ss

استفاده می‌کنیم.
مثلاً:
ss -tuln

برای مشاهده TCP/UDPهای Listening.
معنی:
-t → TCP
-u → UDP
-l → Listening
-n → نمایش عددی

برای دیدن Connectionهای فعال:
ss -tun

و برای اینکه بفهمیم کدام Process از Port استفاده می‌کند:
sudo ss -tulpn

این یکی را خیلی خوب یاد بگیر. 👌


————————-

9️⃣ nc یا Netcat

Netcat یکی از ابزارهای بسیار کاربردی برای تست Connection و Port است.
مثلاً:
nc -vz 192.168.1.10 22

یعنی:
ببین آیا می‌توانم به پورت 22 این سیستم وصل شوم؟

اگر پورت باز باشد معمولاً چیزی شبیه:
Connection to 192.168.1.10 22 port [tcp/ssh] succeeded!

می‌بینی.
مثال واقعی
فرض کن SSH به سرور وصل نمی‌شود.
اول:
ping 192.168.1.10

بعد:
nc -vz 192.168.1.10 22

اگر Ping جواب دهد ولی nc روی 22 شکست بخورد، احتمالاً مشکل مربوط به SSH Service، Firewall یا Port است.

——————-

🔟 Wireshark
حالا می‌رسیم به یکی از معروف‌ترین ابزارهای Network Troubleshooting:
Wireshark
Wireshark به ما اجازه می‌دهد Packetهای شبکه را Capture و تحلیل کنیم.
مثلاً وقتی:
Computer
↓
Network Card
↓
Packet
↓
Network

اطلاعات ردوبدل می‌شود، Wireshark می‌تواند Packetها را Capture کند.
مثلاً می‌توانی ببینی:
Source IP
Destination IP
Protocol
Port
Packet Size
TCP Flags


——————

1️⃣1️⃣ مثال Wireshark
فرض کن:
ping 8.8.8.8

می‌زنی.
در Wireshark می‌توانی Packetهای:
ICMP Echo Request
ICMP Echo Reply

را ببینی.
یا مثلاً وقتی وارد یک سایت HTTPS می‌شوی، می‌توانی ارتباطات TCP و TLS را مشاهده کنی.
📌 نکته مهم:
Wireshark فقط برای دیدن «اینترنت» نیست؛ برای تحلیل پروتکل‌ها و فهمیدن اینکه واقعاً روی شبکه چه اتفاقی می‌افتد استفاده می‌شود.

—————-

🧠 یک سناریوی واقعی Troubleshooting
فرض کن کاربر می‌گوید:
«سرورم اینترنت نداره.»

تو این ترتیب را برو:
مرحله 1 — Interface
ip addr

مرحله 2 — Gateway
ip route

مرحله 3 — Gateway را Ping کن
ping 192.168.1.1

مرحله 4 — IP اینترنت
ping 8.8.8.8

مرحله 5 — DNS
ping google.com

مرحله 6 — مسیر
traceroute google.com

مرحله 7 — بررسی DNS
dig google.com

مرحله 8 — بررسی Port
nc -vz google.com 443

مرحله 9 — بررسی Connectionها
ss -tulpn

مرحله 10 — اگر هنوز مشکل پیدا نشد
برو سراغ:
Wireshark

و Packetها را بررسی کن.

——————
My folder vip
فصل هشتم - قسمت هفتاد و سوم 🐧 شبکه در لینوکس ——————— در فصل با قسمت های زیر اشنا میشویم 1 : آشنایی اولیه باشبکه 2 : تنظیم شبکه در لینوکس 3 : فرمان های اولیه در عیب یابی شبکه 4 : پیکربندی dns در لینوکس
فصل هشتم - قسمت هفتاد و هفتم 🐧
4 : پیکربندی dns در لینوکس
———————
اینجا می‌خواهیم یاد بگیریم لینوکس از کجا می‌فهمد برای تبدیل google.com به IP باید از چه DNS Serverای استفاده کند.

به‌طور کلی دو روش مهمی که در جزوه‌ات گفتی:
روش سنتی با /etc/resolv.conf
استفاده از systemd-resolved

————————

1️⃣ روش سنتی؛ /etc/resolv.conf
فایل:
/etc/resolv.conf

یکی از معروف‌ترین مکان‌های تنظیم DNS در Linux است.
مثلاً:
nameserver 8.8.8.8
nameserver 1.1.1.1

یعنی سیستم برای DNS Query می‌تواند از این Serverها استفاده کند.
مثلاً وقتی می‌زنی:
ping google.com

سیستم ابتدا باید IP google.com را پیدا کند و برای این کار DNS را Query می‌کند.

———————

2️⃣ مشکل روش سنتی چیست؟
در Linuxهای جدید، /etc/resolv.conf ممکن است توسط یک سرویس دیگر مدیریت شود.
مثلاً:
NetworkManager
systemd-resolved

بنابراین ممکن است دستی بنویسی:
nameserver 8.8.8.8

ولی بعد از Restart یا تغییر Connection، تنظیماتت دوباره تغییر کند.
🧠 پس:
resolv.conf
را بشناس، ولی در سیستم‌های جدید بهتر است بفهمی چه سرویسی آن را مدیریت می‌کند.



——————-
3️⃣ systemd-resolved چیست؟
systemd-resolved یک سرویس برای مدیریت و Resolve کردن DNS در سیستم‌های Linux مبتنی بر systemd است.
به زبان ساده:
Application
↓
systemd-resolved
↓
DNS Server
↓
IP Address

مثلاً:
google.com
↓
systemd-resolved
↓
8.8.8.8
↓
IP


—————-

4️⃣ فعال کردن systemd-resolved
دستوری که نوشتی:
systemctl --now enable systemd-resolved

درست است.
این دستور دو کار انجام می‌دهد:
enable
→ سرویس را برای Bootهای بعدی فعال می‌کند.

--now
→ همین الان هم سرویس را Start می‌کند.

می‌توانی وضعیتش را ببینی:
systemctl status systemd-resolved




———————-

5️⃣ تنظیم DNS در systemd-resolved
در سیستم‌های جدید می‌توان تنظیمات را در مسیرهای مربوط به systemd-resolved قرار داد.
یک مسیر مهم:
/etc/systemd/resolved.conf

و برای تنظیمات Drop-in می‌توان از:
/etc/systemd/resolved.conf.d/

استفاده کرد.
مثلاً:
/etc/systemd/resolved.conf.d/dns_servers.conf

————————

6️⃣ مثال تنظیم DNS
مثلاً:
sudo mkdir -p /etc/systemd/resolved.conf.d

بعد:
sudo nano /etc/systemd/resolved.conf.d/dns_servers.conf

و مثلاً:
[Resolve]
DNS=8.8.8.8 1.1.1.1

بعد سرویس را Restart می‌کنیم:
sudo systemctl restart systemd-resolved


—————-

7️⃣ resolvectl

resolvectl

است.
این ابزار برای تعامل با systemd-resolved استفاده می‌شود.
——————-
8️⃣ دیدن DNS فعلی
resolvectl dns

مثلاً ممکن است ببینی:
Link 2 (ens33)
Current Scopes: DNS
DNS Servers: 192.168.1.1

یعنی Interface ens33 از DNS Server مشخص‌شده استفاده می‌کند.

———————

9️⃣ دیدن Domain
فرمان:
resolvectl domain

اطلاعات مربوط به DNS Domainهایی که برای Linkها تنظیم شده‌اند را نشان می‌دهد.
همچنین:
resolvectl status

یکی از بهترین دستورها برای دیدن وضعیت کلی DNS است.
مثلاً:
Global
Protocols: -LLMNR -mDNS
resolv.conf mode: stub

Link 2 (ens33)
Current DNS Server: 192.168.1.1
DNS Servers: 192.168.1.1


————————

🔟 تست DNS با resolvectl
مثلاً:
resolvectl query google.com

یعنی:
google.com
را Resolve کن و IP آن را نشان بده.

این برای Troubleshooting خیلی خوب است.




——————-

1️⃣1️⃣ DNS برای یک Interface خاص
یکی از قابلیت‌های جالب resolvectl این است که می‌توانی DNS را برای یک Interface تنظیم کنی.
مثلاً:
sudo resolvectl dns ens33 8.8.8.8

یعنی DNS مربوط به Interface ens33 را روی:
8.8.8.8

قرار بده.
برای Domain Search هم می‌توان تنظیماتی انجام داد، مثلاً:
sudo resolvectl domain ens33 example.local


————-

1️⃣2️⃣ چرا DNS برای VPN مهم است؟
این قسمت خیلی کاربردی است.
فرض کن VPN وصل شده‌ای و VPN یک DNS داخلی دارد:
10.10.10.10

و شبکه VPN شامل Domainهای داخلی است:
server.company.local

اگر DNS درست تنظیم نشود، ممکن است:
ping server.company.local

کار نکند، حتی اگر خود VPN کاملاً وصل باشد.
پس:
VPN
↓
Network Interface
↓
DNS
↓
Internal Domain

باید درست تنظیم شود.

——————

1️⃣3️⃣ DNS روی Proxy چه ارتباطی دارد؟
اینجا یک نکته مهم وجود دارد:
Proxy و DNS یکی نیستند.
مثلاً Proxy می‌تواند ترافیک HTTP/HTTPS را عبور دهد، اما DNS ممکن است همچنان از DNS معمولی سیستم استفاده کند.
پس باید مشخص کنیم DNS Query کجا انجام می‌شود:
Application
↓
Proxy
↓
Internet

یا:
Application
↓
DNS Query
↓
DNS Server

در بعضی VPNها و Proxyها قابلیت‌هایی برای Remote DNS Resolution وجود دارد؛ یعنی به جای اینکه سیستم خودش نام دامنه را Resolve کند، Query از مسیر Proxy/VPN انجام می‌شود.
این موضوع برای جلوگیری از DNS Leak هم اهمیت دارد.

——————-

🧠 یک مثال واقعی
فرض کن:
VPN Interface → tun0
DNS Server → 10.10.10.1

و یک سایت داخلی داری:
git.company.local

بدون DNS مناسب:
ping git.company.local

ممکن است:
Name or service not known

بدهد.
اما وقتی DNS مربوط به VPN درست تنظیم شود:
git.company.local
↓
10.10.10.1
↓
IP داخلی

سیستم می‌تواند Server را پیدا کند.
❤1
خب خب فصل هشت هم کامل تموم شد

به امید خدا از فردا فصل 9 دوره الپیک 1 قسمت 102 رو شروع میکنیم
❤1🔥1
فصل نهم - قسمت هفتاد و هشتم 🐧
مقدمه - intro ( شل اسکریپتینگ)
———————
در فصل با قسمت های زیر اشنا میشویم

1 : نوشتن اولیه شکل اسکریپت

2 : خودکار سازی شل اسکریپت
My folder vip
فصل نهم - قسمت هفتاد و هشتم 🐧 مقدمه - intro ( شل اسکریپتینگ) ——————— در فصل با قسمت های زیر اشنا میشویم 1 : نوشتن اولیه شکل اسکریپت 2 : خودکار سازی شل اسکریپت
فصل نهم - قسمت هفتاد و نهم 🐧
متغیر ها در خط فرمان
———————

این قسمت خیلی مهمه، چون Variableها پایه‌ی کار با Shell و Bash هستند و در اسکریپت‌نویسی هم زیاد ازشان استفاده می‌کنیم.

_————————————-

1️⃣ Variable چیست؟
Variable یعنی یک نام که یک مقدار را در خودش نگه می‌دارد.
مثلاً:
name=ali

اینجا:
name → نام متغیر
ali → مقدار متغیر

برای نمایش مقدار:
echo $name

خروجی:
ali

🧠 علامت $ یعنی:
مقدار این Variable را به من بده.

———————-

2️⃣ ساخت Variable در Bash
مثلاً:
name=ali
age=25
city=kashan

نمایش:
echo $name
echo $age
echo $city

خروجی:
ali
25
kashan



——————————

⚠️ فاصله اطراف = ممنوع
این درست است:
name=ali

این غلط است:
name = ali

چون Bash آن را به عنوان یک Command و Argument تفسیر می‌کند.

—————————

3️⃣ Variable را با echo بخوانیم
مثلاً:
name=ali

بعد:
echo $name

یا:
echo "My name is $name"

خروجی:
My name is ali




—————————

4️⃣ Local Variable چیست؟
وقتی Variable را به صورت معمولی ایجاد می‌کنی:
name=ali

این Variable در Shell فعلی وجود دارد.
مثلاً:
name=ali
echo $name

جواب:
ali

اما اگر یک Shell جدید باز کنیم:
bash

و بزنیم:
echo $name

معمولاً چیزی نمایش داده نمی‌شود.
چرا؟
چون name یک Local Shell Variable بوده و به محیط Shell جدید Export نشده است.


————————-

5️⃣ Environment Variable چیست؟
اگر بخواهیم یک Variable به Shellهای فرزند هم منتقل شود، از:
export

استفاده می‌کنیم.
مثلاً:
name=ali
export name

حالا:
bash

و داخل Shell جدید:
echo $name

خروجی:
ali

چون Variable به عنوان Environment Variable Export شده است.


———————-

6️⃣ روش کوتاه‌تر Export
می‌توانی از ابتدا این‌طور بنویسی:
export name=ali

بعد:
bash
echo $name

خروجی:
ali


———————-
My folder vip
فصل نهم - قسمت هفتاد و هشتم 🐧 مقدمه - intro ( شل اسکریپتینگ) ——————— در فصل با قسمت های زیر اشنا میشویم 1 : نوشتن اولیه شکل اسکریپت 2 : خودکار سازی شل اسکریپت
فصل نهم - قسمت هشتاد 🐧
انواع شل
———————

این قسمت ادامه‌ی Variableهاست و برای LPIC-1 مهمه، چون باید بفهمی وقتی User وارد Linux می‌شود، Shell چطور تنظیم می‌شود و تفاوت Interactive / Non-interactive / Subshell چیست.

———————-

1️⃣ Shell چیست؟
Shell واسطه بین کاربر و Kernel است.
User
↓
Shell
↓
Kernel
↓
Hardware

مثلاً وقتی می‌نویسی:
ls

Shell دستور را دریافت و اجرا می‌کند.
معروف‌ترین Shellها:
Bash
Zsh
Ksh
Fish
Tcsh

اما در LPIC-1، Bash اهمیت بیشتری دارد.

—————————

مهم
اگر در دوره گفته شده «سه مدل Shell»، معمولاً منظور Shellهای معروف Unix/Linux است؛ مثلاً:
Bash
/bin/bash

یکی از رایج‌ترین Shellها.
sh
/bin/sh

Shell استاندارد/سازگار با POSIX که در سیستم‌های مختلف ممکن است به Shell دیگری لینک باشد.
مثلاً در بعضی Debianها:
/bin/sh → dash

Zsh
/bin/zsh

یک Shell پیشرفته با امکانات زیاد.
📌 اما تعداد Shellها محدود به سه تا نیست؛ Linux می‌تواند Shellهای مختلفی داشته باشد.

—————————-

3️⃣ Shell فعلی را چطور بفهمیم؟
echo $SHELL

مثلاً:
/bin/bash

اما یک نکته مهم:
$SHELL معمولاً Login Shell تعریف‌شده برای User را نشان می‌دهد، نه الزاماً Shellی که همین لحظه در حال اجرای آن هستی.
برای دیدن Process مربوط به Shell فعلی:
ps -p $$ -o comm=

مثلاً:
bash


——————

4️⃣ Shell کاربران کجا ثبت می‌شود؟
اطلاعات Userها در:
/etc/passwd

قرار دارد.
مثلاً:
ali:x:1000:1000:Ali:/home/ali:/bin/bash

قسمت آخر:
/bin/bash

Login Shell کاربر است.
اگر:
/sbin/nologin

باشد، معمولاً کاربر برای Login عادی اجازه ورود ندارد.

——————-

5️⃣ فایل‌های تنظیمات Shell
قسمت مهم این جلسه همین است.
Bash برای تنظیم محیط خودش فایل‌های مختلفی را می‌خواند.
مهم‌ترین‌ها:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile

اما همه این چهار فایل پشت سر هم خوانده نمی‌شوند.
برای Login Shell، Bash این ترتیب را بررسی می‌کند:
/etc/profile
↓
~/.bash_profile
↓
اگر نبود:
~/.bash_login
↓
اگر نبود:
~/.profile

یعنی از بین سه فایل User معمولاً اولین فایلی که وجود داشته باشد خوانده می‌شود.

————————-

6️⃣ /etc/profile
تنظیمات عمومی برای Userها:
/etc/profile

یعنی تنظیمات مربوط به محیط Login که می‌تواند برای کاربران سیستم اعمال شود.

————————-

7️⃣ .bash_profile
فایل:
~/.bash_profile

تنظیمات Login Shell مخصوص همان User است.
مثلاً:
export PATH="$PATH:$HOME/bin"

———————

8️⃣ .bash_login
اگر:
~/.bash_profile

وجود نداشته باشد، Bash به سراغ:
~/.bash_login

می‌رود.


———————

9️⃣ .profile
اگر دو فایل قبلی وجود نداشته باشند:
~/.profile

خوانده می‌شود.
پس این ترتیب را حفظ کن:
/etc/profile

↓

~/.bash_profile
OR
~/.bash_login
OR
~/.profile

❗️ نکته امتحانی:
Bash از فایل‌های .bash_profile، .bash_login و .profile فقط اولین فایل موجود را برای Login Shell می‌خواند.

———————

🔟 Interactive Shell چیست؟
Interactive یعنی Shell مستقیماً با کاربر در تعامل است.
مثلاً Terminal را باز می‌کنی:
bash

و می‌بینی:
user@linux:~$

بعد می‌توانی دستور بزنی:
ls
pwd
whoami

این یک Interactive Shell است.

————————-

1️⃣1️⃣ Non-Interactive Shell
در Non-interactive، Shell برای اجرای یک Script یا Command اجرا می‌شود و منتظر وارد کردن دستور از کاربر نمی‌ماند.
مثلاً:
bash script.sh

یا:
bash -c 'echo Hello'

در این حالت Shell برای اجرای دستورات استفاده شده، نه برای تعامل مستقیم با کاربر.

————————

1️⃣2️⃣ Subshell چیست؟
Subshell یعنی یک Shell فرزند که از Shell فعلی ایجاد شده است.
مثلاً:
bash

ساختار:
Shell اصلی
│
└── bash
│
└── Subshell

می‌توانی PIDها را ببینی:
echo $$

بعد:
bash

دوباره:
echo $$

PID تغییر می‌کند.
برای خروج:
exit






_————————

1️⃣3️⃣ نکته مهم Variable و Subshell
فرض کن:
name=ali

این یک Shell Variable است.
اگر:
bash

اجرا کنی:
echo $name

ممکن است چیزی نمایش داده نشود.
اما اگر:
export name=ali

کنی:
bash
echo $name

می‌بینی:
ali

چون Variable به Environment منتقل شده است.

———————

1️⃣5️⃣ Alias چیست؟
Alias یعنی یک نام کوتاه برای یک Command.
مثلاً:
alias ll='ls -l'

حالا:
ll

تقریباً مثل:
ls -l

اجرا می‌شود.
1️⃣6️⃣ دیدن Aliasها
alias

تمام Aliasهای تعریف‌شده را نشان می‌دهد.
مثلاً:
alias ll='ls -l'
alias la='ls -la'

1️⃣7️⃣ حذف Alias
unalias ll

حالا:
ll

دیگر Alias نیست.
برای حذف همه Aliasها:
unalias -a

1️⃣8️⃣ Alias دائمی
اگر فقط بنویسی:
alias ll='ls -l'

معمولاً فقط برای همان Shell Session است.
برای دائمی کردن در Bash می‌توانی آن را در:
~/.bashrc

قرار دهی.
مثلاً:
nano ~/.bashrc

اضافه کن:
alias ll='ls -l'

بعد برای اعمال بدون Logout:
source ~/.bashrc

یا:
. ~/.bashrc

⚠️ .bashrc چه فرقی دارد؟
این یکی را خیلی خوب حفظ کن.
Login Shell
↓
/etc/profile
↓
~/.bash_profile

ولی برای Interactive non-login Bash معمولاً:
~/.bashrc

خوانده می‌شود.
پس:
.bash_profile
→ Login Shell

.bashrc
→ Interactive Shell

خیلی از .bash_profileها هم .bashrc را Source می‌کنند:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

⭐️ خلاصه قسمت ۸۰ برای دفتر
Shell
Shell
→ واسطه User و Kernel

معروف‌ها:
bash
sh
zsh

Shell کاربر:
cat /etc/passwd

یا:
echo $SHELL

فایل‌های Login Bash
/etc/profile
↓
~/.bash_profile
↓
اگر نبود ~/.bash_login
↓
اگر نبود ~/.profile

⚠️ از سه فایل User فقط اولین فایل موجود انتخاب می‌شود.
Interactive
Terminal
↓
Interactive Shell

Non-Interactive
Script
↓
Non-Interactive Shell

Subshell
Parent Shell
↓
Child Shell

ایجاد:
bash

خروج:
exit

Alias
ساخت:
alias ll='ls -l'

نمایش:
alias

حذف:
unalias ll

دائمی کردن:
~/.bashrc
اعمال تغییرات:
source ~/.bashrc
🧠 سه نکته طلایی امتحان
/etc/profile
→ تنظیمات عمومی Login

~/.bash_profile
→ تنظیمات Login کاربر

~/.bashrc
→ تنظیمات Interactive Bash
و مهم‌تر از همه:
Login بودن با Interactive بودن یکی نیست. یک Shell می‌تواند Login باشد یا نباشد، و همچنین Interactive باشد یا نباشد؛ این دو ویژگی مستقل از هم هستند.



—————————
1️⃣5️⃣ Alias چیست؟
Alias یعنی یک نام کوتاه برای یک Command.
مثلاً:
alias ll='ls -l'
حالا:
ll
تقریباً مثل:
ls -l
اجرا می‌شود.
1️⃣6️⃣ دیدن Aliasها
alias
تمام Aliasهای تعریف‌شده را نشان می‌دهد.
مثلاً:
alias ll='ls -l'
alias la='ls -la'
1️⃣7️⃣ حذف Alias
unalias ll
حالا:
ll
دیگر Alias نیست.
برای حذف همه Aliasها:
unalias -a
1️⃣8️⃣ Alias دائمی
اگر فقط بنویسی:
alias ll='ls -l'
معمولاً فقط برای همان Shell Session است.
برای دائمی کردن در Bash می‌توانی آن را در:
~/.bashrc
قرار دهی.
مثلاً:
nano ~/.bashrc
اضافه کن:
alias ll='ls -l'
بعد برای اعمال بدون Logout:
source ~/.bashrc
یا:
. ~/.bashrc




————————-
My folder vip
فصل نهم - قسمت هفتاد و هشتم 🐧 مقدمه - intro ( شل اسکریپتینگ) ——————— در فصل با قسمت های زیر اشنا میشویم 1 : نوشتن اولیه شکل اسکریپت 2 : خودکار سازی شل اسکریپت
فصل نهم - قسمت هشتاد و یکم 🐧
مقدمه ای بر شل اسکریپتینگ
———————

فصل نهم - قسمت هشتاد و یکم 🐧
مقدمه ای بر شل اسکریپتینگ
———————
این قسمت یکی از مهم‌ترین قسمت‌های فصل نهمه، چون از اینجا وارد Shell Script نویسی می‌شیم. برای LPIC-1 باید منطق اجرای دستورات رو خوب بلد باشی.

————————-


1️⃣ Shell Scripting چیست؟
خیلی ساده:
Shell Script یعنی چند دستور Linux را داخل یک فایل قرار بدهیم تا بتوانیم آنها را یکجا و خودکار اجرا کنیم.
مثلاً به‌جای اینکه هر روز این‌ها را جداگانه بزنیم:
mkdir backup
cp file.txt backup/
date

می‌توانیم همه را داخل یک فایل قرار دهیم:
backup.sh

و فقط اجرا کنیم:
./backup.sh

یعنی Shell Script مثل یک برنامه کوچک برای خودکارسازی کارهای Linux است.

————————

2️⃣ Shellهای مناسب برای Script
از Shellهای مختلف می‌توان Script نوشت.
مهم‌ترین‌ها:
Bash
Ksh
Sh
Zsh

در دوره LPIC-1 تمرکز اصلی معمولاً روی:
Bash

است.
مثلاً:
#!/bin/bash

یعنی این Script با Bash اجرا شود.

————————-

3️⃣ اجرای چند Command با ;
با ; می‌توانیم چند دستور را در یک خط بنویسیم.
مثلاً:
pwd; ls; whoami

هر سه دستور اجرا می‌شوند.
نکته مهم:
; به موفق یا ناموفق بودن دستور قبلی کاری ندارد.
مثلاً:
ls /abc; echo Hello

حتی اگر /abc وجود نداشته باشد، echo Hello اجرا می‌شود.
ساختار:
Command 1
↓
اجرا
↓
Command 2
↓
اجرا

—————————

4️⃣ اجرای شرطی با &&
&& یعنی:
دستور دوم فقط زمانی اجرا شود که دستور اول با موفقیت اجرا شده باشد.

مثلاً:
mkdir test && cd test

اگر mkdir test موفق شود، cd test اجرا می‌شود.
اما اگر ساخت Directory شکست بخورد، دستور دوم اجرا نمی‌شود.
مثال کاربردی:
ping -c 1 8.8.8.8 && echo "Internet OK"

اگر Ping موفق شود:
Internet OK

نمایش داده می‌شود.
🧠 حفظ کن:
&& → اگر اولی موفق شد، دومی را اجرا کن


—————————

5️⃣ اجرای شرطی با ||
|| تقریباً برعکس && است.
یعنی:
دستور دوم فقط زمانی اجرا شود که دستور اول شکست بخورد.

مثلاً:
cd /backup || echo "Backup directory not found"

اگر /backup وجود نداشته باشد:
Backup directory not found

نمایش داده می‌شود.
مثال دیگر:
ping -c 1 192.168.1.100 && echo "UP" || echo "DOWN"

اگر Ping موفق شود:
UP

و اگر شکست بخورد:
DOWN


————————————-
مثال:
command1 ; command2

⬅️ همیشه command2 اجرا می‌شود.
command1 && command2

⬅️ فقط در صورت موفقیت command1.
command1 || command2

⬅️ فقط در صورت شکست command1.


———————
7️⃣ Pipe یا |
Pipe برای انتقال خروجی یک Command به ورودی Command بعدی استفاده می‌شود.
مثلاً:
ls | grep txt

اینجا:
ls
↓
خروجی
↓
|
↓
grep txt

یعنی خروجی ls به grep داده می‌شود.
مثلاً:
ps aux | grep ssh

یعنی خروجی ps aux را به grep بده و فقط موارد مربوط به ssh را پیدا کن.



——————-
8️⃣ Pipe با چند Command
Pipe می‌تواند چند مرحله داشته باشد:
ps aux | grep ssh | wc -l

ساختار:
ps aux
↓
grep ssh
↓
wc -l

یعنی:
Processها را نمایش بده.
موارد مربوط به SSH را فیلتر کن.
تعداد خطوط را بشمار.

————————————

9️⃣ تفاوت | با &&
خیلی مهم:
Pipe:
command1 | command2

یعنی:
خروجی Command 1 را به ورودی Command 2 بده.

AND:
command1 && command2

یعنی:
اگر Command 1 موفق شد، Command 2 را اجرا کن.

پس این دو کاملاً متفاوت‌اند.

————————-
فصل نهم - قسمت هشتاد و دوم 🐧
اموزش اولیه شل اسکریپتینگ
———————
آموزش اولیه Shell Scripting
این قسمت در واقع می‌خواد ساختار اولیه یک Shell Script و روش اجرای آن رو یاد بده.
1️⃣ یک Shell از نوع Bash
اول مشخص می‌کنیم Script با Bash اجرا شود:
#!/bin/bash

این خط را Shebang می‌گوییم.

———————-


2️⃣ ساخت یک فایل خالی
مثلاً:
touch ali.sh

فایل ساخته می‌شود:
ali.sh

پسوند .sh معمولاً نشان می‌دهد فایل یک Shell Script است، ولی خود پسوند به‌تنهایی باعث اجرای Script نمی‌شود.


———————

3️⃣ ویرایش فایل
مثلاً با nano:
nano ali.sh

و داخلش بنویس:
#!/bin/bash

echo "Hello Ali"

ذخیره کن.

————————

4️⃣ روش اول اجرای Script
اگر مجوز Execute نداشته باشد:
chmod +x ali.sh

حالا:
./ali.sh

اجرا می‌شود.

——————-

5️⃣ chmod u+x یعنی چه؟
این دستور:
chmod u+x ali.sh

یعنی:
فقط برای User/Owner فایل، مجوز Execute را اضافه کن.

مقایسه:
+x    → اضافه کردن Execute
u+x → اضافه کردن Execute برای Owner
g+x → اضافه کردن Execute برای Group
o+x → اضافه کردن Execute برای Others

—————————

6️⃣ چرا ./ali.sh؟
وقتی می‌نویسیم:
./ali.sh

./ یعنی:
فایل

ali.sh
را از دایرکتوری فعلی اجرا کن.

اگر فقط بنویسی:
ali.sh

ممکن است Bash فایل را پیدا نکند، چون دایرکتوری فعلی معمولاً در PATH نیست.


——————-

7️⃣ روش اجرای بدون chmod
حتی اگر فایل Execute نباشد، می‌توانی مستقیماً به Bash بدهی:
bash ali.sh

یا:
/bin/bash ali.sh

در این حالت Bash فایل را می‌خواند و اجرا می‌کند.
فصل نهم - قسمت هشتاد و سوم 🐧
نمایش پیام به کاربر
———————
نمایش پیام به کاربر با echo
1. echo چیست؟
دستور echo برای نمایش متن، متغیرها و خروجی‌های ساده در ترمینال استفاده می‌شود.
مثلاً:
echo "Hello World"

خروجی:
Hello World

یا:
echo "Welcome to Linux"

خروجی:
Welcome to Linux


———————————

2. استفاده از متن ساده
اگر متن فاصله داشته باشد، بهتر است آن را داخل کوتیشن قرار دهیم:
echo "Hello Ali"

اما حتی این هم کار می‌کند:
echo Hello Ali

خروجی هر دو:
Hello Ali

ولی استفاده از " " در اسکریپت‌نویسی خواناتر و مطمئن‌تر است.

—————————

3. Double Quote یا " "
وقتی متن را داخل دابل کوتیشن قرار می‌دهیم:
echo "Hello"

Shell محتوای داخل آن را بررسی می‌کند و متغیرها را Expand می‌کند.
مثلاً:
USER="Ali"
echo "Hello $USER"

خروجی:
Hello Ali

یعنی:
$USER
↓
Ali

مثال کاربردی:
NAME="Alireza"
AGE=25

echo "My name is $NAME"
echo "I am $AGE years old"

خروجی:
My name is Alireza
I am 25 years old



——————-
4. Single Quote یا ' '
وقتی از Single Quote استفاده کنیم:
echo 'Hello $USER'

Shell مقدار متغیر را جایگزین نمی‌کند.
خروجی مثلاً:
Hello $USER

یعنی $USER دقیقاً همان‌طور که نوشته شده چاپ می‌شود.
مقایسه مهم
USER="Ali"

echo "Hello $USER"
echo 'Hello $USER'

خروجی:
Hello Ali
Hello $USER

⭐️ نکته امتحانی
" "  → Variable Expansion انجام می‌شود

' ' → محتوا تقریباً Literal چاپ می‌شود

مثلاً:
echo "$USER"

مقدار USER را چاپ می‌کند.
اما:
echo '$USER'

خود عبارت $USER را چاپ می‌کند.

——————————

5. متغیرها در echo
در Bash برای استفاده از مقدار متغیر از $ استفاده می‌کنیم.
مثلاً:
NAME="Ali"

echo $NAME

خروجی:
Ali

یا:
echo "My name is $NAME"

خروجی:
My name is Ali

⚠️ نکته مهم درباره جزوه
اگر نوشته شده:
&USER

برای Bash اشتباه است.
در Bash باید بنویسی:
$USER

مثلاً:
echo "$USER"

———————-
6. متغیرهای آماده سیستم
خود Linux تعدادی Environment Variable دارد.
مثلاً:
echo "$USER"

نام کاربر فعلی را نشان می‌دهد.
echo "$HOME"

مسیر Home کاربر را نشان می‌دهد.
echo "$PWD"

مسیر دایرکتوری فعلی را نشان می‌دهد.
echo "$SHELL"

Shell پیش‌فرض کاربر را نشان می‌دهد.
مثلاً ممکن است:
$USER
alireza

$HOME
/home/alireza

$PWD
/home/alireza/Desktop

$SHELL
/bin/bash



———————-


7. ترکیب چند متغیر
مثلاً:
NAME="Ali"
JOB="Security"

echo "Hello $NAME"
echo "Your job is $JOB"

خروجی:
Hello Ali
Your job is Security

یا همه را در یک خط:
echo "Hello $NAME, your job is $JOB"


————————

8. استفاده از ${}
گاهی باید متغیر را داخل ${} قرار دهیم.
مثلاً:
NAME="Ali"

echo "${NAME}reza"

خروجی:
Alireza

چرا؟
چون Bash باید بفهمد نام متغیر NAME است.
اگر بنویسیم:
echo "$NAMEreza"

Bash تصور می‌کند اسم متغیر:
NAMEreza

است.
پس:
"${NAME}reza"

بهتر است.




—————————————

9. استفاده از Argument در echo
این قسمت خیلی مهمه.
وقتی یک Script را اجرا می‌کنیم، می‌توانیم بعد از اسم فایل، اطلاعاتی به آن بدهیم.
مثلاً:
./ali.sh Alireza

در Script:
echo "$1"

خروجی:
Alireza

اینجا:
$1

یعنی اولین Argument.



————————

مثال با چند Argument
فایل:
ali.sh

محتوا:
#!/bin/bash

echo "Argument 1: $1"
echo "Argument 2: $2"
echo "Argument 3: $3"

اجرا:
./ali.sh Ali 25 Tehran

خروجی:
Argument 1: Ali
Argument 2: 25
Argument 3: Tehran

یعنی:
$1 → Ali
$2 → 25
$3 → Tehran

————————

10. $# تعداد Argumentها
متغیر خاص:
$#

تعداد Argumentهایی که به Script داده شده را نشان می‌دهد.
مثلاً:
#!/bin/bash

echo "Number of arguments: $#"

اجرا:
./ali.sh Ali 25 Tehran

خروجی:
Number of arguments: 3

—————

11. $@ تمام Argumentها
$@ یعنی تقریباً تمام Argumentها.
مثلاً:
#!/bin/bash

echo "Arguments: $@"

اجرا:
./ali.sh Ali 25 Tehran

خروجی:
Arguments: Ali 25 Tehran

12. $0 چیست؟
یک مورد خیلی مهم دیگر:
$0

نام Script را نشان می‌دهد.
مثلاً:
#!/bin/bash

echo "Script name: $0"

اگر اجرا کنیم:
./ali.sh Ali

خروجی:
Script name: ./ali.sh

———————-
13. یک مثال واقعی و خیلی خوب 🔥
فرض کن می‌خواهیم Scriptی داشته باشیم که اسم کاربر را بگیرد و به او خوش‌آمد بگوید.
فایل:
welcome.sh

محتوا:
#!/bin/bash

echo "========================"
echo " Welcome"
echo "========================"

echo "Hello $1"
echo "You are using: $SHELL"
echo "Your home directory: $HOME"
echo "Current directory: $PWD"

اجرا:
./welcome.sh Alireza

خروجی مثلاً:
========================
Welcome
========================
Hello Alireza
You are using: /bin/bash
Your home directory: /home/alireza
Current directory: /home/alireza

اینجا چند مفهوم را با هم استفاده کردیم:
$1     → Argument
$SHELL → Environment Variable
$HOME → Environment Variable
$PWD → Environment Variable



———————
14. چاپ $ به صورت واقعی
یک نکته جالب:
اگر بنویسی:
echo "$USER"

متغیر Expand می‌شود.
اما:
echo '$USER'

خود $USER چاپ می‌شود.
پس Single Quote برای مواقعی که می‌خواهیم $ و سایر کاراکترها تفسیر نشوند مفید است.
———————
فصل نهم - قسمت هشتاد و چهارم 🐧
گرفتن متغیر از کاربر
———————
1. دستور read چیست؟
دستور:
read

برای گرفتن اطلاعات از کاربر استفاده می‌شود.
یعنی Script متوقف می‌شود، منتظر می‌ماند کاربر چیزی تایپ کند و Enter بزند، سپس آن مقدار را داخل یک متغیر ذخیره می‌کند.
مثلاً:
#!/bin/bash

echo -n "Hi, your name: "
read name

echo "Hello $name, welcome to my program"

اگر کاربر وارد کند:
Alireza

خروجی:
Hi, your name: Alireza
Hello Alireza, welcome to my program

ساختار کلی:
read VARIABLE

مثلاً:
read name

یعنی:
ورودی کاربر را بگیر و داخل متغیر

name
قرار بده.

————————-

2. چرا echo -n؟
در حالت عادی:
echo "Enter your name:"

بعد از چاپ متن، echo به خط بعد می‌رود.
اما:
echo -n "Enter your name: "

گزینه -n باعث می‌شود Enter/خط جدید چاپ نشود.
بنابراین کاربر می‌تواند در همان خط جواب بدهد:
Enter your name: Alireza

—————

3. استفاده از read -p
اما یک روش تمیزتر وجود دارد.
به جای:
echo -n "Enter your name: "
read name

می‌توانیم بنویسیم:
read -p "Enter your name: " name

یعنی:
-p → پیام را نمایش بده
name → ورودی را داخل این متغیر ذخیره کن

مثال:
#!/bin/bash

read -p "Please enter your name: " name

echo "Hello $name"

کاربر:
Please enter your name: Alireza

خروجی:
Hello Alireza

⭐️ نکته امتحانی
این:
read -p "Enter name: " name

تقریباً معادل:
echo -n "Enter name: "
read name

است.


———————
4. گرفتن سن از کاربر
مثال جزوه شما:
read -p "Please enter your age: " age

days=$[$age * 365]

echo "You are $days days old"

اگر کاربر وارد کند:
25

محاسبه:
25 × 365 = 9125

خروجی:
You are 9125 days old

البته برای محاسبات Bash امروزی بهتر است از این روش استفاده کنیم:
days=$((age * 365))

——————

5. read -t چیست؟ ⏱️
این یکی مهم است.
گزینه:
-t

برای تعیین Timeout در read استفاده می‌شود.
یعنی به کاربر فقط یک مدت مشخص فرصت می‌دهیم که ورودی را وارد کند.
مثلاً:
read -t 5 -p "Enter your name: " name

یعنی:
کاربر فقط ۵ ثانیه فرصت دارد اسمش را وارد کند.

اگر در ۵ ثانیه ورودی وارد نشود، read با خطا/کد خروجی غیرصفر تمام می‌شود.
مثال کاربردی:
#!/bin/bash

read -t 5 -p "Enter your name within 5 seconds: " name

echo "Hello $name"

کاربرد واقعی
مثلاً Scriptی داری که می‌گوید:
Do you want to continue?

نمی‌خواهی Script برای همیشه منتظر کاربر بماند.
می‌توانی بگویی:
read -t 10 -p "Continue? " answer

کاربر ۱۰ ثانیه فرصت دارد.
⭐️ حفظ کن:
read -t 5
↑
Timeout

—————

6. read -s چیست؟ 🔐
گزینه:
-s

باعث می‌شود ورودی کاربر روی صفحه نمایش داده نشود.
-s مخفف:
silent

است.
مهم‌ترین کاربردش گرفتن Password است.
مثلاً:
read -s -p "Enter password: " password

کاربر رمز را تایپ می‌کند، اما چیزی روی صفحه دیده نمی‌شود.
مثلاً:
Enter password:

کاربر تایپ می‌کند:
123456

ولی روی صفحه چیزی مثل:
******

نمایش داده نمی‌شود؛ معمولاً حتی ستاره هم نمی‌بینی.
بعد:
echo "Password received"

⚠️ نکته امنیتی
read -s باعث می‌شود رمز در ترمینال echo نشود؛ ولی این به معنی رمزنگاری یا امن‌شدن خود متغیر نیست.
مثلاً:
read -s password

مقدار همچنان در متغیر:
$password

وجود دارد.
—————————-

7. ترکیب -s و -p
خیلی کاربردی:
read -s -p "Enter password: " password
echo
echo "Password received."

چرا echo گذاشتیم؟
چون read -s معمولاً بعد از Enter به خط جدید نمی‌رود؛ بنابراین:
echo

فقط برای رفتن به خط بعد است.
8. ترکیب -t و -s
حتی می‌توانیم چند Option را با هم استفاده کنیم.
مثلاً:
read -s -t 10 -p "Enter password within 10 seconds: " password

یعنی:
-s → ورودی نمایش داده نشود
-t 10 → فقط 10 ثانیه فرصت
-p → نمایش پیام


—————————-

9. یک مثال کامل‌تر 🔥
یک Script ساده برای Login:
#!/bin/bash

read -p "Username: " username

read -s -p "Password: " password
echo

echo "Welcome $username"

مثلاً:
Username: Alireza
Password:
Welcome Alireza

رمز هنگام تایپ نمایش داده نمی‌شود.



——————-

11. چند ورودی با یک read
می‌توانیم چند متغیر را همزمان بگیریم:
read -p "Enter name and age: " name age

اگر کاربر بزند:
Alireza 25

آنگاه:
$name → Alireza
$age → 25

مثلاً:
echo "Name: $name"
echo "Age: $age"

خروجی:
Name: Alireza
Age: 25


———————

12. مثال کاربردی برای کار امنیتی 🛡
فرض کن می‌خواهیم IP را از کاربر بگیریم:
#!/bin/bash

read -p "Enter target IP: " ip

echo "Target is: $ip"

اجرا:
Enter target IP: 192.168.1.10
Target is: 192.168.1.10

حالا می‌توانیم آن را وارد یک دستور کنیم:
ping -c 1 "$ip"

یا در محیط آزمایشگاهی مجاز:
nmap "$ip"

پس read یکی از پایه‌های ساخت Toolkitهای امنیتی تعاملی است.

——————-
🙏1
فصل نهم - قسمت هشتاد و پنجم 🐧
نمایش وضعیت اجرای فرمان — Exit Status
———————
م1. Exit Status چیست؟
هر دستوری که در Linux اجرا می‌شود، در پایان یک کد وضعیت (Exit Status) برمی‌گرداند که نشان می‌دهد اجرای دستور موفق بوده یا نه.
برای دیدن Exit Status آخرین دستور:
echo $?

مهم‌ترین حالت‌ها:
0     → اجرای موفق
غیر 0 → اجرای ناموفق / خطا

⚠️ پس دقیق‌تر این است که نگوییم فقط 1 یعنی خطا؛ هر عدد غیر از صفر معمولاً نشان‌دهنده خطا یا وضعیت غیرموفق است.
مثال:
ls
echo $?

اگر ls موفق باشد:
0

اما:
ls /abc
echo $?

اگر /abc وجود نداشته باشد، یک عدد غیرصفر برمی‌گردد.

—————————-

2. یک مثال خیلی ساده
mkdir test
echo $?

اگر ساخت پوشه موفق باشد:
0

حالا:
mkdir /root/test
echo $?

اگر اجازه ساخت نداشته باشی، مثلاً:
1

یا یک کد غیرصفر دیگر دریافت می‌کنی.

——————————

3. نکته مهم درباره $?
$? همیشه وضعیت آخرین دستور اجراشده را نشان می‌دهد.
مثلاً:
ls
echo $?

اینجا $? مربوط به ls است.
ولی اگر بزنیم:
ls
pwd
echo $?

اینجا $? مربوط به pwd است، نه ls.
——————————

4. دستور exit چیست؟
exit برای خارج شدن از Shell یا Script و برگرداندن یک Exit Status مشخص استفاده می‌شود.
مثلاً:
exit 0

یعنی:
Script با موفقیت تمام شد.

و:
exit 1

یعنی:
Script با وضعیت خطا تمام شد.

————————
5. exit 10 چطور کار می‌کند؟
اگر بنویسی:
exit 10

یعنی:
از Script خارج شو و Exit Status را برابر

10
قرار بده.

مثلاً:
#!/bin/bash

echo "Hello"

exit 10

بعد از اجرای Script:
echo $?

خروجی:
10

یعنی Script خودش اعلام کرده که با کد 10 خارج شده است.
⭐️ نکته مهم
10 لزوماً معنی خاص و جهانی ندارد.
خود برنامه‌نویس می‌تواند برای خطاهای مختلف کدهای مختلف تعریف کند:
exit 1
exit 2
exit 10
exit 20

مهم این است که:
0    → موفق
1-255 → وضعیت غیرموفق/کد وضعیت



——————-
6. مثال کاربردی 🔥
فرض کن Script بررسی می‌کند که یک فایل وجود دارد یا نه:
#!/bin/bash

if [ -f "/tmp/test.txt" ]; then
echo "File exists"
exit 0
else
echo "File not found"
exit 10
fi

اگر فایل وجود داشته باشد:
File exists

و:
echo $?

می‌شود:
0

اگر فایل وجود نداشته باشد:
File not found

و:
echo $?

می‌شود:
10

اینجا 10 را خودمان به‌عنوان کد مخصوص File Not Found انتخاب کرده‌ایم.
My folder vip
فصل نهم - قسمت هشتاد و پنجم 🐧 نمایش وضعیت اجرای فرمان — Exit Status ——————— م1. Exit Status چیست؟ هر دستوری که در Linux اجرا می‌شود، در پایان یک کد وضعیت (Exit Status) برمی‌گرداند که نشان می‌دهد اجرای دستور موفق بوده یا نه. برای دیدن Exit Status آخرین دستور:…
فصل نهم - قسمت هشتاد و ششم 🐧
اعمال ریاضی در خط فرمان
———————
در Bash می‌توانیم عملیات ریاضی را انجام دهیم و نتیجه را داخل یک متغیر ذخیره کنیم.
1. روش قدیمی با $[ ]
مثلاً:
result=$[5+3]
echo $result

خروجی:
8

یعنی:
5 + 3 = 8

نکته:

$[ ]
روش قدیمی است و در Bash امروزی بهتر است از

$(( ))
استفاده کنیم.



——————-

2. روش پیشنهادی: $(( ))
result=$((5+3))
echo $result

خروجی:
8

مثال:
a=10
b=5

result=$((a+b))
echo "$result"

خروجی:
15


——————————

4. یک مثال کاربردی با read
مثلاً سن کاربر را می‌گیریم:
read -p "Enter your age: " age

days=$((age*365))

echo "You are approximately $days days old."

اگر وارد کند:
25

خروجی:
You are approximately 9125 days old.
My folder vip
فصل نهم - قسمت هشتاد و ششم 🐧 اعمال ریاضی در خط فرمان ——————— در Bash می‌توانیم عملیات ریاضی را انجام دهیم و نتیجه را داخل یک متغیر ذخیره کنیم. 1. روش قدیمی با $[ ] مثلاً: result=$[5+3] echo $result خروجی: 8 یعنی: 5 + 3 = 8 نکته: $[ ] روش قدیمی است و در Bash…
فصل نهم - قسمت هشتاد و هفتم 🐧
فرمان test
———————
فرمان test

فرمان test یکی از مهم‌ترین دستورها در Shell Scripting است، چون برای بررسی شرط‌ها استفاده می‌شود.

مثلاً می‌خواهیم بفهمیم:
آیا یک فایل وجود دارد؟
آیا یک پوشه وجود دارد؟
آیا دو عدد برابرند؟
آیا یک رشته خالی است؟
آیا یک فایل قابل اجراست؟
——————————-
1. test چیست؟
ساختار کلی:
test CONDITION

مثلاً:
test 5 -eq 5
echo $?

خروجی:
0

یعنی شرط درست است.
اگر:
test 5 -eq 10
echo $?

خروجی غیرصفر می‌شود؛ یعنی شرط غلط است.
پس:
0      → شرط درست
غیر 0 → شرط غلط


———————

2. براکت [ چیست؟
در Bash می‌توانیم به جای test از:
[ CONDITION ]

استفاده کنیم.
مثلاً:
[ 5 -eq 5 ]
echo $?

این از نظر مفهومی همان:
test 5 -eq 5

است.
⚠️ نکته خیلی مهم
[ در واقع یک دستور (command) است و ] آرگومان پایانی آن محسوب می‌شود.
بنابراین فاصله‌ها مهم‌اند:
درست:
[ 5 -eq 5 ]

غلط:
[5 -eq 5]




———————-

3. بررسی فایل‌ها 📁
این قسمت خیلی مهم است.
-e
بررسی می‌کند چیزی با این نام وجود دارد یا نه:
[ -e file.txt ]


-f
بررسی می‌کند آیا فایل معمولی (Regular File) است:
[ -f file.txt ]


-d
بررسی می‌کند آیا Directory است:
[ -d /home ]


-r
آیا فایل قابل خواندن است؟
[ -r file.txt ]


-w
آیا فایل قابل نوشتن است؟
[ -w file.txt ]

-x
آیا فایل قابل اجرا است؟
[ -x script.sh ]

-s
آیا فایل وجود دارد و حجم آن بیشتر از صفر است؟
[ -s file.txt ]

————————

مثال واقعی
فرض کن می‌خواهیم ببینیم فایل وجود دارد یا نه:
#!/bin/bash

if [ -f "/etc/passwd" ]; then
echo "File exists"
else
echo "File not found"
fi

چون /etc/passwd یک فایل معمولی است:
File exists



———————-


5. مقایسه اعداد 🔢

برای اعداد از این عملگرها استفاده می‌کنیم:

عملگر:
معنی:
-eq
برابر
-ne
نابرابر
-gt
بزرگ‌تر
-ge
بزرگ‌تر یا مساوی
-lt
کوچک‌تر
-le
کوچک‌تر یا مساوی


مثلاً:
[ 10 -eq 10 ]

یعنی:
10 = 10

یا:
[ 10 -gt 5 ]

یعنی:
10 > 5

مثال کاربردی:
read -p "Enter your age: " age

if [ "$age" -ge 18 ]; then
echo "Adult"
else
echo "Under 18"
fi



—————-


6. مقایسه رشته‌ها 📝
برای Stringها می‌توانیم از:
=

و:
!=

استفاده کنیم.
مثلاً:
name="Ali"

[ "$name" = "Ali" ]

شرط درست است.
یا:
[ "$name" != "Reza" ]

این هم درست است.



——————-

7. بررسی خالی بودن String
-z
اگر String خالی باشد، True است:
[ -z "$name" ]

-n
اگر String خالی نباشد، True است:
[ -n "$name" ]

مثلاً:
name=""

if [ -z "$name" ]; then
echo "Name is empty"
fi


——————-

8. ترکیب شرط‌ها
AND → &&
هر دو شرط باید درست باشند:
[ "$age" -ge 18 ] && [ "$age" -le 60 ]

OR → ||
حداقل یکی درست باشد:
[ "$age" -lt 18 ] || [ "$age" -gt 60 ]




9. NOT → !
برای برعکس کردن نتیجه:
[ ! -f file.txt ]

یعنی:
اگر

file.txt
وجود نداشته باشد یا فایل معمولی نباشد.

مثال:
if [ ! -f "/tmp/test.txt" ]; then
echo "File does not exist"
fi






———————
فصل نهم - قسمت هشتاد و هشتم 🐧
استفاده از if
———————
if چیست؟
if برای بررسی یک شرط و اجرای دستورات بر اساس نتیجه آن استفاده می‌شود.
ساختار اصلی:
if [ CONDITION ]; then
command
fi

یعنی:
اگر شرط درست بود
دستورات را اجرا کن
پایان if

——————-

مثال ۱ — تشخیص عدد بزرگ‌تر و کوچک‌تر
#!/bin/bash

read -p "Enter a number: " num

if [ "$num" -gt 10 ]; then
echo "Number is greater than 10"
else
echo "Number is less than or equal to 10"
fi

اگر کاربر بزند:
15

خروجی:
Number is greater than 10

اگر بزند:
7

خروجی:
Number is less than or equal to 10

اگر بخواهیم سه حالت داشته باشیم:
if [ "$num" -gt 10 ]; then
echo "Greater than 10"
elif [ "$num" -eq 10 ]; then
echo "Equal to 10"
else
echo "Less than 10"
fi

ساختار:
if
↓
شرط اول

elif
↓
شرط دوم

else
↓
اگر هیچ‌کدام درست نبود

fi
↓
پایان



———————-

مثال ۲ — بررسی وجود فایل
می‌خواهیم ببینیم /etc/passwd وجود دارد یا نه:
#!/bin/bash

if [ -f /etc/passwd ]; then
echo "File exists"
else
echo "File does not exist"
fi

چون /etc/passwd یک فایل معمولی است:
File exists

بررسی فایل دلخواه:
read -p "Enter filename: " file

if [ -f "$file" ]; then
echo "File exists"
else
echo "File not found"
fi

مثلاً:
Enter filename: test.txt
File exists
فصل نهم - قسمت هشتاد و نهم 🐧
استفاده از case و select
———————
1. case چیست؟
وقتی چند انتخاب مختلف داریم، case معمولاً از چندین if/elif خواناتر است.
ساختار:
case "$variable" in
option1)
commands
;;
option2)
commands
;;
*)
commands
;;
esac

esac پایان case است.

————————

مثال شبکه‌ای که گفتی 🔥
می‌خواهیم کاربر یکی از این‌ها را وارد کند:
ip
link
route

و دستور مربوطه اجرا شود.
#!/bin/bash

read -p "Enter command (ip/link/route): " choice

case "$choice" in
ip)
ip addr
;;
link)
ip link
;;
route)
ip route
;;
*)
echo "Invalid option"
;;
esac

اگر کاربر بنویسد:
ip

اجرا می‌شود:
ip addr

اگر بنویسد:
link

اجرا می‌شود:
ip link

و:
route

اجرا می‌شود:
ip route

* یعنی:
هیچ‌کدام از گزینه‌های بالا نبود.


——————-

2. select چیست؟
select برای ساختن منوی انتخابی ساده در Bash استفاده می‌شود.
مثلاً:
#!/bin/bash

select choice in ip link route exit
do
case "$choice" in
ip)
ip addr
;;
link)
ip link
;;
route)
ip route
;;
exit)
break
;;
*)
echo "Invalid option"
;;
esac
done

وقتی اجرا کنی، Bash چیزی شبیه این نشان می‌دهد:
1) ip
2) link
3) route
4) exit
#?

کاربر مثلاً:
#? 2

و ip link اجرا می‌شود.
تفاوت:
case
→ خودت ورودی را از کاربر می‌گیری و بررسی می‌کنی.

select
→ Bash خودش یک منوی شماره‌دار می‌سازد.
فصل نهم - قسمت نودم🐧
استفاده از حلقه‌ها
———————
چیست؟
حلقه یعنی:
یک دستور یا مجموعه‌ای از دستورات را چند بار اجرا کنیم.

مثلاً به جای اینکه ۱۰ بار بنویسیم:
echo 1
echo 2
echo 3
...

از حلقه استفاده می‌کنیم.

——————-

seq
seq برای تولید یک دنباله از اعداد استفاده می‌شود.
مثلاً:
seq 1 5

خروجی:
1
2
3
4
5

و:
seq 10 15

خروجی:
10
11
12
13
14
15



—————

حلقه for
مثلاً:
for i in $(seq 1 5)
do
echo "Number: $i"
done

خروجی:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

ساختار:
for
↓
مقدار بگیر
↓
دستور را اجرا کن
↓
مقدار بعدی
↓
...
↓
done


————————

🔥 پورت اسکنر خیلی ساده
برای محیطی که مالک آن هستی یا اجازه تستش را داری، می‌توانیم یک TCP port checker ساده با Bash بسازیم.
مثلاً:
#!/bin/bash

read -p "Enter target IP: " target
read -p "Start port: " start
read -p "End port: " end

for port in $(seq "$start" "$end")
do
if timeout 1 bash -c "</dev/tcp/$target/$port" 2>/dev/null; then
echo "Port $port is OPEN"
fi
done

مثلاً:
Enter target IP: 192.168.1.10
Start port: 20
End port: 25

ممکن است:
Port 22 is OPEN
Port 25 is OPEN

این یک Port Scanner بسیار ابتدایی است و قابلیت‌های ابزارهایی مثل Nmap را ندارد.

——————
فصل نهم - قسمت نود و دوم🐧
اجرای فرمان در حالت خاص با nohup
———————
nohup مخفف:
No Hang Up

است.
کارش این است که یک برنامه را طوری اجرا کنیم که با بسته‌شدن Session/ترمینال، تا حد امکان به SIGHUP وابسته نباشد و ادامه دهد.
مثلاً:
nohup ./backup.sh &

اینجا دو مفهوم داریم:
nohup → جلوگیری از توقف معمول برنامه هنگام قطع Session
& → اجرای برنامه در Background

خروجی معمولاً به فایلی مثل:
nohup.out

می‌رود، مگر اینکه خودمان Redirect کنیم.
مثلاً:
nohup ./backup.sh > backup.log 2>&1 &

خیلی کاربردی برای SSH است.
مثلاً:
ssh server
nohup ./backup.sh > backup.log 2>&1 &

بعد SSH را قطع می‌کنی و Script می‌تواند ادامه پیدا کند.
⭐️ نکته
nohup به معنی «برنامه حتماً تحت هر شرایطی اجرا می‌ماند» نیست؛ فقط اثر Hangup را مدیریت می‌کند. خطاهای دیگر، Kill شدن پردازش و موارد مشابه همچنان می‌توانند آن را متوقف کنند.

—————————-

فصل نهم — قسمت ۹۲ 🐧
cron و at
این قسمت برای مدیریت Linux خیلی مهم است.
دو ابزار داریم:
at
cron

——————-

1. at
at برای اجرای یک‌باره یک دستور در زمان مشخص است.
مثلاً:
at 18:00

بعد داخل محیط at می‌نویسیم:
echo "Backup started" >> /tmp/backup.log

و در پایان:
Ctrl+D

یعنی:
این دستور یک بار در ساعت ۱۸ اجرا شود.


————————

اجرای یک Script با at
مثلاً:
at -f backup.sh 18:00

یعنی:
فایل

backup.sh
را در ساعت ۱۸ اجرا کن.

پس نکته‌ای که در جزوه‌ات نوشته‌ای درست است:
-f
→ مشخص کردن فایل حاوی دستورات برای at




——————-

2. cron
cron برای اجرای زمان‌بندی‌شده و تکرارشونده استفاده می‌شود.
مثلاً:
هر روز ساعت ۲
هر دوشنبه
هر ماه
هر ۵ دقیقه

برای مدیریت Cron کاربر:
crontab -e


——————-

ساختار Cron
ساختار استاندارد پنج فیلد زمانی:
┌──── دقیقه       0-59
│ ┌── ساعت 0-23
│ │ ┌─ روز ماه 1-31
│ │ │ ┌─ ماه 1-12
│ │ │ │ ┌─ روز هفته 0-7
│ │ │ │ │
* * * * *

مثلاً:
0 6 * * * /home/ali/backup.sh

یعنی:
هر روز ساعت ۶ صبح

backup.sh
اجرا شود.

مثال:
*/5 * * * * /home/ali/check.sh

یعنی:
هر ۵ دقیقه Script اجرا شود.

———————-
فصل نهم - قسمت نود و سوم🐧
استفاده از GitHub
———————
GitHub
یک پلتفرم برای نگهداری، اشتراک‌گذاری و مدیریت پروژه‌های نرم‌افزاری با Git است.
در دنیای Linux و Security خیلی کاربرد دارد، چون می‌توانی:
Scriptهای خودت را نگهداری کنی.
پروژه‌ها را Version Control کنی.
پروژه‌های Open Source را ببینی.
Scriptهای دیگران را بررسی کنی.
تغییرات پروژه را دنبال کنی.
مثلاً برای یک پروژه:
mkdir my-tool
cd my-tool

git init

بعد:
git add .
git commit -m "Initial commit"

و در صورت داشتن Repository روی GitHub، آن را به Remote متصل می‌کنی.
خب خب فصل نهم هم تمام شد

از فردا فصل دهم دوره الپیک1 قسمت 102 رو داریم
که فصل اخر الپیک1 و پایان دوره الپیک هستش