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
فصل نهم - قسمت هفتاد و هشتم 🐧 مقدمه - 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 و پایان دوره الپیک هستش
فصل دهم - قسمت نود و چهارم🐧
intro » امن سازی لینوکس

———————
در این فصل روی امنیت لینوکس تا حد کم کار میکنیم و در سطح سیستم و لینوکس کار میکنیم

1: انجام وظایف امنیتی توسط مدیر
2: برسی امنیت در سطح هاست
3: امن سازی داده ها با رمزنگاری
4: صحبت پایانی و ادامه مسیر
فصل دهم - قسمت نود و پنجم🐧
برسی ورود به سیستم

———————
بررسی ورود به سیستم
در لینوکس می‌توانیم ببینیم:
چه کاربرانی الان وارد سیستم هستند
هر کاربر از چه ترمینالی وصل شده
از چه زمانی وارد شده
چه کاری در حال انجام است
چه کسانی قبلاً وارد سیستم شده‌اند
حتی ورودهای مربوط به یک کاربر خاص مثل 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