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
فصل دهم - قسمت نود و پنجم🐧
برسی ورود به سیستم

———————
بررسی ورود به سیستم
در لینوکس می‌توانیم ببینیم:
چه کاربرانی الان وارد سیستم هستند
هر کاربر از چه ترمینالی وصل شده
از چه زمانی وارد شده
چه کاری در حال انجام است
چه کسانی قبلاً وارد سیستم شده‌اند
حتی ورودهای مربوط به یک کاربر خاص مثل root
————————-
1️⃣ فرمان who
فرمان who نشان می‌دهد چه کاربرانی در حال حاضر وارد سیستم هستند.
who

مثلاً:
ali      pts/0    2026-09-03 18:20 (192.168.1.10)
root pts/1 2026-09-03 18:25 (192.168.1.20)

معنی ستون‌ها:
USER     TTY      LOGIN TIME        FROM

نکته مهم
who بیشتر برای پاسخ به این سؤال است:
الان چه کسانی روی سیستم Login هستند؟


————————-

2️⃣ who --all
برای نمایش اطلاعات کامل‌تر:
who --all

یا:
who -a

اطلاعات بیشتری درباره Sessionها و وضعیت Login نمایش می‌دهد.
🎯 نکته امتحانی:
who

→ کاربران فعلی
who -a

→ اطلاعات کامل‌تر Login/Session


——————————
3️⃣ فرمان w
فرمان w هم کاربران Login شده را نشان می‌دهد، ولی اطلاعات بیشتری درباره فعالیت فعلی آنها می‌دهد.
w

مثلاً:
USER   TTY    FROM           LOGIN@   IDLE   JCPU   PCPU  WHAT
ali pts/0 192.168.1.10 18:20 2:00 0.10s 0.02s bash
root pts/1 192.168.1.20 18:25 0.00s 0.05s 0.01s top

مهم‌ترین تفاوت:
who
فقط وضعیت Login کاربران را بررسی می‌کند.
w
علاوه بر Login، نشان می‌دهد کاربر الان چه کاری انجام می‌دهد.
مثلاً:
root → top
ali → bash

پس برای بررسی سریع سیستم، w خیلی کاربردی است.

—————
4️⃣ فرمان last
تا اینجا who و w وضعیت فعلی را بررسی می‌کردند.
اما last برای مشاهده Loginهای قبلی است.
last

مثلاً:
ali      pts/0    192.168.1.10    Thu Sep  3 18:20   still logged in
root pts/1 192.168.1.20 Thu Sep 3 17:10 - 17:45
ali pts/0 192.168.1.15 Wed Sep 2 22:10 - 23:30

یعنی last تاریخچه Login/Logout را نمایش می‌دهد.

————————

5️⃣ last root
اگر بخواهیم فقط ورودهای کاربر root را ببینیم:
last root

این دستور فقط رکوردهای مربوط به کاربر root را نمایش می‌دهد.
مثلاً:
root     pts/0    192.168.1.20    Thu Sep  3 17:10 - 17:45
root pts/1 192.168.1.30 Wed Sep 2 12:00 - 12:30

کاربرد امنیتی 🔐
این دستور برای بررسی ورودهای مشکوک به root بسیار مفید است.
مثلاً اگر ببینی:
root pts/0  185.x.x.x

و این IP برای خودت نیست، باید بررسی بیشتری انجام بدهی.
البته وجود یک Login از IP ناشناس به‌تنهایی اثبات نفوذ نیست؛ ممکن است NAT، VPN، Bastion یا سرویس مدیریتی در میان باشد.
فصل دهم - قسمت نود و ششم🐧
اسکن کردن سیستم
———————

قبل از اینکه یک مهاجم سیستم ما را بررسی کند، خودمان باید سیستم خودمان را بررسی کنیم.
هدف:
سرویس‌های غیرضروری را پیدا و غیرفعال کنیم.
پورت‌های باز را بررسی کنیم.
سرویس‌هایی که روی پورت‌ها Listen می‌کنند را شناسایی کنیم.
اتصال‌های IPv4 و IPv6 را بررسی کنیم.
سطح حمله سیستم را کاهش دهیم.
🔐 این دستورات را روی سیستم خودت، سرور خودت یا محیطی که اجازه تستش را داری اجرا کن.


——————-

1️⃣ اسکن TCP با Nmap
دستور:
nmap -sT 127.0.0.1

127.0.0.1 چیست؟
آدرس Loopback است و به خود سیستم اشاره می‌کند.
یعنی:
سیستم خودم → اسکن → خود سیستم

-sT چیست؟
TCP Connect Scan است.
Nmap تلاش می‌کند یک اتصال TCP واقعی به پورت ایجاد کند تا وضعیت آن را مشخص کند.
مثلاً ممکن است خروجی چیزی شبیه این باشد:
PORT     STATE    SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https

یعنی مثلاً روی سیستم:
22 → SSH
80 → HTTP
443 → HTTPS
در حال Listen هستند.


—————————-

2️⃣ اسکن UDP
در متن شما نوشته شده:
nmap -su 127.0.0.1

اما ⚠️ گزینه صحیح Nmap برای UDP این است:
nmap -sU 127.0.0.1

حروف گزینه مهم هستند؛ -sU یعنی:
UDP Scan

مثلاً:
nmap -sU 127.0.0.1

برای بررسی سرویس‌های UDP استفاده می‌شود.

—————-

3️⃣ بررسی پورت‌های Listen با netstat
دستور:
netstat --tcp --listening

یا شکل کوتاه:
netstat -tl

اگر UDP هم بخواهیم:
netstat -tul

معنی:
-t → TCP
-u → UDP
-l → Listening

پس:
netstat -tul

یعنی:
پورت‌های TCP و UDP که در حالت Listening هستند را نشان بده.


——————-

4️⃣ بررسی با ss
امروزه ss معمولاً انتخاب بهتری نسبت به netstat است.
دستور شما:
ss -ltu

معنی:
-l → Listening
-t → TCP
-u → UDP

مثلاً:
Netid   State    Local Address:Port
tcp LISTEN 0.0.0.0:22
tcp LISTEN 127.0.0.1:631
udp UNCONN 0.0.0.0:68


——————-
⭐️ نکته مهم امنیتی: 0.0.0.0
اگر ببینی:
0.0.0.0:22

یعنی سرویس روی تمام Interfaceهای IPv4 سیستم Listen می‌کند.
اما:
127.0.0.1:22

یعنی فقط از طریق Loopback قابل دسترسی است.
پس این دو با هم فرق دارند:
127.0.0.1:PORT
↓
فقط Local

0.0.0.0:PORT
↓
تمام IPv4 Interfaceها


—————-

5️⃣ بررسی با lsof
دستور:
lsof -iTCP -sTCP:LISTEN

می‌توانیم بفهمیم کدام Process یک پورت TCP را در اختیار دارد.
مثلاً:
COMMAND   PID   USER   FD   TYPE   DEVICE   NODE   NAME
sshd 850 root 3u IPv4 ... TCP *:ssh (LISTEN)

اینجا می‌فهمیم:
sshd
↓
PID 850
↓
TCP Port 22
↓
LISTEN


—————

6️⃣ بررسی پورت 22
دستور:
lsof -i tcp:22

این دستور نشان می‌دهد چه Processهایی از TCP Port 22 استفاده می‌کنند.
مثلاً:
sshd    850    root    TCP    *:ssh (LISTEN)

پس متوجه می‌شویم SSH توسط sshd روی پورت 22 فعال است.
7️⃣ دستور fuser
fuser هم برای پیدا کردن Processهایی که از یک فایل، Socket یا پورت استفاده می‌کنند کاربرد دارد.
TCP Port 22
fuser -vn tcp 22

یعنی:
چه Processهایی از TCP Port 22 استفاده می‌کنند؟

مثلاً:
                     USER     PID ACCESS COMMAND
22/tcp root 850 F.... sshd




———————

8️⃣ بررسی UDP
در متن شما:
fuser -vn udp 822

یعنی Processهایی که از UDP Port 822 استفاده می‌کنند را بررسی کن.
اگر منظورتان پورت دیگری بوده، فقط شماره پورت را تغییر می‌دهیم:
fuser -vn udp PORT



——————-

9️⃣ چرا IPv6 مهم است؟ 🌐
یکی از نکات مهم این قسمت همین است.
ممکن است شما IPv4 را بررسی کنی و مثلاً ببینی:
0.0.0.0:8080

اما سرویس از طریق IPv6 هم در دسترس باشد.
مثلاً:
[::]:8080

پس هنگام بررسی Listening Socketها باید IPv4 و IPv6 را هم در نظر بگیری.
در ss:
ss -lnt

و برای دیدن جزئیات بیشتر:
ss -lntup

همچنین می‌توانی خانواده آدرس را در خروجی ببینی:
tcp   LISTEN   0.0.0.0:22
tcp LISTEN [::]:22

اولی IPv4 و دومی IPv6 است.

——————————-
🛡 رویکرد امنیتی این قسمت
فرض کن یک سرور Linux داری.
اول:
ss -lntup

می‌زنی.
می‌بینی:
22     ssh
80 nginx
3306 mysql
8080 unknown-service

حالا سؤال مهم:
آیا واقعاً به همه این سرویس‌ها نیاز دارم؟

اگر مثلاً MySQL فقط باید توسط برنامه‌ای روی همان سرور استفاده شود، بهتر است نیازی به Public Listening نداشته باشد.
یا اگر یک سرویس کاملاً غیرضروری است:
پیدا کردن سرویس
↓
بررسی نیاز
↓
غیرفعال کردن سرویس
↓
کاهش سطح حمله

این همان مفهوم Hardening است.
فصل دهم - قسمت نود و هفتم🐧
امن سازی دسترسی و رمز عبور
———————

امن‌سازی دسترسی و رمز عبور
هدف این قسمت اینه که یاد بگیریم در لینوکس:
رمز عبور کاربران کجا نگهداری می‌شود؟
چطور رمز کاربر را تنظیم یا تغییر دهیم؟
چطور حساب کاربری را Lock کنیم؟
گروه‌های sudo و wheel چه کاربردی دارند؟
چطور دسترسی sudo را به‌صورت امن تنظیم کنیم؟
visudo چیست؟

——————————-

1️⃣ محل ذخیره رمز عبور کجاست؟
در لینوکس اطلاعات مربوط به حساب کاربران در:
/etc/passwd

قرار دارد.
اما رمز عبور واقعی در /etc/passwd ذخیره نمی‌شود.
هش رمز عبور معمولاً در:
/etc/shadow

ذخیره می‌شود.
مثلاً:
sudo cat /etc/shadow

فایل /etc/shadow شامل اطلاعات حساس مربوط به احراز هویت است و دسترسی آن باید محدود باشد.
ساختار کلی یک خط:
username:$hash:...

مقدار مربوط به رمز، Hash است، نه خود Password به صورت Plain Text.
🎯 نکته امتحانی
/etc/passwd
→ اطلاعات عمومی‌تر حساب کاربران

/etc/shadow
→ اطلاعات حساس احراز هویت و Hash رمز عبور



———————

2️⃣ چرا رمز در /etc/shadow است؟
اگر Hash رمز داخل /etc/passwd بود، با توجه به اینکه /etc/passwd معمولاً برای کاربران قابل خواندن است، امنیت پایین‌تر می‌آمد.
به همین دلیل اطلاعات حساس به:
/etc/shadow

منتقل شده و دسترسی به آن محدودتر است.


————————
3️⃣ تنظیم یا تغییر رمز عبور
برای تغییر رمز کاربر فعلی:
passwd

سیستم از شما رمز فعلی و سپس رمز جدید را می‌خواهد.
برای تغییر رمز یک کاربر دیگر، معمولاً باید دسترسی مدیریتی داشته باشید:
sudo passwd username

مثلاً:
sudo passwd ali



————————

4️⃣ Lock کردن کاربر 🔒
برای Lock کردن حساب:
sudo passwd -l username

مثلاً:
sudo passwd -l ali

-l یعنی:
Lock

برای باز کردن Lock:
sudo passwd -u ali

یعنی:
Unlock


——————

روش دیگر با usermod
می‌توان از:
sudo usermod -L ali

برای Lock استفاده کرد.
و:
sudo usermod -U ali

برای Unlock.
نکته
این دستورات با تغییر وضعیت رمز/حساب کار می‌کنند؛ برای مسدودسازی کامل دسترسی یک حساب در همه روش‌های احراز هویت، باید سیاست‌های سرویس و سیستم را هم در نظر گرفت.


————————-
5️⃣ گروه sudo
در توزیع‌هایی مثل Debian و Ubuntu، گروه:
sudo

معمولاً برای دادن دسترسی اجرای دستورات با sudo استفاده می‌شود.
مثلاً:
sudo usermod -aG sudo ali

حالا کاربر ali عضو گروه sudo می‌شود.
بررسی عضویت:
groups ali

یا:
id ali


————————-

6️⃣ گروه wheel
در بسیاری از توزیع‌های Red Hat مانند:
RHEL
CentOS
Fedora
AlmaLinux
گروه:
wheel

برای دسترسی مدیریتی از طریق sudo استفاده می‌شود.
مثلاً:
sudo usermod -aG wheel ali

بعد از Login مجدد، کاربر می‌تواند طبق تنظیمات sudo از دسترسی مدیریتی استفاده کند.
⭐️ تفاوت مهم
Debian / Ubuntu
→ sudo

RHEL / CentOS / Fedora / AlmaLinux
→ wheel

البته این یک قاعده رایج است، نه یک قانون مطلق؛ تنظیمات واقعی /etc/sudoers تعیین می‌کند چه گروهی چه دسترسی‌ای داشته باشد.



—————————-


7️⃣ sudoers چیست؟
تنظیمات مربوط به اینکه چه کسی چه دستورات مدیریتی را با sudo اجرا کند در:
/etc/sudoers

تعریف می‌شود.
مثلاً ممکن است قوانینی برای:
USER
GROUP
COMMAND
HOST

وجود داشته باشد.
⚠️ فایل sudoers بسیار حساس است.
یک Syntax اشتباه می‌تواند باعث شود sudo درست کار نکند.



——————————

8️⃣ چرا visudo؟
به جای اینکه مستقیم بنویسیم:
sudo nano /etc/sudoers

روش استاندارد این است:
sudo visudo

visudo فایل sudoers را با بررسی Syntax ویرایش می‌کند.
یعنی اگر اشتباه Syntax داشته باشیم، احتمال خراب شدن تنظیمات sudo کمتر می‌شود.
🎯 نکته امتحانی خیلی مهم
visudo
↓
ویرایش امن‌تر /etc/sudoers
↓
بررسی Syntax




———————

9️⃣ مثال ساده visudo
فرض کنیم می‌خواهیم گروه wheel دسترسی sudo داشته باشد.
با:
sudo visudo

تنظیمات مربوط به گروه را بررسی یا تنظیم می‌کنیم.
در بسیاری از سیستم‌های RHEL-like ممکن است خطی شبیه این وجود داشته باشد:
%wheel ALL=(ALL) ALL

معنی کلی:
%wheel
↓
گروه wheel

ALL
↓
روی همه Hostها

(ALL)
↓
به‌عنوان کاربران مجاز

ALL
↓
تمام Commandها

⚠️ این یک دسترسی بسیار قدرتمند است؛ روی سرور واقعی باید فقط به کاربر/گروهی داده شود که واقعاً نیاز دارد.

—————————
🔐 یک سناریوی واقعی
فرض کن یک سرور Linux داری و کاربر:
ali

نباید با root مستقیماً کار کند، اما باید بتواند بعضی کارهای مدیریتی انجام دهد.
به‌جای دادن Password مربوط به root:
ali
↓
sudo
↓
دستور مدیریتی
↓
احراز هویت
↓
اجرای دستور با سطح دسترسی مناسب

این مدل معمولاً مدیریت دسترسی را بهتر می‌کند.
فصل دهم - قسمت نود و هشتم🐧
استفاده از ssh - SSH hardening
———————

1️⃣ چرا SSH؟
SSH = Secure Shell
برای اتصال امن و Remote به یک سیستم لینوکس استفاده می‌شود.
مثلاً از کامپیوتر خودمان:
ssh ali@192.168.1.100

به سرور وصل می‌شویم.
SSH ارتباط را رمزنگاری می‌کند؛ بنابراین اطلاعاتی مثل دستورات و اطلاعات احراز هویت در مسیر به‌صورت ساده ارسال نمی‌شوند.
پورت پیش‌فرض SSH:
TCP/22


——————-

2️⃣ احراز هویت با Password
روش ساده:
ssh ali@192.168.1.100

بعد سیستم Password می‌خواهد:
ali@192.168.1.100's password:

اما برای سرورهای مهم، استفاده از SSH Key Authentication معمولاً امن‌تر و مناسب‌تر است.

————————-

3️⃣ SSH Key چیست؟
SSH از یک جفت کلید استفاده می‌کند:
Public Key
+
Private Key

به این مدل می‌گوییم:
Public/Private Key Pair


———————-

4️⃣ Private Key 🔴
Private Key باید محرمانه بماند.
مثلاً:
~/.ssh/id_ed25519

یا در بعضی سیستم‌ها:
~/.ssh/id_rsa

⚠️ Private Key را نباید برای کسی ارسال کنیم.
مثلاً:
❌ Telegram
❌ Email
❌ GitHub
❌ ارسال برای شخص دیگر



———————

5️⃣ Public Key 🟢
Public Key برخلاف Private Key می‌تواند روی سرور مقصد قرار بگیرد.
مثلاً:
~/.ssh/id_ed25519.pub

ساختار کلی:
Client
│
├── Private Key 🔴
│
└── Public Key 🟢
↓
Server

Private Key روی Client می‌ماند.
Public Key روی Server قرار می‌گیرد.

———————

6️⃣ ساخت SSH Key
در متن شما نوشته شده:
ssh-keyen

اما دستور صحیح:
ssh-keygen

مثلاً روش پیشنهادی امروزی:
ssh-keygen -t ed25519

بعد ممکن است بپرسد:
Enter file in which to save the key:

و سپس:
Enter passphrase:



——————-

7️⃣ Passphrase چیست؟
Passphrase یک رمز برای محافظت از Private Key است.
یعنی:
Private Key
↓
Passphrase
↓
استفاده امن‌تر از Key

پس دو مفهوم را قاطی نکن:
Password
رمز حساب کاربری روی سرور.
Passphrase
رمزی که می‌تواند Private Key را روی سیستم خودت محافظت کند.

———————————

8️⃣ فعال کردن SSH Key روی سرور
بعد از ساخت Key، باید Public Key را روی سرور قرار دهیم.
روش راحت:
ssh-copy-id ali@192.168.1.100

بعد از وارد کردن Password، Public Key در فایل:
~/.ssh/authorized_keys

روی سرور قرار می‌گیرد.



——————————

9️⃣ اتصال با SSH Key
حالا:
ssh ali@192.168.1.100

SSH از Private Key موجود در سیستم Client استفاده می‌کند و Public Key موجود روی Server برای احراز هویت استفاده می‌شود.
ساختار:
Client                         Server

Private Key 🔴 ────────→ Public Key 🟢
│
↓
authorized_keys

در واقع Private Key به سرور ارسال نمی‌شود؛ کلاینت با آن در فرآیند احراز هویت اثبات می‌کند که کلید خصوصی مربوط به Public Key را در اختیار دارد.


—————————-

🔟 تغییر پورت SSH
فایل تنظیمات SSH Server:
/etc/ssh/sshd_config

باز کردن:
sudo nano /etc/ssh/sshd_config

پیدا کردن:
#Port 22

و مثلاً تغییر به:
Port 2222

بعد بررسی تنظیمات:
sudo sshd -t

اگر خطایی نداد، سرویس را Reload/Restart می‌کنیم:
sudo systemctl restart ssh

در بعضی توزیع‌ها نام سرویس:
sudo systemctl restart sshd

است.
⚠️ نکته مهم
قبل از تغییر پورت روی سرور Remote، مطمئن شو Firewall هم پورت جدید را اجازه می‌دهد و Session فعلی SSH را تا زمان تست اتصال جدید نبند؛ وگرنه ممکن است دسترسی خودت را قطع کنی.

—————————-
1️⃣1️⃣ غیرفعال کردن Password Authentication 🔐
این همان چیزی است که پرسیدی.
وقتی مطمئن شدی SSH Key Login درست کار می‌کند، می‌توانی Password Authentication را غیرفعال کنی.
فایل:
sudo nano /etc/ssh/sshd_config

این گزینه را تنظیم کن:
PasswordAuthentication no

سپس:
sudo sshd -t

اگر Syntax صحیح بود:
sudo systemctl reload ssh

یا در برخی سیستم‌ها:
sudo systemctl reload sshd

از این به بعد احراز هویت با Password برای SSH غیرفعال می‌شود و روش‌های دیگری که در تنظیمات مجاز مانده‌اند می‌توانند استفاده شوند.

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

⭐️ گزینه مهم دیگر: KbdInteractiveAuthentication
در بعضی سیستم‌ها، فقط گذاشتن:
PasswordAuthentication no

برای سیاست موردنظر کافی نیست؛ چون ممکن است احراز هویت تعاملی Keyboard/Challenge هنوز فعال باشد.
اگر هدفت این است که احراز هویت تعاملی رمز عبور هم غیرفعال شود، بسته به نسخه OpenSSH می‌توانی:
KbdInteractiveAuthentication no

را نیز تنظیم کنی.
در سیستم‌های قدیمی‌تر ممکن است گزینه‌ای مثل:
ChallengeResponseAuthentication no

دیده شود.
پس برای Hardening باید روش‌های Authentication فعال روی همان سیستم را بشناسی، نه اینکه فقط یک خط را کورکورانه تغییر بدهی.

————————-

1️⃣2️⃣ جلوگیری از Login مستقیم Root
یکی دیگر از تنظیمات مهم SSH:
PermitRootLogin no

در:
/etc/ssh/sshd_config

این باعث می‌شود Login مستقیم root از طریق SSH ممنوع شود.
مثلاً:
PermitRootLogin no
PasswordAuthentication no

مدل امن‌تر:
User
↓
SSH Key
↓
Login
↓
sudo
↓
Administrative command

به‌جای:
root
↓
Password
↓
SSH

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

🛡 SSH Hardening به‌صورت خلاصه
برای یک سرور، معمولاً این موارد را بررسی می‌کنیم:
1. استفاده از SSH Key
2. Private Key را محرمانه نگه داشتن
3. استفاده از Passphrase
4. غیرفعال کردن Password Authentication در صورت امکان
5. بررسی KbdInteractiveAuthentication
6. جلوگیری از Root Login مستقیم
7. تغییر پورت در صورت نیاز
8. محدود کردن دسترسی Firewall
9. بررسی کاربران مجاز
10. نگهداری امن Private Key

نکته: تغییر پورت 22 به یک پورت دیگر به‌تنهایی یک کنترل امنیتی قوی نیست؛ بیشتر باعث کاهش اسکن‌های خودکار و Noise می‌شود. کنترل‌های اصلی‌تر، احراز هویت کلیدی، محدودسازی دسترسی و Hardening تنظیمات SSH هستند.
فصل دهم- قسمت آخر - قسمت نود و نهم🐧
رمزنگاری فایل ها در لینوکس
———————

رمزنگاری فایل‌ها در لینوکس با GPG
GPG = GNU Privacy Guard
یکی از ابزارهای معروف لینوکس برای:
رمزنگاری فایل
رمزگشایی فایل
ساخت کلید
امضای دیجیتال
بررسی امضای دیجیتال
است.

—————————
1️⃣ سناریوی عملی بین دو Host
فرض کنیم دو سرور داریم:
Host 1                         Host 2
------- -------
192.168.1.10 192.168.1.20
Sender Receiver

می‌خواهیم:
Host 1
│
│ فایل محرمانه
↓
GPG Encryption
│
↓
encrypted.gpg
│
│ انتقال
↓
Host 2
│
↓
GPG Decryption
│
↓
فایل اصلی


———————

2️⃣ روش اول: رمزنگاری با Password
این ساده‌ترین روش GPG است.
روی Host 1 یک فایل بساز:
echo "This is a secret file" > secret.txt

حالا رمزنگاری:
gpg -c secret.txt

-c یعنی:
symmetric encryption

GPG از شما یک Password می‌خواهد.
بعد فایل زیر ساخته می‌شود:
secret.txt.gpg

حالا:
ls

ممکن است ببینی:
secret.txt
secret.txt.gpg

———————-

3️⃣ انتقال فایل از Host 1 به Host 2
مثلاً با scp:
روی Host 1:
scp secret.txt.gpg user@192.168.1.20:/home/user/

حالا فایل رمزنگاری‌شده روی Host 2 قرار دارد.

—————————

4️⃣ رمزگشایی در Host 2
روی Host 2:
gpg -d secret.txt.gpg

-d یعنی:
decrypt

یا برای اینکه فایل خروجی را مشخص کنیم:
gpg -o secret.txt -d secret.txt.gpg

بعد:
cat secret.txt

و محتوای اصلی را می‌بینیم.
نکته مهم
در روش Symmetric:
Host 1
│
│ Password
↓
Encrypt
↓
secret.txt.gpg
│
↓
Host 2
│
│ همان Password
↓
Decrypt

بنابراین هر دو طرف باید رمز مشترک را داشته باشند.



——————————

5️⃣ روش دوم: Public Key / Private Key 🔐
این روش برای ارتباط Host 1 و Host 2 بسیار مهم‌تر است.
در این روش:
Public Key  → قابل انتشار
Private Key → محرمانه

فرض کنیم:
Host 2 = Receiver
Host 1 = Sender

ما می‌خواهیم Host 1 فایلی را برای Host 2 رمزنگاری کند.


——————-

6️⃣ ساخت Key در Host 2
روی Host 2:
gpg --full-generate-key

GPG چند سؤال می‌پرسد، مثل:
Key type
Key size
Expiration
Real name
Email
Passphrase

در نهایت Key Pair ساخته می‌شود:
Public Key
Private Key

7️⃣ مشاهده کلیدها
برای مشاهده Public Key:
gpg --list-keys

برای مشاهده Private Key:
gpg --list-secret-keys

پس:
gpg --list-keys
→ Public Keys

gpg --list-secret-keys
→ Secret/Private Keys

8️⃣ Export کردن Public Key در Host 2
چون Host 1 باید Public Key مربوط به Host 2 را داشته باشد، روی Host 2:
gpg --export --armor user@example.com > host2-public.asc

یا می‌توان از Key ID استفاده کرد.
--armor باعث می‌شود خروجی به شکل متنی ASCII قابل انتقال باشد.
فایل:
host2-public.asc

حالا می‌توانیم آن را به Host 1 منتقل کنیم:
scp host2-public.asc user@192.168.1.10:/home/user/

9️⃣ Import کردن Public Key در Host 1
روی Host 1:
gpg --import host2-public.asc

بررسی:
gpg --list-keys

حالا Host 1 Public Key مربوط به Host 2 را دارد.

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

🔟 رمزنگاری فایل در Host 1
فرض کنیم:
secret.txt

داریم.
روی Host 1:
gpg --encrypt --recipient user@example.com secret.txt

یا کوتاه‌تر:
gpg -e -r user@example.com secret.txt

فایل جدید:
secret.txt.gpg

ساخته می‌شود.
چه اتفاقی افتاد؟
Host 1
secret.txt
│
↓
Public Key مربوط به Host 2
│
↓
Encryption
│
↓
secret.txt.gpg


—————-
1️⃣1️⃣ انتقال فایل رمزنگاری‌شده به Host 2
scp secret.txt.gpg user@192.168.1.20:/home/user/

حالا فایل رمزنگاری‌شده روی Host 2 است.

———————-

1️⃣2️⃣ رمزگشایی در Host 2
روی Host 2:
gpg --decrypt secret.txt.gpg

یا:
gpg -d secret.txt.gpg

GPG از Private Key مربوط به Host 2 استفاده می‌کند.
اگر برای Private Key Passphrase تعیین کرده باشی، آن را می‌خواهد.
برای ذخیره خروجی:
gpg -o secret.txt -d secret.txt.gpg

حالا:
cat secret.txt

فایل اصلی را خواهیم داشت.

—————————————-
⭐️ نکته بسیار مهم
در رمزنگاری Public/Private:
رمزنگاری:
Public Key گیرنده
↓
Encrypt

رمزگشایی:
Private Key گیرنده
↓
Decrypt

پس:
با Public Key رمزنگاری می‌کنیم و با Private Key متناظر رمزگشایی می‌کنیم.



——————————-

1️⃣3️⃣ چرا Private Key را منتقل نمی‌کنیم؟ 🔴
فرض کن Host 2 این را دارد:
Private Key 🔴

این کلید نباید برای Host 1 ارسال شود.
Host 1 فقط باید داشته باشد:
Public Key 🟢

بنابراین:
Host 2
├── Public Key → می‌تواند به Host 1 بدهد
└── Private Key → محرمانه، فقط Host 2

1️⃣4️⃣ یک نکته امنیتی خیلی مهم: اعتماد به Public Key
فقط اینکه یک Public Key را از Host 2 دریافت کرده‌ای، لزوماً ثابت نمی‌کند که واقعاً متعلق به Host 2 است.
برای اطمینان می‌توان Fingerprint کلید را بررسی کرد.
مثلاً:
gpg --fingerprint user@example.com

Fingerprint را از یک کانال مورد اعتماد با Fingerprint واقعی مقایسه می‌کنیم.


————————
1️⃣5️⃣ امضای دیجیتال
GPG فقط برای Encrypt کردن نیست.
می‌توانیم فایل را Sign کنیم.
مثلاً:
gpg --detach-sign file.txt

ممکن است فایلی مثل:
file.txt.sig

ایجاد شود.
طرف مقابل می‌تواند امضا را بررسی کند:
gpg --verify file.txt.sig file.txt

اینجا هدف اصلی:
Confidentiality ❌

نیست؛ بلکه:
Integrity
+
Authenticity

است.
یعنی بتوانیم بررسی کنیم فایل تغییر نکرده و امضا با کلید مورد انتظار ایجاد شده است.

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

🧠 تفاوت SSH و GPG
این دو را قاطی نکن:
SSH
برای:
Remote Login
Secure Connection
Authentication

مثلاً:
ssh user@server

GPG
برای:
File Encryption
File Decryption
Digital Signature
Key Management

مثلاً:
gpg -e -r user@example.com secret.txt
خب خب فصل 10 هم تمام شد

الپیک 1 که به دو قسمت 101 و 102 بود کلا تمام شد


به امید خدا از فردا پایتون مقدماتی رو استارت میزنیم
❤1🔥1🎉1
دوتا دوره تمام شده به ترتیب
👇👇👇👇

1️⃣: دوره نتورک پلاس از اول

———————————————————
———————————————————
2️⃣: دوره الپیک1 از اول
———————————————————
———————————————————
3️⃣: دوره پایتون مقدماتی
———————————————————
———————————————————
4️⃣: دوره MCSA
❤2
فصل اول - دوره پایتون مقدماتی - برنامه نویسی چیست؟
————————————-


1. برنامه‌نویسی چیست؟
خیلی ساده:
برنامه‌نویسی یعنی نوشتن دستوراتی که کامپیوتر بتواند آن‌ها را اجرا کند.
مثلاً به کامپیوتر می‌گوییم:
print(1 + 2)

کامپیوتر باید بفهمد:
عدد اول 1 است،
عملگر

+
یعنی جمع،
عدد دوم 2 است،
نتیجه می‌شود 3،
و آن را نمایش بده.

خروجی:
3



————————

2. کامپیوتر چطور دستور ما را می‌فهمد؟
اینجا می‌رسیم به مهم‌ترین قسمت:
کامپیوتر در پایین‌ترین سطح با 0 و 1 کار می‌کند.
به این‌ها می‌گوییم:
Binary / باینری
مثلاً:
01000001

برای کامپیوتر این یک الگوی بیت است که می‌تواند معنای مشخصی داشته باشد.
اما ما انسان‌ها نمی‌خواهیم برای انجام هر کاری 0 و 1 بنویسیم 😂
مثلاً تصور کن بخواهی برای جمع 1 و 2 مستقیماً دستورهای ماشین را بنویسی!
پس زبان‌های برنامه‌نویسی به وجود آمدند.
ما می‌نویسیم:
1 + 2

و ابزارهای مختلف آن را به چیزی تبدیل می‌کنند که کامپیوتر بتواند اجرا کند.

—————————-

3. اصلاً برنامه‌نویسی چطور به وجود آمد؟
در ابتدا برنامه‌نویسی خیلی نزدیک به زبان ماشین بود.
بعد زبان‌های سطح پایین‌تر مثل Assembly به وجود آمدند.
بعد زبان‌های سطح بالاتر ایجاد شدند؛ مثل:
C
C++
Java
Python
JavaScript
و...
هدف این بود که انسان بتواند به شکل ساده‌تری به کامپیوتر دستور بدهد.
مثلاً به جای کار مستقیم با دستورهای ماشین، در Python می‌نویسیم:
x = 10
y = 20

print(x + y)


————————-
4. کامپایلر چیست؟ 🛠
Compiler (کامپایلر) برنامه‌ای است که کد منبع ما را قبل از اجرا، به کدی تبدیل می‌کند که ماشین بتواند اجرا کند.
به شکل ساده:
Source Code
↓
Compiler
↓
Machine Code / Executable
↓
CPU

مثلاً در زبان C:
printf("Hello");

کامپایلر کد را بررسی و ترجمه می‌کند و در نهایت معمولاً یک فایل اجرایی تولید می‌شود.
نکته مهمی که استاد گفت:
اگر در مرحله کامپایل خطای جدی وجود داشته باشد، معمولاً برنامه اجرایی ساخته نمی‌شود یا نسخه قابل‌اجرای جدید تولید نمی‌شود.
مثلاً:
int x = ;

کد اشتباه است.
کامپایلر خطا می‌دهد و باید آن را اصلاح کنیم.

——————————

5. Interpreter یا مفسر چیست؟ 🧠
Interpreter (مفسر) روشی/برنامه‌ای است که کد را هنگام اجرا تفسیر می‌کند.
به صورت ساده:
Source Code
↓
Interpreter
↓
اجرا

مثلاً در Python وقتی می‌نویسیم:
print("Hello")

مفسر Python این دستور را پردازش می‌کند تا اجرا شود.
یک نکته مهم ⚠️
این جمله که:
«کامپایلر اگر خروجی خوب نشه اجرا نمی‌کنه ولی Interpreter اجرا می‌کنه»

برای آموزش مقدماتی بد نیست، ولی کاملاً دقیق نیست.
Python را هم نباید صرفاً «یک زبان کاملاً Interpreter شده» در نظر گرفت؛ پیاده‌سازی استاندارد CPython ابتدا کد Python را به Bytecode تبدیل می‌کند و سپس ماشین مجازی Python آن را اجرا می‌کند.
پس فعلاً این مدل ذهنی را داشته باش:
C
Source → Compiler → Executable → CPU


Python
Source → Python Interpreter/Runtime → Execution


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

6. Python چیست؟ 🐍
Python یک زبان برنامه‌نویسی سطح بالا، عمومی و چندمنظوره است.
یعنی با آن می‌توانیم کارهای مختلفی انجام دهیم:
🌐 Web Development
ساخت وب‌سایت و API
📊 Data Analysis
تحلیل داده
🤖 Artificial Intelligence
هوش مصنوعی و Machine Learning
🛡 Cyber Security
اتوماسیون امنیتی، تحلیل لاگ، کار با شبکه، ساخت ابزار و...
⚙️ Automation
خودکارسازی کارهای تکراری

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

7. Python را چه کسی ساخت؟
Python توسط:
Guido van Rossum
ساخته شد.
5
توسعه Python در اواخر دهه 1980 شروع شد و اولین انتشار عمومی آن در سال 1991 انجام شد.
اسم Python هم از مار گرفته نشده 😄؛ نام‌گذاری آن به برنامه طنز بریتانیایی Monty Python's Flying Circus مربوط است.

———————————

8. Python روی چه پلتفرم‌هایی کار می‌کند؟
Python تقریباً روی تمام سیستم‌عامل‌های اصلی قابل استفاده است:
🪟 Windows
🐧 Linux
🍎 macOS
و پلتفرم‌های دیگر
یعنی مثلاً اگر روی Ubuntu کار کنی:
python3

و روی Windows Python نصب کرده باشی، می‌توانی از آن استفاده کنی.
این موضوع برای مسیر امنیتی تو خیلی مهم است، چون بعداً همزمان با Linux + Python + Network کار خواهیم کرد.

—————————-

9. Library چیست؟ 📚
Library یا کتابخانه مجموعه‌ای از کدهای آماده است که دیگران نوشته‌اند و ما می‌توانیم در برنامه خودمان استفاده کنیم.
مثلاً به جای اینکه خودمان از صفر همه الگوریتم‌های ریاضی را بنویسیم، می‌توانیم از کتابخانه استفاده کنیم.
مثلاً:
import math

print(math.sqrt(25))

خروجی:
5.0


——————————
10. دو Library مهم در هوش مصنوعی 🤖
اگر بخواهیم دو مورد خیلی معروف را نام ببریم:
① NumPy
برای محاسبات عددی و کار با آرایه‌ها بسیار مهم است.
import numpy as np

② PyTorch
یکی از مهم‌ترین کتابخانه‌ها/فریم‌ورک‌های یادگیری ماشین و Deep Learning است.
import torch

البته در AI کتابخانه‌های مهم دیگری مثل TensorFlow و scikit-learn هم داریم.



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

11. Python در تحلیل داده 📊
اینجا اسم مهمی که استاد گفت:
Pandas
Pandas برای کار با داده‌های جدولی و تحلیل داده بسیار پرکاربرد است.
مثلاً:
import pandas as pd

بعد می‌توانیم اطلاعات یک فایل CSV را بخوانیم:
data = pd.read_csv("users.csv")

و داده‌ها را تحلیل کنیم.
مثلاً:
Name       Age
Ali 25
Reza 30
Sara 22

Pandas کمک می‌کند با چنین داده‌هایی راحت کار کنیم.
———————————

12. Python در Cyber Security 🛡
این قسمت برای مسیر خودت خیلی مهمه.
Python در امنیت سایبری کاربردهای زیادی دارد.
مثلاً:
🔎 Network
کار با IP، Port و Socket
import socket

📄 Log Analysis
تحلیل لاگ‌های سیستم و سرور.
⚙️ Automation
مثلاً به جای اینکه 100 سرور را دستی بررسی کنیم، اسکریپتی بنویسیم که این کار را انجام دهد.
🌐 HTTP
کار با Web/API:
import requests

🔐 Security Tools
ساخت ابزارهای ساده برای:
بررسی سرویس‌ها
تحلیل فایل‌ها
پردازش لاگ
اتوماسیون تست‌های امنیتی مجاز
Network Automation
اینجاست که Network+ + Linux + Python کنار هم خیلی ارزشمند می‌شوند.

———————-

13. Python را از کجا دانلود کنیم؟
بهترین و امن‌ترین منبع:
سایت رسمی Python
python.org
برای Windows معمولاً از بخش Downloads نسخه مناسب را دریافت می‌کنی.
هنگام نصب روی Windows یک گزینه بسیار مهم وجود دارد:
Add Python to PATH

✅ بهتر است آن را فعال کنی.
بعد از نصب می‌توانی در CMD بررسی کنی:
python --version

یا:
py --version

مثلاً:
Python 3.x.x
❤1
فصل دوم - پایتون مقدماتی - نصب پایتون در VSCODE
————————————-
🐍 فصل دوم — نصب و راه‌اندازی Python در VS Code
1. VS Code چیست؟
Visual Studio Code (VS Code) یک ویرایشگر کد است که برای نوشتن و اجرای برنامه‌ها استفاده می‌شود.
ما می‌توانیم داخلش کد Python بنویسیم، اجرا کنیم، خطاها را ببینیم و پروژه‌هایمان را مدیریت کنیم.
نکته: VS Code خودش Python نیست.
VS Code محیطی برای کار کردن با Python است و باید Python را جداگانه نصب کنیم.

———————-
2. چیزهایی که نیاز داریم
برای شروع فقط دو چیز لازم داریم:

🐍 Python
خود زبان و محیط اجرای Python

💻 VS Code
محیطی که داخل آن کد می‌نویسیم.

——————————-
3. نصب Python
اول Python را از سایت رسمی دانلود می‌کنیم:
دانلود Python از سایت رسمی
در Windows نسخه مناسب را دانلود کن.
هنگام نصب، این گزینه را حتماً تیک بزن:
☑️ Add python.exe to PATH

بعد:
Install Now

را بزن.

————————-

4. بررسی نصب Python
بعد از نصب، CMD را باز کن و بزن:
python --version

اگر درست نصب شده باشد، چیزی شبیه این می‌بینی:
Python 3.x.x

همچنین می‌توانی بزن:
py --version


——————-

5. نصب VS Code
حالا VS Code را دانلود می‌کنیم:
دانلود Visual Studio Code از سایت رسمی
نسخه Windows را دانلود و نصب کن.
در هنگام نصب، اگر گزینه‌هایی مثل اضافه کردن VS Code به PATH یا Open with Code را دیدی، فعال کردنشان می‌تواند کار با VS Code را راحت‌تر کند.

—————————-
6. اتصال Python به VS Code 🔗
حالا VS Code را باز کن.
از سمت چپ وارد:
Extensions
شو.
یا کلیدهای زیر را بزن:
Ctrl + Shift + X

در قسمت Search بنویس:
Python

افزونه رسمی Python منتشرشده توسط Microsoft را نصب کن.

این افزونه امکاناتی مثل:
اجرای Python
تشخیص خطا
پیشنهاد کد
Debug
انتخاب Interpreter

را در اختیارمان قرار می‌دهد.

———————————

7. انتخاب Python Interpreter
این قسمت خیلی مهمه.
در VS Code:
Ctrl + Shift + P

را بزن.
بعد جستجو کن:
Python: Select Interpreter

روی آن کلیک کن.
حالا نسخه Python نصب‌شده روی سیستم را انتخاب کن.
مثلاً:
Python 3.13.x

یا هر نسخه‌ای که نصب کرده‌ای.
Interpreter یعنی چی؟
خیلی ساده:
Interpreter همان برنامه‌ای است که کد Python ما را اجرا می‌کند.
مثلاً ممکن است روی سیستم چند Python داشته باشیم:
Python 3.11
Python 3.12
Python 3.13

با Select Interpreter به VS Code می‌گوییم:
«برای اجرای این پروژه از این Python استفاده کن.»



———————————-
8. ساخت اولین پروژه 🐍
یک پوشه بساز، مثلاً:
Python-Course

بعد در VS Code:
File → Open Folder

و پوشه Python-Course را انتخاب کن.
حالا یک فایل جدید بساز:
hello.py

پسوند:
.py

یعنی این فایل، فایل Python است.

————————————
9. اولین برنامه Python 🎉
داخل hello.py بنویس:
print("Hello World")

حالا می‌توانی از دکمه ▶️ بالای صفحه آن را اجرا کنی.
خروجی:
Hello World


————————-

10. اجرای Python از Terminal
می‌توانیم بدون دکمه Run هم برنامه را اجرا کنیم.
در VS Code:
Terminal → New Terminal

بعد بنویس:
python hello.py

خروجی:
Hello World

این روش برای تو خیلی مهمه چون بعداً در Linux و Cyber Security زیاد با Terminal کار خواهیم کرد.

—————————-

11. یک تست ساده‌تر
فایل test.py بساز:
name = "Ali"
age = 25

print(name)
print(age)

اجرا کن:
python test.py

خروجی:
Ali
25

🎯 این یعنی ارتباط Python و VS Code درست انجام شده.

————————

⚠️ اگر Python در VS Code اجرا نشد
اول در Terminal بزن:
python --version

اگر Python پیدا نشد، احتمالاً مشکل PATH داریم.
اگر Python نصب است ولی VS Code نسخه اشتباهی را انتخاب کرده:
Ctrl + Shift + P
↓
Python: Select Interpreter
↓
انتخاب Python صحیح



———————————-
🐍 فصل دوم — پایتون مقدماتی — Variable و Data Type
——————————————
1. Variable یا متغیر چیست؟
خیلی ساده:
متغیر یک اسم برای نگهداری یک مقدار در حافظه است.
مثلاً:
age = 25

اینجا:
age → نام متغیر
= → مقداردهی
25 → مقدار متغیر
یعنی به زبان ساده:
مقدار 25 را در متغیری به نام

age
قرار بده.

حالا هر وقت بنویسیم:
print(age)

خروجی:
25

——————————
2. String چیست؟ 🔤
اگر چیزی داخل کوتیشن قرار بگیرد، Python آن را String در نظر می‌گیرد.
مثلاً:
name = "Ali"

یا:
name = 'Ali'

هر دو String هستند.
حتی اگر داخل کوتیشن عدد بنویسیم:
name = "25"

این دیگر عدد نیست؛ String است.
پس:
age = 25

عدد است.
اما:
age = "25"

رشته یا String است.
تفاوت خیلی مهم:
a = 10
b = "10"

a عدد است ولی b متن است.

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

3. Integer چیست؟ 🔢
عددهای صحیح بدون اعشار در Python از نوع:
Integer یا int
هستند.
مثلاً:
age = 25
score = 100
number = -10

همه int هستند.

—————————

4. Float چیست؟ 🔢
اعداد اعشاری از نوع:
Float یا float
هستند.
مثلاً:
a = 4.6
b = 10.5
c = 3.14

——————————-

5. None چیست؟
گاهی می‌خواهیم بگوییم:
این متغیر فعلاً هیچ مقداری ندارد.

برای این کار از None استفاده می‌کنیم:
result = None

حالا:
print(result)

خروجی:
None

⚠️ یک نکته:
None به معنی String "None" نیست.
یعنی این دو متفاوت‌اند:
result = None

و:
result = "None"

اولی مقدار ویژه None است، دومی یک String است.


——————————
6. نوع داده را چطور بفهمیم؟ 🔍
با تابع:
type()

مثلاً:
a = 4.6

print(type(a))

خروجی:
<class 'float'>

یعنی a از نوع Float است.
مثلاً:
a = 20
print(type(a))

خروجی:
<class 'int'>

و:
a = "Ali"
print(type(a))

خروجی:
<class 'str'>

پس:
type(a)

نوع داده متغیر a را مشخص می‌کند.

—————————————-
7. قوانین نام‌گذاری متغیرها
می‌توانیم بنویسیم:
name = "Ali"

یا:
_name = "Ali"

اما مثلاً این اشتباه است:
2name = "Ali"

چون نام متغیر نباید با عدد شروع شود.
اما می‌تواند شامل عدد باشد:
name2 = "Ali"

نام متغیر می‌تواند شامل:
حروف
عدد
_
باشد.
مثلاً:
user_name = "Ali"
age25 = 25

——————————-
8. بزرگ و کوچک بودن حروف مهم است ⚠️
Python به Case حساس است.
یعنی:
age = 25

با:
Age = 25

متفاوت است.
حتی:
name
Name
NAME

سه متغیر متفاوت هستند.
مثلاً:
age = 25

print(Age)

خطا می‌گیریم، چون Age با age یکی نیست.

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

9. تبدیل Data Type یا Type Casting
حالا یکی از مهم‌ترین قسمت‌های این فصل 👇
فرض کن:
a = 20
b = "4"

a یک Integer است ولی b یک String.
اگر بنویسیم:
print(a + b)

❌ خطا می‌گیریم.
چرا؟
چون Python نمی‌تواند مستقیماً:
Integer + String

را انجام دهد.

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

تبدیل String به Integer
می‌توانیم از:
int()

استفاده کنیم.
مثلاً:
a = 20
b = "4"

print(a + int(b))

اینجا:
int(b)

مقدار "4" را به عدد 4 تبدیل می‌کند.
پس:
20 + 4

نتیجه:
24

——————————-

10. تبدیل موقت با int(b)
این نکته‌ای که استاد گفت خیلی مهمه.
وقتی می‌نویسیم:
int(b)

فقط همان لحظه مقدار b را به Integer تبدیل می‌کنیم.
خود b هنوز String است.
مثلاً:
b = "4"

print(int(b))
print(type(b))

خروجی:
4
<class 'str'>

—————————
11. تبدیل دائمی مقدار متغیر
اگر بخواهیم خود b از این به بعد Integer باشد:
b = int(b)

مثلاً:
b = "4"

b = int(b)

print(type(b))

حالا خروجی:
<class 'int'>

یعنی مقدار جدید را دوباره داخل b ذخیره کردیم.
این مفهوم را خوب یاد بگیر:
int(b)

یعنی:
مقدار تبدیل‌شده را بده.

ولی:
b = int(b)

یعنی:
مقدار تبدیل‌شده را داخل خود

b
ذخیره کن.




————————-
🐍 فصل سوم — پایتون مقدماتی — عملگرها
—————————————-
Operator یا عملگر یعنی نمادی که به Python می‌گوید چه عملی روی داده‌ها انجام دهد.
مثلاً:
x + y

علامت + یک عملگر است.

———————
1. عملگرهای حسابی — Arithmetic Operators
فرض کنیم:
x = 10
y = 3

جمع +
print(x + y)

خروجی:
13


——————————-

تفریق -
print(x - y)

خروجی:
7


——————


ضرب *
print(x * y)

خروجی:
30


————————-

تقسیم /
print(x / y)

خروجی:
3.3333333333333335

⚠️ نکته مهم:
/ نتیجه را به صورت Float برمی‌گرداند.

—————————

تقسیم صحیح //
print(x // y)

خروجی:
3

یعنی قسمت اعشاری را کنار می‌گذارد.
10 ÷ 3 = 3.333...
10 // 3 = 3



——————————-

باقی‌مانده %
print(x % y)

خروجی:
1

چون:
10 ÷ 3

سه تا 3 می‌شود 9 و 1 باقی می‌ماند.
این عملگر خیلی کاربردی است؛ مثلاً برای تشخیص زوج و فرد:
number = 10

print(number % 2)

اگر نتیجه 0 باشد، عدد زوج است.

—————————-

2. عملگرهای مقایسه‌ای — Comparison Operators
اینجا نتیجه مقایسه همیشه یکی از این دو است:
True
False

مثلاً:
a = 8
b = 8

print(a == b)

خروجی:
True

——————

== برابر بودن
a = 8
b = 8

print(a == b)

یعنی:
آیا a و b برابر هستند؟

⚠️ خیلی مهم:
=

با:
==

فرق دارد.
= برای Assignment است.
== برای مقایسه است.
——————————-

> بزرگ‌تر
print(a > b)

یعنی:
آیا a از b بزرگ‌تر است؟




<
کوچک‌تر
print(a < b)

یعنی:
آیا a از b کوچک‌تر است؟



!=
نابرابر
a != b

مثلاً:
print(a != b)

یعنی:
آیا a و b با هم برابر نیستند؟





<= کوچک‌تر یا مساوی
print(a <= b)

یعنی:
آیا a کوچک‌تر یا مساوی b است؟




>=
بزرگ‌تر یا مساوی
در جزوه نوشته بود:
a => b

❌ اشتباه است.
درست:
a >= b

مثلاً:
print(a >= b)


—————————

3. نتیجه Comparison چه Data Typeای دارد؟
مثلاً:
a = 8
b = 8

c = a < b

print(c)
print(type(c))

خروجی:
False
<class 'bool'>

نوع داده:
Boolean (bool)
است.
Boolean فقط دو مقدار دارد:
True
False



———————-

4. Assignment Operators
Assignment یعنی مقداردهی یا تغییر مقدار متغیر.
مثلاً:
x = 10

حالا:
x = x + 5

یعنی:
10 + 5 = 15

پس:
print(x)

خروجی:
15



———————

روش کوتاه‌تر
به جای:
x = x + 5

می‌توانیم بنویسیم:
x += 5

یا
تفریق:
x -= 5

یا
ضرب:
x *= 5

یا
تقسیم:
x /= 5

یا
تقسیم صحیح:
x //= 5

یا
باقی‌مانده:
x %= 5

نتیجه یکی است.

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


5. Logical Operators 🧠
این قسمت همان:
AND / OR / NOT
است.
این عملگرها معمولاً برای ترکیب چند شرط استفاده می‌شوند.

—————————

AND
and یعنی:
هر دو شرط باید True باشند.

مثلاً:
x = 5

print(x > 3 and x < 10)

شرط اول:
5 > 3 → True

شرط دوم:
5 < 10 → True

پس:
True AND True → True

خروجی:
True

مثال دیگر:
x = 5

print(x > 6 and x < 10)

اینجا:
5 > 6 → False
5 < 10 → True

پس:
False AND True → False


———————-
OR
or یعنی:
حداقل یکی از شرط‌ها True باشد.

مثلاً:
x = 5

print(x > 6 or x < 10)

داریم:
5 > 6 → False
5 < 10 → True

چون یکی True است:
False OR True → True


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

NOT
not نتیجه را برعکس می‌کند.
مثلاً:
x = 5

print(not(x > 3 and x < 10))

اول:
x > 3 → True
x < 10 → True

پس:
True AND True → True

بعد not آن را برعکس می‌کند:
not True → False
پس خروجی:
False
🐍 فصل چهارم — پایتون مقدماتی — ورودی و خروجی ها
—————————————-
1. Output چیست؟
Output یعنی خروجی برنامه؛ یعنی برنامه اطلاعاتی را به کاربر نمایش دهد.
مهم‌ترین دستور برای خروجی گرفتن:
print()

مثلاً:
print("Hello Ali")

خروجی:
Hello Ali


———————
2. Escape Character چیست؟ 🔤
گاهی می‌خواهیم داخل یک String کار خاصی انجام دهیم؛ مثلاً:
رفتن به خط بعد
ایجاد فاصله Tab
نمایش کوتیشن
نمایش \
برای این کار از Escape Character استفاده می‌کنیم.
علامت اصلی آن:
\

است.

—————

\" نمایش Double Quote
مثلاً:
print('ali reza "python" nima')

چون بیرون String از ' استفاده کرده‌ایم، مشکلی نداریم.
اما اگر بخواهیم خود String با " باشد:
print("ali reza \"python\" nima")

خروجی:
ali reza "python" nima

\" یعنی:
این

"
را به عنوان بخشی از متن در نظر بگیر.

———————
3. \n رفتن به خط بعد
print('ali reza "python" \nnima')

خروجی:
ali reza "python"
nima

یعنی:
\n = New Line


——————-

4. \t ایجاد Tab
print('ali reza "python" \tnima')

خروجی تقریباً:
ali reza "python"     nima

یعنی:
\t = Tab



———————

5. end در print
به صورت پیش‌فرض print() بعد از نمایش متن به خط بعد می‌رود.
مثلاً:
print("Ali")
print("Reza")

خروجی:
Ali
Reza

اما می‌توانیم رفتار پایان print را با end تغییر دهیم:
print("Ali", end=" . ")
print("Reza")

خروجی:
Ali . Reza

چون به جای رفتن به خط بعد، end مشخص کرده‌ایم:
end=" . "


————————
6. Input چیست؟ ⌨️
Input یعنی گرفتن اطلاعات از کاربر.
برای این کار از:
input()

استفاده می‌کنیم.
مثلاً:
input("Enter your name: ")

برنامه منتظر می‌ماند تا کاربر چیزی وارد کند.


—————————-
7. ذخیره کردن Input در Variable
اگر بخواهیم ورودی کاربر را نگه داریم:
first_name = input("Enter your name: ")
last_name = input("Enter your lastname: ")
age = input("Enter age: ")

حالا اطلاعات داخل متغیرها ذخیره شده‌اند.
می‌توانیم نمایششان بدهیم:
print("Your name:", first_name)
print("Lastname:", last_name)
print("Your age:", age)


——————

⚠️ نکته خیلی مهم درباره input
هر چیزی که با input() دریافت می‌کنیم، به صورت String (str) وارد برنامه می‌شود.
مثلاً:
age = input("Enter age: ")

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

مقدار age در واقع:
"25"

است.
نه:
25

پس اگر بخواهیم با آن محاسبات ریاضی انجام دهیم، باید تبدیلش کنیم.



_———————-

8. ساخت ماشین‌حساب ساده 🧮
در جزوه‌ات نوشتی:
x = input("num1")
y = input("num2")

print("my answer:", x + y)

اما اینجا یک نکته مهم وجود دارد.
فرض کنیم کاربر وارد کند:
10

و:
20

چون هر دو String هستند:
x + y

می‌شود:
"10" + "20"

و نتیجه:
1020

❌ نه 30!

————————

راه درست
باید ورودی را تبدیل کنیم:
x = int(input("num1: "))
y = int(input("num2: "))

print("My answer:", x + y)

اگر کاربر وارد کند:
10
20

خروجی:
My answer: 30

اینجا:
int(input())

یعنی:
ورودی را بگیر و آن را به Integer تبدیل کن.


_—————————-

9. f-string چیست؟ 🔥
یکی از بهترین روش‌های نمایش متغیرها داخل متن، f-string است.
مثلاً:
name = "Ali"
age = 25
score = 19.7

print(f"name: {name} and age: {age} and score: {score}")

خروجی:
name: Ali and age: 25 and score: 19.7

قسمت مهم:
f"... {name} ..."

حرف f به Python می‌گوید:
داخل این String ممکن است Expression یا Variable داشته باشیم.

و متغیر را داخل:
{ }

قرار می‌دهیم.

_————————

10. روش قدیمی‌تر %
در جزوه‌ات این را هم داشتی:
print("name: %s, age: %d" % (name, age))

اینجا:
%s → String
%d → Integer

این روش قدیمی‌تر است.
امروزه معمولاً f-string خواناتر و راحت‌تر است:
print(f"name: {name}, age: {age}")

پس برای Python جدید، f-string را خوب یاد بگیر.

————————

11. ترکیب Input + تبدیل نوع داده
مثال کامل:
name = input("Enter your name: ")
age = int(input("Enter your age: "))
score = float(input("Enter your score: "))

print(f"name: {name}")
print(f"age: {age}")
print(f"score: {score}")

فرض کن کاربر وارد کند:
Ali
25
19.7

خروجی:
name: Ali
age: 25
score: 19.7

اینجا:
age = int(input(...))

یعنی سن را به Integer تبدیل کردیم.
و:
score = float(input(...))

یعنی نمره را به Float تبدیل کردیم.
🧠 یک مثال واقعی برای مسیر امنیت
فرض کن بعداً می‌خواهیم ابزار امنیتی بنویسیم که IP از کاربر بگیرد:
ip = input("Enter target IP: ")

print(f"Target IP is: {ip}")

کاربر:
192.168.1.10

برنامه:
Target IP is: 192.168.1.10

بعداً همین Input را می‌توانیم وارد بخش‌های شبکه، Socket و ابزارهای امنیتی کنیم. 🔥
🔥1
🐍 فصل پنجم — پایتون مقدماتی — ساختار داده
—————————————-

1️⃣ لیست — list
لیست را زمانی استفاده می‌کنیم که بخواهیم چند مقدار را کنار هم نگه داریم و امکان تغییر آنها را داشته باشیم.
مثلاً سن چند نفر:
ages = [20, 10, 1, 15, 16]

هر عضو یک Index دارد.
⚠️ نکته مهم: شماره‌گذاری از 0 شروع می‌شود.
Index:    0   1   2   3   4
Value: 20 10 1 15 16

پس:
print(ages[0])

خروجی:
20

و:
print(ages[1])

خروجی:
10

🔹 داخل List چه چیزی می‌توانیم قرار دهیم؟
تقریباً هر نوع داده‌ای:
data = [10, "Ali", 19.5, True]

حتی می‌توانیم لیست داخل لیست داشته باشیم.

2️⃣ اضافه کردن به List
append()
اگر بخواهیم چیزی را به انتهای لیست اضافه کنیم:
ages.append("Reza")


2️⃣insert()
اگر بخواهیم در یک Index مشخص چیزی اضافه کنیم:
ages.insert(0, "Zahra")

یعنی "Zahra" را در Index شماره 0 قرار بده.

3️⃣ حذف از List
pop()
اگر Index را بدانیم:
ages.pop(2)

عضو Index شماره 2 را حذف می‌کند.


remove()
اگر Index را ندانیم ولی خود مقدار را بدانیم:
ages.remove(10)

اولین مقدار 10 را پیدا می‌کند و حذف می‌کند.



پس تفاوت:
ages.pop(2)

یعنی:
عضو شماره 2 را حذف کن.

ولی:
ages.remove(10)

یعنی:
مقدار 10 را پیدا کن و حذف کن.





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

مثال کاربردی — محاسبه نمرات
فرض کنیم می‌خواهیم نمرات 4 درس را از کاربر بگیریم.
scores = []

score_1 = int(input("1 score: "))
score_2 = int(input("2 score: "))
score_3 = int(input("3 score: "))
score_4 = int(input("4 score: "))

scores.append(score_1)
scores.append(score_2)
scores.append(score_3)
scores.append(score_4)

result = score_1 + score_2 + score_3 + score_4

print(result / 4)

ولی یک نکته مهم وجود دارد.
ما اصلاً لازم نیست برای تعداد درس‌ها عدد 4 را دستی بنویسیم.
از len() استفاده می‌کنیم.

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

5️⃣ تابع len()
len() تعداد اعضای یک ساختار داده را به ما می‌دهد.
مثلاً:
scores = [18, 19, 20, 17]

print(len(scores))

خروجی:
4

بنابراین:
print(result / len(scores))

یعنی:
مجموع نمرات را بر تعداد نمرات تقسیم کن.

این روش بهتر است چون اگر بعداً 5 نمره داشتیم، لازم نیست 4 را دستی تغییر دهیم.

—————————

6️⃣ Tuple — تاپل
Tuple شبیه List است، اما یک تفاوت بسیار مهم دارد:
Tuple بعد از ساخته شدن قابل تغییر نیست.

مثلاً:
colors = ("red", "blue", "white", "black")

می‌توانیم:
print(colors[0])

اما نمی‌توانیم بگوییم:
colors[0] = "green"

و Python خطا می‌دهد.
چرا Tuple؟
وقتی اطلاعاتی داریم که نباید تغییر کنند.
مثلاً:
server_info = ("192.168.1.10", 22, "SSH")

اگر این اطلاعات قرار است ثابت باشند، Tuple انتخاب مناسبی است.

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

7️⃣ Tuple Unpacking
یکی از قابلیت‌های جالب Tuple، Unpacking است.
مثلاً:
student = ("Ali", 25, 19.5)

می‌توانیم مقدارها را جداگانه داخل متغیرها بریزیم:
name, age, score = student

حالا:
print(name)
print(age)
print(score)

خروجی:
Ali
25
19.5

یعنی:
student
↓
("Ali", 25, 19.5)

↓ Unpacking

name = "Ali"
age = 25
score = 19.5

⚠️ تعداد متغیرها باید با تعداد مقادیر هماهنگ باشد.
مثلاً این اشتباه است:
name, age = ("Ali", 25, 19.5)

چون 3 مقدار داریم ولی فقط 2 متغیر.

————————-

8️⃣ Packing
برعکس Unpacking را می‌توانیم به شکل ساده Packing در نظر بگیریم.
یعنی چند مقدار را در یک Tuple قرار دهیم:
student = "Ali", 25, 19.5

Python آن را به شکل Tuple در نظر می‌گیرد:
("Ali", 25, 19.5)

البته بهتر است برای خوانایی بنویسیم:
student = ("Ali", 25, 19.5)


—————————

9️⃣ Set — مجموعه
Set برای نگهداری مجموعه‌ای از داده‌ها استفاده می‌شود که:
ترتیب مشخصی ندارند
عضو تکراری نگه نمی‌دارند
قابل تغییر هستند
مثلاً:
numbers = {1, 2, 3, 4, 4, 5}

نتیجه:
{1, 2, 3, 4, 5}

عدد 4 فقط یک بار باقی می‌ماند.
کاربرد واقعی
مثلاً از یک سیستم لاگ گرفته‌ایم و IPهای مختلف داریم:
ips = {
"192.168.1.10",
"192.168.1.20",
"192.168.1.10",
"192.168.1.30"
}

اگر بخواهیم فقط IPهای منحصربه‌فرد را داشته باشیم، Set خیلی مناسب است.

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

🔟 اضافه کردن به Set
با add():
numbers.add(6)

نتیجه:
{1, 2, 3, 4, 5, 6}



1️⃣1️⃣ حذف از Set
remove()
numbers.remove(2)

عدد 2 حذف می‌شود.
اما اگر 2 در Set وجود نداشته باشد، خطا می‌دهد.

discard()
numbers.discard(7)

اگر 7 وجود داشته باشد، حذف می‌شود.
اگر وجود نداشته باشد:
هیچ خطایی نمی‌دهد.

⚠️ در جزوه‌ات dicard نوشته شده؛ دستور صحیح:
discard()

است.



1️⃣2️⃣ اجتماع Setها — Union
فرض کنیم:
a = {1, 2, 3, 4, 5}
b = {1, 3, 4, 5, 6, 9}

با:
print(a | b)

اجتماع دو مجموعه را می‌گیریم:
{1, 2, 3, 4, 5, 6, 9}

یعنی:
همه اعضای A و B، بدون تکرار.




1️⃣3️⃣ اشتراک — Intersection
با:
print(a & b)

اعضای مشترک را پیدا می‌کنیم.
نتیجه:
{1, 3, 4, 5}

یعنی فقط چیزهایی که هم در A هستند و هم در B.




1️⃣4️⃣ تفاضل — Difference
print(a - b)

یعنی:
چیزهایی که در A هستند ولی در B نیستند.

نتیجه:
{2}

اما اگر بنویسیم:
print(b - a)

نتیجه:
{6, 9}

پس ترتیب مهم است.







1️⃣5️⃣ Dictionary — دیکشنری
دیکشنری یکی از مهم‌ترین ساختارهای Python است.
در Dictionary اطلاعات به صورت:
key : value

ذخیره می‌شوند.
مثلاً:
student = {
"name": "Alireza",
"age": 20,
"score": 19.5
}

اینجا:
key       value
----------------
name Alireza
age 20
score 19.5





1️⃣6️⃣ دسترسی به Dictionary
مثلاً:
print(student["name"])

خروجی:
Alireza

یا:
print(student["age"])

خروجی:
20


————————————————
My folder vip
🐍 فصل پنجم — پایتون مقدماتی — ساختار داده —————————————- 1️⃣ لیست — list لیست را زمانی استفاده می‌کنیم که بخواهیم چند مقدار را کنار هم نگه داریم و امکان تغییر آنها را داشته باشیم. مثلاً سن چند نفر: ages = [20, 10, 1, 15, 16] هر عضو یک Index دارد. ⚠️ نکته…
1️⃣7️⃣ get()
روش دیگر برای گرفتن مقدار:
print(student.get("age"))

خروجی:
20

تفاوت مهم این دو:
student["phone"]

اگر phone وجود نداشته باشد، KeyError می‌گیریم.
اما:
student.get("phone")

اگر وجود نداشته باشد، به‌صورت پیش‌فرض:
None

برمی‌گرداند.
حتی می‌توانیم مقدار جایگزین تعیین کنیم:
print(student.get("phone", "Not Found"))

اگر phone وجود نداشته باشد:
Not Found


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

1️⃣8️⃣ تغییر مقدار Dictionary
مثلاً:
student["name"] = "Reza"

حالا:
print(student["name"])

می‌شود:
Reza



—————————-

1️⃣9️⃣ اضافه کردن Key جدید
مثلاً:
student["phone"] = "09132565464"

حالا Dictionary شامل phone هم می‌شود.
نکته جالب:
اگر Key از قبل وجود داشته باشد:
student["age"] = 25

مقدار قبلی تغییر می‌کند.
اگر Key وجود نداشته باشد:
student["phone"] = "..."

یک مورد جدید اضافه می‌شود.

——————————-

2️⃣0️⃣ حذف از Dictionary
با del:
del student["age"]

Key و مقدار مربوط به آن حذف می‌شوند.


pop()
می‌توانیم مقدار حذف‌شده را هم دریافت کنیم:
a = student.pop("phone")

print("a is", a)

یعنی:
phone
را حذف کن و مقدارش را داخل

a
قرار بده.


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

🔥 حالا مهم‌ترین سؤال: کِی از کدام استفاده کنیم؟
این قسمت را خیلی خوب یاد بگیر:
🟢 List
وقتی:
چند داده داریم، ترتیب برایمان مهم است و می‌خواهیم بتوانیم آنها را تغییر دهیم.

مثلاً:
servers = ["server1", "server2", "server3"]

—————————

🔵 Tuple
وقتی:
چند داده داریم، ترتیب مهم است ولی نمی‌خواهیم داده‌ها تغییر کنند.

مثلاً:
server = ("192.168.1.10", 22, "SSH")

———————-

🟡 Set
وقتی:
فقط اعضای منحصربه‌فرد برایمان مهم هستند و تکراری نمی‌خواهیم.

مثلاً:
blocked_ips = {
"1.1.1.1",
"2.2.2.2",
"1.1.1.1"
}

IP تکراری حذف می‌شود.


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


🔴 Dictionary
وقتی:
می‌خواهیم هر داده یک اسم/کلید داشته باشد.

مثلاً:
server = {
"ip": "192.168.1.10",
"port": 22,
"service": "SSH"
}

خیلی راحت می‌توانیم بگوییم:
server["ip"]



——————————-

🧠 یک مثال امنیتی که هر 4 تا را با هم ببینیم
فرض کن اطلاعات یک سرور را داریم:
server = {
"name": "WebServer",
"ip": "192.168.1.10",
"ports": [22, 80, 443],
"protocols": ("SSH", "HTTP", "HTTPS"),
"users": {"ali", "reza", "ali"}
}

اینجا:
dict → اطلاعات کلی سرور
list → پورت‌ها چون ترتیب/لیست‌بودن و تغییرپذیری می‌تواند مهم باشد
tuple → پروتکل‌های ثابت
set → کاربران بدون تکرار
این دقیقاً جایی است که Data Structures در پروژه‌های واقعی شبکه و امنیت کاربرد پیدا می‌کند. 🔥
🐍 فصل ششم — پایتون مقدماتی — control flow
—————————————-
Control Flow یعنی کنترل جریان اجرای برنامه.
تا قبل از این، برنامه معمولاً خط‌به‌خط اجرا می‌شد:
print("A")
print("B")
print("C")

اما با شرط‌ها می‌توانیم بگوییم:
اگر این اتفاق افتاد، این کار را انجام بده؛ وگرنه کار دیگری انجام بده.


=================

1️⃣ if — شرط
مثلاً می‌خواهیم نمره را بررسی کنیم:
score = int(input("Enter your score: "))

if score > 50:
print("Afarin")

یعنی:
اگر

score
بزرگ‌تر از 50 بود،

Afarin
را چاپ کن.

⚠️ دو نکته مهم
در جزوه نوشته بودی:
if score > 50;

❌ اشتباه است.
باید : باشد:
if score > 50:

و دستور داخل if باید Indentation داشته باشد:
if score > 50:
print("Afarin")

===============

2️⃣ if / else
اگر بخواهیم برای حالت غلط هم کاری انجام دهیم:
score = int(input("Enter your score: "))

if score > 50:
print("Afarin")
else:
print("Niyaz be talash")

یعنی:
اگر score > 50
↓
آفرین

در غیر این صورت
↓
نیاز به تلاش



>=
اگر بنویسیم:
if score >= 50:

یعنی:
بزرگ‌تر از 50 یا مساوی 50

پس خود 50 هم قبول می‌شود.
تفاوت:
> 50   → خود 50 قبول نیست
>= 50 → خود 50 هم قبول است

====================

3️⃣ Nested If — شرط تو در تو
مثالی که نوشتی مربوط به Login بود:
user = input("Enter user: ")
password = input("Enter pass: ")

if user == "admin":
if password == "1234":
print(f"Welcome {user}")
else:
print("Password eshtebah")
else:
print("User eshtebah")

اینجا دو شرط داریم.
اول:
if user == "admin":

اگر Username درست بود، می‌رود سراغ Password:
if password == "1234":

اگر هر دو درست باشند:
Welcome admin

اگر Username درست باشد ولی Password اشتباه باشد:
Password eshtebah

و اگر Username اشتباه باشد:
User eshtebah



==================

4️⃣ elif
گاهی بیشتر از دو حالت داریم.
مثلاً می‌خواهیم بر اساس نمره Grade تعیین کنیم:
score = int(input("Enter your score: "))

grade = ""

if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"

print(grade)

⚠️ یک اشتباه در جزوه:
نوشته بودی:
elif score => 80:

❌ اشتباه
درست:
elif score >= 80:




🧠 elif چطور کار می‌کند؟
Python شرط‌ها را از بالا به پایین بررسی می‌کند.
مثلاً:
score = 95

اول بررسی:
score >= 90

درست است → A
دیگر سراغ:
elif score >= 80
elif score >= 70

نمی‌رود.
یعنی وقتی یک شرط درست شد، آن شاخه اجرا می‌شود و زنجیره شرط تمام می‌شود.




🔥 چرا ترتیب elif مهم است؟
مثلاً این کد را ببین:
score = 95

if score >= 70:
grade = "C"
elif score >= 80:
grade = "B"
elif score >= 90:
grade = "A"

اینجا 95 >= 70 درست است.
پس همان اول C می‌شود! 😄
بنابراین باید از بزرگ‌ترین شرط به کوچک‌ترین شرط برویم:
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"



=================

5️⃣ Short-Hand If — شرط یک‌خطی
برای شرط‌های ساده می‌توانیم از حالت کوتاه استفاده کنیم.
مثلاً:
age = 20

status = "old" if age >= 50 else "young"

print(status)

چون:
20 >= 50

غلط است، نتیجه:
young

ساختار کلی:
value_if_true if condition else value_if_false

مثلاً:
result = "Pass" if score >= 50 else "Fail"

یعنی:
اگر نمره حداقل 50 بود

Pass
، وگرنه

Fail
.





===================
My folder vip
🐍 فصل ششم — پایتون مقدماتی — control flow —————————————- Control Flow یعنی کنترل جریان اجرای برنامه. تا قبل از این، برنامه معمولاً خط‌به‌خط اجرا می‌شد: print("A") print("B") print("C") اما با شرط‌ها می‌توانیم بگوییم: اگر این اتفاق افتاد، این کار را انجام بده؛…
🔐 مثال کاربردی برای مسیر امنیت
فرض کن می‌خواهیم بررسی کنیم یک IP در لیست IPهای مجاز هست یا نه:
allowed_ips = {
"192.168.1.10",
"192.168.1.20",
"192.168.1.30"
}

ip = input("Enter IP: ")

if ip in allowed_ips:
print("Access Granted")
else:
print("Access Denied")

اینجا شرط داریم:
ip in allowed_ips

که نتیجه‌اش True یا False می‌شود.
این نوع منطق را بعداً در اسکریپت‌های شبکه و امنیت خیلی زیاد می‌بینی.
🐍 فصل هفتم — پایتون مقدماتی — Control Flow Loops
—————————————-
Loop یعنی حلقه؛ یعنی یک قسمت از برنامه را چندین بار اجرا کنیم.
مثلاً به جای اینکه 5 بار بنویسیم:
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")

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

==========================

1️⃣ حلقه for
for زمانی خیلی کاربردی است که بخواهیم روی اعضای یک مجموعه یکی‌یکی حرکت کنیم.
مثلاً:
miveha = ("apple", "banana", "cherry")

for mive in miveha:
print(mive)

خروجی:
apple
banana
cherry

نحوه کار
Python می‌گوید:
miveha
↓
apple → print
banana → print
cherry → print

ساختار کلی:
for variable in collection:
code

یعنی:
برای هر عضو داخل collection، این کد را اجرا کن.


===================

2️⃣ for روی Dictionary
مثلاً:
person = {
"name": "Ali",
"age": 25
}

اگر بخواهیم هم Key و هم Value را بگیریم:
for key, value in person.items():
print(f"{key} = {value}")

خروجی:
name = Ali
age = 25

.items() چیست؟
person.items()

باعث می‌شود Key و Value را با هم دریافت کنیم.
یعنی تقریباً:
name → Ali
age → 25

==============

3️⃣ range()
یکی از مهم‌ترین چیزهایی که در for استفاده می‌شود:
range()

مثلاً:
for i in range(5):
print(i)

خروجی:
0
1
2
3
4

⚠️ نکته مهم:
range(5) از 0 تا قبل از 5 است.
یعنی:
0, 1, 2, 3, 4

پس 5 خودش چاپ نمی‌شود.

======================

4️⃣ حلقه while
while یعنی:
تا زمانی که شرط درست است، حلقه را ادامه بده.

مثلاً:
counter = 0

while counter < 10:
print("Hello bro")
counter += 1

اینجا:
counter = 0

شروع می‌شود.
هر بار:
counter += 1

یک واحد به آن اضافه می‌شود.
پس:
0
1
2
3
...
9

وقتی به 10 برسد:
counter < 10

دیگر False می‌شود و حلقه تمام می‌شود.
====================

⚠️ چرا counter += 1 مهم است؟
اگر این را ننویسیم:
counter = 0

while counter < 10:
print("Hello")

حلقه هیچ‌وقت به 10 نمی‌رسد!
چون counter همیشه 0 باقی می‌ماند.
پس یک Infinite Loop یا حلقه بی‌نهایت خواهیم داشت.

==================

5️⃣ while True
مثلاً:
while True:
print("Hello bro")

اینجا شرط همیشه:
True

است.
بنابراین حلقه خودش هیچ‌وقت تمام نمی‌شود.
برای متوقف کردن چنین حلقه‌ای معمولاً از break استفاده می‌کنیم.


===================

6️⃣ مثال گرفتن نام 10 دانش‌آموز

students = []
counter = 0

while counter < 10:
student = input("Enter name: ")
students.append(student)
counter += 1

print(students)

for name in students:
print(name)

اینجا:
students = []

لیست خالی است.
بعد:
student = input(...)

نام را داخل یک متغیر موقت می‌گیریم.
و:
students.append(student)

نام را به لیست اضافه می‌کنیم.
در نهایت 10 نفر داریم.


===================

🛑 7️⃣ break
break یعنی:
کلاً از حلقه خارج شو.

مثلاً همان برنامه دانش‌آموزها را در نظر بگیر.
فرض کن می‌گوییم اگر کاربر 0 وارد کرد، دیگر اسم بیشتری نگیریم:
students = []

while True:
student = input("Enter name: ")

if student == "0":
break

students.append(student)

print(students)

حالا اگر کاربر وارد کند:
Ali
Reza
Mohammad
0

وقتی 0 وارد شود:
if student == "0":
break

اجرا می‌شود و کل حلقه تمام می‌شود.
نتیجه:
['Ali', 'Reza', 'Mohammad']

خود 0 هم وارد لیست نمی‌شود.
🧠 حفظ کن:
break
↓
خروج کامل از حلقه 🛑



===================
🔄 8️⃣ continue
continue با break فرق دارد.
continue می‌گوید:
این تکرار را رها کن و برو سراغ تکرار بعدی.

مثلاً:
students = []

while len(students) < 5:
student = input("Enter name: ")

if student == "0":
continue

students.append(student)

print(students)

فرض کنیم:
Ali
0
Reza
Mohammad
...

وقتی 0 وارد شود:
continue

اجرا می‌شود.
یعنی:
این ورودی را بی‌خیال شو و دوباره برو اول حلقه.

پس 0 به لیست اضافه نمی‌شود، ولی حلقه تمام هم نمی‌شود.
تفاوت اصلی:
break
↓
کل حلقه تمام می‌شود 🛑

ولی:
continue
↓
فقط این دور از حلقه رد می‌شود
↓
دور بعدی 🔄




===========

9️⃣ مثال خیلی ساده برای تفاوت break و continue
break
for i in range(5):
if i == 3:
break

print(i)

خروجی:
0
1
2

وقتی به 3 رسید، کل حلقه تمام شد.

—————-
continue
for i in range(5):
if i == 3:
continue

print(i)

خروجی:
0
1
2
4

وقتی به 3 رسید:
فقط چاپ 3 را رد کرد و رفت سراغ 4



=====================

🟡 10️⃣ pass
pass یعنی:
فعلاً هیچ کاری انجام نده.

مثلاً:
for i in range(5):
if i == 3:
pass

print(i)

خروجی:
0
1
2
3
4

pass حلقه را متوقف نمی‌کند.
حتی تکرار را هم رد نمی‌کند.
فقط یک دستور خالی است.



pass
کجا کاربرد دارد؟
گاهی هنوز نمی‌دانیم قرار است داخل یک شرط یا تابع چه کدی بنویسیم.
مثلاً:
if score > 90:
pass
else:
print("Try again")
یعنی:
اگر نمره بیشتر از 90 شد، فعلاً هیچ کاری نکن.
بعداً می‌توانیم کد واقعی را جای pass بگذاریم.
My folder vip
🐍 فصل هفتم — پایتون مقدماتی — Control Flow Loops —————————————- Loop یعنی حلقه؛ یعنی یک قسمت از برنامه را چندین بار اجرا کنیم. مثلاً به جای اینکه 5 بار بنویسیم: print("Hello") print("Hello") print("Hello") print("Hello") print("Hello") می‌توانیم از حلقه استفاده…
🔐 یک مثال امنیتی
فرض کن می‌خواهیم IPها را بررسی کنیم:
ips = [
"192.168.1.10",
"192.168.1.20",
"192.168.1.30"
]

for ip in ips:

if ip == "192.168.1.20":
continue

print(f"Scanning {ip}")

خروجی:
Scanning 192.168.1.10
Scanning 192.168.1.30

IP دوم را Skip کردیم.
اگر به جای continue می‌نوشتیم:
break

به محض رسیدن به IP دوم، کل اسکن متوقف می‌شد.
این منطق در اسکریپت‌های شبکه و امنیت خیلی کاربردی است. 🔥
👍1
🐍 فصل هشتم — پایتون مقدماتی —Functions
—————————————-
1️⃣ Function چیست؟
Function یا تابع یک بخش از کد است که یک کار مشخص انجام می‌دهد و می‌توانیم هر وقت خواستیم آن را صدا بزنیم.
مثلاً:
def print_1_4():
print("1")
print("2")
print("3")
print("4")

print_1_4()

خروجی:
1
2
3
4

یعنی به جای اینکه این 4 خط را هر بار تکرار کنیم، یک بار داخل تابع می‌نویسیم و هر چند بار خواستیم:
print_1_4()

صدا می‌زنیم.
🧠 مفهوم اصلی
یک بار بنویس، هر چند بار خواستی استفاده کن.


———————-

2️⃣ ساختار Function
ساختار کلی:
def function_name():
# code

مثلاً:
def hello():
print("Hello")

⚠️ صرفاً تعریف تابع باعث اجرای آن نمی‌شود.
برای اجرا باید آن را Call کنیم:
hello()


——————————

3️⃣ تابع با Parameter
می‌توانیم اطلاعاتی را به تابع بدهیم.
مثلاً:
def plus(x):
print(x)

plus(5)

اینجا:
x → Parameter
5 → Argument

یعنی x یک جای خالی است که هنگام اجرای تابع مقدار می‌گیرد.
اگر:
plus(10)

باشد، x می‌شود 10.

———————————

4️⃣ return چیست؟
این قسمت خیلی مهم است. 🔥
return یعنی:
نتیجه تابع را به جایی که تابع را صدا زده‌ایم برگردان.

مثلاً:
def plus(x):
return x + 10

حالا:
a = plus(5)

print(a)

خروجی:
15

اینجا اتفاقی که افتاده:
plus(5)
↓
5 + 10
↓
15
↓
a

پس:
a = plus(5)

یعنی نتیجه‌ای که تابع return کرده داخل a ذخیره می‌شود.

————————

⚠️ تفاوت print و return
این دو را خیلی خوب یاد بگیر.
print
فقط نتیجه را نمایش می‌دهد:
def plus(x):
print(x + 10)

a = plus(5)

اینجا 15 چاپ می‌شود، اما تابع چیزی برای ذخیره کردن در a برنمی‌گرداند.
عملاً:
a = None


———————
return
نتیجه را برمی‌گرداند:
def plus(x):
return x + 10

a = plus(5)

print(a)

اینجا:
a = 15

🧠 حفظی:
print → نمایش بده 🖥

return → نتیجه را برگردان ↩️


——————————-

5️⃣ return اجرای تابع را تمام می‌کند
مثلاً:
def test():
print("A")
return
print("B")

خروجی:
A

چون بعد از return دیگر ادامه تابع اجرا نمی‌شود.

——————————

6️⃣ *args
حالا می‌رسیم به کدی که نوشتی:
def sum_all(*args):
total = 0

for num in args:
total += num

return total

اینجا *args یعنی:
تابع می‌تواند هر تعداد آرگومان دریافت کند.

مثلاً:
print(sum_all(1, 2, 3))

نتیجه:
6

یا:
print(sum_all(10, 20, 30, 40, 50))

نتیجه:
150

—————————-

*args داخل تابع چه شکلی است؟
مثلاً:
sum_all(10, 20, 30)

تقریباً می‌توانیم تصور کنیم:
args = (10, 20, 30)

یعنی args به شکل یک Tuple در اختیار تابع قرار می‌گیرد.
بعد:
for num in args:
total += num

یکی‌یکی اعداد را جمع می‌کند.


———————-

7️⃣ مثال کاربردی
فرض کن می‌خواهیم مجموع چند نمره را حساب کنیم:
def sum_scores(*scores):
total = 0

for score in scores:
total += score

return total

result = sum_scores(18, 19, 15, 20)

print(result)

خروجی:
72

—————————

🧵 بخش دوم — String Methods
حالا می‌رسیم به متدهای مهم String.
فرض کنیم:
name = "python programming"



8️⃣ lower()
همه حروف را کوچک می‌کند:
print(name.lower())

مثلاً:
PYTHON

تبدیل می‌شود به:
python



9️⃣ upper()
همه حروف را بزرگ می‌کند:
print(name.upper())

🔟 دسترسی به کاراکتر
print(name[0])

اولین کاراکتر را می‌دهد.
⚠️ Index از 0 شروع می‌شود.
مثلاً:
python
012345

پس:
name[0]  # p
name[1] # y
name[2] # t



1️⃣1️⃣ startswith()
بررسی می‌کند رشته با چه چیزی شروع می‌شود:
print(name.startswith("py"))

اگر شروع شود:
True

اگر شروع نشود:
False



1️⃣2️⃣ endswith()
بررسی می‌کند رشته با چه چیزی تمام می‌شود:
print(name.endswith("ing"))



1️⃣3️⃣ find()
موقعیت یک عبارت را پیدا می‌کند:
name = "python programming"

print(name.find("py"))

خروجی:
0

چون py از Index صفر شروع شده.

1️⃣4️⃣ index()
مثل find() موقعیت عبارت را پیدا می‌کند:
print(name.index("py"))

اما اگر پیدا نشود:
name.index("xyz")

❌ Error می‌دهد.
تفاوت:
find()
↓
پیدا نشد → -1

index()
↓
پیدا نشد → Error

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


1️⃣5️⃣ split()
رشته را بر اساس یک جداکننده تقسیم می‌کند.
مثلاً:
name = "ali,reza,mohammad"

print(name.split(","))

خروجی:
['ali', 'reza', 'mohammad']

یعنی هر جا , دید، رشته را جدا کن.




1️⃣6️⃣ splitlines()
برای جدا کردن رشته بر اساس خط‌های جدید استفاده می‌شود.
مثلاً:
text = "Ali\nReza\nMohammad"

print(text.splitlines())

خروجی:
['Ali', 'Reza', 'Mohammad']