فصل نهم - قسمت هفتاد و هشتم 🐧
مقدمه - intro ( شل اسکریپتینگ)
———————
در فصل با قسمت های زیر اشنا میشویم
1 : نوشتن اولیه شکل اسکریپت
2 : خودکار سازی شل اسکریپت
مقدمه - intro ( شل اسکریپتینگ)
———————
در فصل با قسمت های زیر اشنا میشویم
1 : نوشتن اولیه شکل اسکریپت
2 : خودکار سازی شل اسکریپت
My folder vip
فصل نهم - قسمت هفتاد و هشتم 🐧 مقدمه - intro ( شل اسکریپتینگ) ——————— در فصل با قسمت های زیر اشنا میشویم 1 : نوشتن اولیه شکل اسکریپت 2 : خودکار سازی شل اسکریپت
فصل نهم - قسمت هفتاد و نهم 🐧
متغیر ها در خط فرمان
———————
این قسمت خیلی مهمه، چون Variableها پایهی کار با Shell و Bash هستند و در اسکریپتنویسی هم زیاد ازشان استفاده میکنیم.
_————————————-
1️⃣ Variable چیست؟
Variable یعنی یک نام که یک مقدار را در خودش نگه میدارد.
مثلاً:
اینجا:
برای نمایش مقدار:
خروجی:
🧠 علامت
———————-
2️⃣ ساخت Variable در Bash
مثلاً:
نمایش:
خروجی:
——————————
⚠️ فاصله اطراف
این درست است:
این غلط است:
چون Bash آن را به عنوان یک Command و Argument تفسیر میکند.
—————————
3️⃣ Variable را با
مثلاً:
بعد:
یا:
خروجی:
—————————
4️⃣ Local Variable چیست؟
وقتی Variable را به صورت معمولی ایجاد میکنی:
این Variable در Shell فعلی وجود دارد.
مثلاً:
جواب:
اما اگر یک Shell جدید باز کنیم:
و بزنیم:
معمولاً چیزی نمایش داده نمیشود.
چرا؟
چون
————————-
5️⃣ Environment Variable چیست؟
اگر بخواهیم یک Variable به Shellهای فرزند هم منتقل شود، از:
استفاده میکنیم.
مثلاً:
حالا:
و داخل Shell جدید:
خروجی:
چون Variable به عنوان Environment Variable Export شده است.
———————-
6️⃣ روش کوتاهتر Export
میتوانی از ابتدا اینطور بنویسی:
بعد:
خروجی:
———————-
متغیر ها در خط فرمان
———————
این قسمت خیلی مهمه، چون 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 است.
مثلاً وقتی مینویسی:
Shell دستور را دریافت و اجرا میکند.
معروفترین Shellها:
اما در LPIC-1، Bash اهمیت بیشتری دارد.
—————————
مهم
اگر در دوره گفته شده «سه مدل Shell»، معمولاً منظور Shellهای معروف Unix/Linux است؛ مثلاً:
Bash
یکی از رایجترین Shellها.
sh
Shell استاندارد/سازگار با POSIX که در سیستمهای مختلف ممکن است به Shell دیگری لینک باشد.
مثلاً در بعضی Debianها:
Zsh
یک Shell پیشرفته با امکانات زیاد.
📌 اما تعداد Shellها محدود به سه تا نیست؛ Linux میتواند Shellهای مختلفی داشته باشد.
—————————-
3️⃣ Shell فعلی را چطور بفهمیم؟
مثلاً:
اما یک نکته مهم:
برای دیدن Process مربوط به Shell فعلی:
مثلاً:
——————
4️⃣ Shell کاربران کجا ثبت میشود؟
اطلاعات Userها در:
قرار دارد.
مثلاً:
قسمت آخر:
Login Shell کاربر است.
اگر:
باشد، معمولاً کاربر برای Login عادی اجازه ورود ندارد.
——————-
5️⃣ فایلهای تنظیمات Shell
قسمت مهم این جلسه همین است.
Bash برای تنظیم محیط خودش فایلهای مختلفی را میخواند.
مهمترینها:
اما همه این چهار فایل پشت سر هم خوانده نمیشوند.
برای Login Shell، Bash این ترتیب را بررسی میکند:
یعنی از بین سه فایل User معمولاً اولین فایلی که وجود داشته باشد خوانده میشود.
————————-
6️⃣
تنظیمات عمومی برای Userها:
یعنی تنظیمات مربوط به محیط Login که میتواند برای کاربران سیستم اعمال شود.
————————-
7️⃣
فایل:
تنظیمات Login Shell مخصوص همان User است.
مثلاً:
———————
8️⃣
اگر:
وجود نداشته باشد، Bash به سراغ:
میرود.
———————
9️⃣
اگر دو فایل قبلی وجود نداشته باشند:
خوانده میشود.
پس این ترتیب را حفظ کن:
❗️ نکته امتحانی:
Bash از فایلهای
———————
🔟 Interactive Shell چیست؟
Interactive یعنی Shell مستقیماً با کاربر در تعامل است.
مثلاً Terminal را باز میکنی:
و میبینی:
بعد میتوانی دستور بزنی:
این یک Interactive Shell است.
————————-
1️⃣1️⃣ Non-Interactive Shell
در Non-interactive، Shell برای اجرای یک Script یا Command اجرا میشود و منتظر وارد کردن دستور از کاربر نمیماند.
مثلاً:
یا:
در این حالت Shell برای اجرای دستورات استفاده شده، نه برای تعامل مستقیم با کاربر.
————————
1️⃣2️⃣ Subshell چیست؟
Subshell یعنی یک Shell فرزند که از Shell فعلی ایجاد شده است.
مثلاً:
ساختار:
میتوانی PIDها را ببینی:
بعد:
دوباره:
PID تغییر میکند.
برای خروج:
_————————
1️⃣3️⃣ نکته مهم Variable و Subshell
فرض کن:
این یک Shell Variable است.
اگر:
اجرا کنی:
ممکن است چیزی نمایش داده نشود.
اما اگر:
کنی:
میبینی:
چون Variable به Environment منتقل شده است.
———————
1️⃣5️⃣ Alias چیست؟
Alias یعنی یک نام کوتاه برای یک Command.
مثلاً:
حالا:
تقریباً مثل:
اجرا میشود.
1️⃣6️⃣ دیدن Aliasها
تمام Aliasهای تعریفشده را نشان میدهد.
مثلاً:
1️⃣7️⃣ حذف Alias
حالا:
دیگر Alias نیست.
برای حذف همه Aliasها:
1️⃣8️⃣ Alias دائمی
اگر فقط بنویسی:
معمولاً فقط برای همان Shell Session است.
برای دائمی کردن در Bash میتوانی آن را در:
قرار دهی.
مثلاً:
اضافه کن:
بعد برای اعمال بدون Logout:
یا:
⚠️
این یکی را خیلی خوب حفظ کن.
ولی برای Interactive non-login Bash معمولاً:
خوانده میشود.
پس:
خیلی از
⭐️ خلاصه قسمت ۸۰ برای دفتر
Shell
معروفها:
Shell کاربر:
یا:
فایلهای Login Bash
⚠️ از سه فایل User فقط اولین فایل موجود انتخاب میشود.
Interactive
Non-Interactive
Subshell
ایجاد:
خروج:
Alias
ساخت:
نمایش:
حذف:
دائمی کردن:
~/.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
————————-
انواع شل
———————
این قسمت ادامهی 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 را داخل یک فایل قرار بدهیم تا بتوانیم آنها را یکجا و خودکار اجرا کنیم.
مثلاً بهجای اینکه هر روز اینها را جداگانه بزنیم:
میتوانیم همه را داخل یک فایل قرار دهیم:
و فقط اجرا کنیم:
یعنی Shell Script مثل یک برنامه کوچک برای خودکارسازی کارهای Linux است.
————————
2️⃣ Shellهای مناسب برای Script
از Shellهای مختلف میتوان Script نوشت.
مهمترینها:
در دوره LPIC-1 تمرکز اصلی معمولاً روی:
است.
مثلاً:
یعنی این Script با Bash اجرا شود.
————————-
3️⃣ اجرای چند Command با
با
مثلاً:
هر سه دستور اجرا میشوند.
نکته مهم:
مثلاً:
حتی اگر
ساختار:
—————————
4️⃣ اجرای شرطی با
مثلاً:
اگر
اما اگر ساخت Directory شکست بخورد، دستور دوم اجرا نمیشود.
مثال کاربردی:
اگر Ping موفق شود:
نمایش داده میشود.
🧠 حفظ کن:
—————————
5️⃣ اجرای شرطی با
یعنی:
مثلاً:
اگر
نمایش داده میشود.
مثال دیگر:
اگر Ping موفق شود:
و اگر شکست بخورد:
————————————-
مثال:
⬅️ همیشه
⬅️ فقط در صورت موفقیت
⬅️ فقط در صورت شکست
———————
7️⃣ Pipe یا
Pipe برای انتقال خروجی یک Command به ورودی Command بعدی استفاده میشود.
مثلاً:
اینجا:
یعنی خروجی
مثلاً:
یعنی خروجی
——————-
8️⃣ Pipe با چند Command
Pipe میتواند چند مرحله داشته باشد:
ساختار:
یعنی:
Processها را نمایش بده.
موارد مربوط به SSH را فیلتر کن.
تعداد خطوط را بشمار.
————————————
9️⃣ تفاوت
خیلی مهم:
Pipe:
یعنی:
AND:
یعنی:
پس این دو کاملاً متفاوتاند.
————————-
مقدمه ای بر شل اسکریپتینگ
———————
فصل نهم - قسمت هشتاد و یکم 🐧
مقدمه ای بر شل اسکریپتینگ
———————
این قسمت یکی از مهمترین قسمتهای فصل نهمه، چون از اینجا وارد 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 اجرا شود:
این خط را Shebang میگوییم.
———————-
2️⃣ ساخت یک فایل خالی
مثلاً:
فایل ساخته میشود:
پسوند
———————
3️⃣ ویرایش فایل
مثلاً با
و داخلش بنویس:
ذخیره کن.
————————
4️⃣ روش اول اجرای Script
اگر مجوز Execute نداشته باشد:
حالا:
اجرا میشود.
——————-
5️⃣
این دستور:
یعنی:
مقایسه:
—————————
6️⃣ چرا
وقتی مینویسیم:
اگر فقط بنویسی:
ممکن است Bash فایل را پیدا نکند، چون دایرکتوری فعلی معمولاً در
——————-
7️⃣ روش اجرای بدون
حتی اگر فایل Execute نباشد، میتوانی مستقیماً به Bash بدهی:
یا:
در این حالت Bash فایل را میخواند و اجرا میکند.
اموزش اولیه شل اسکریپتینگ
———————
آموزش اولیه 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 فایل را میخواند و اجرا میکند.
فصل نهم - قسمت هشتاد و سوم 🐧
نمایش پیام به کاربر
———————
نمایش پیام به کاربر با
1.
دستور
مثلاً:
خروجی:
یا:
خروجی:
———————————
2. استفاده از متن ساده
اگر متن فاصله داشته باشد، بهتر است آن را داخل کوتیشن قرار دهیم:
اما حتی این هم کار میکند:
خروجی هر دو:
ولی استفاده از
—————————
3. Double Quote یا
وقتی متن را داخل دابل کوتیشن قرار میدهیم:
Shell محتوای داخل آن را بررسی میکند و متغیرها را Expand میکند.
مثلاً:
خروجی:
یعنی:
مثال کاربردی:
خروجی:
——————-
4. Single Quote یا
وقتی از Single Quote استفاده کنیم:
Shell مقدار متغیر را جایگزین نمیکند.
خروجی مثلاً:
یعنی
مقایسه مهم
خروجی:
⭐️ نکته امتحانی
مثلاً:
مقدار
اما:
خود عبارت
——————————
5. متغیرها در
در Bash برای استفاده از مقدار متغیر از
مثلاً:
خروجی:
یا:
خروجی:
⚠️ نکته مهم درباره جزوه
اگر نوشته شده:
برای Bash اشتباه است.
در Bash باید بنویسی:
مثلاً:
———————-
6. متغیرهای آماده سیستم
خود Linux تعدادی Environment Variable دارد.
مثلاً:
نام کاربر فعلی را نشان میدهد.
مسیر Home کاربر را نشان میدهد.
مسیر دایرکتوری فعلی را نشان میدهد.
Shell پیشفرض کاربر را نشان میدهد.
مثلاً ممکن است:
———————-
7. ترکیب چند متغیر
مثلاً:
خروجی:
یا همه را در یک خط:
————————
8. استفاده از
گاهی باید متغیر را داخل
مثلاً:
خروجی:
چرا؟
چون Bash باید بفهمد نام متغیر
اگر بنویسیم:
Bash تصور میکند اسم متغیر:
است.
پس:
بهتر است.
—————————————
9. استفاده از Argument در
این قسمت خیلی مهمه.
وقتی یک Script را اجرا میکنیم، میتوانیم بعد از اسم فایل، اطلاعاتی به آن بدهیم.
مثلاً:
در Script:
خروجی:
اینجا:
یعنی اولین Argument.
————————
مثال با چند Argument
فایل:
محتوا:
اجرا:
خروجی:
یعنی:
————————
10.
متغیر خاص:
تعداد Argumentهایی که به Script داده شده را نشان میدهد.
مثلاً:
اجرا:
خروجی:
—————
11.
مثلاً:
اجرا:
خروجی:
12.
یک مورد خیلی مهم دیگر:
نام Script را نشان میدهد.
مثلاً:
اگر اجرا کنیم:
خروجی:
———————-
13. یک مثال واقعی و خیلی خوب 🔥
فرض کن میخواهیم Scriptی داشته باشیم که اسم کاربر را بگیرد و به او خوشآمد بگوید.
فایل:
محتوا:
اجرا:
خروجی مثلاً:
اینجا چند مفهوم را با هم استفاده کردیم:
———————
14. چاپ
یک نکته جالب:
اگر بنویسی:
متغیر Expand میشود.
اما:
خود
پس Single Quote برای مواقعی که میخواهیم
———————
نمایش پیام به کاربر
———————
نمایش پیام به کاربر با
echo1.
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. دستور
دستور:
برای گرفتن اطلاعات از کاربر استفاده میشود.
یعنی Script متوقف میشود، منتظر میماند کاربر چیزی تایپ کند و Enter بزند، سپس آن مقدار را داخل یک متغیر ذخیره میکند.
مثلاً:
اگر کاربر وارد کند:
خروجی:
ساختار کلی:
مثلاً:
یعنی:
————————-
2. چرا
در حالت عادی:
بعد از چاپ متن،
اما:
گزینه
بنابراین کاربر میتواند در همان خط جواب بدهد:
—————
3. استفاده از
اما یک روش تمیزتر وجود دارد.
به جای:
میتوانیم بنویسیم:
یعنی:
مثال:
کاربر:
خروجی:
⭐️ نکته امتحانی
این:
تقریباً معادل:
است.
———————
4. گرفتن سن از کاربر
مثال جزوه شما:
اگر کاربر وارد کند:
محاسبه:
خروجی:
البته برای محاسبات Bash امروزی بهتر است از این روش استفاده کنیم:
——————
5.
این یکی مهم است.
گزینه:
برای تعیین Timeout در
یعنی به کاربر فقط یک مدت مشخص فرصت میدهیم که ورودی را وارد کند.
مثلاً:
یعنی:
اگر در ۵ ثانیه ورودی وارد نشود،
مثال کاربردی:
کاربرد واقعی
مثلاً Scriptی داری که میگوید:
نمیخواهی Script برای همیشه منتظر کاربر بماند.
میتوانی بگویی:
کاربر ۱۰ ثانیه فرصت دارد.
⭐️ حفظ کن:
—————
6.
گزینه:
باعث میشود ورودی کاربر روی صفحه نمایش داده نشود.
است.
مهمترین کاربردش گرفتن Password است.
مثلاً:
کاربر رمز را تایپ میکند، اما چیزی روی صفحه دیده نمیشود.
مثلاً:
کاربر تایپ میکند:
ولی روی صفحه چیزی مثل:
نمایش داده نمیشود؛ معمولاً حتی ستاره هم نمیبینی.
بعد:
⚠️ نکته امنیتی
مثلاً:
مقدار همچنان در متغیر:
وجود دارد.
—————————-
7. ترکیب
خیلی کاربردی:
چرا
چون
فقط برای رفتن به خط بعد است.
8. ترکیب
حتی میتوانیم چند Option را با هم استفاده کنیم.
مثلاً:
یعنی:
—————————-
9. یک مثال کاملتر 🔥
یک Script ساده برای Login:
مثلاً:
رمز هنگام تایپ نمایش داده نمیشود.
——————-
11. چند ورودی با یک
میتوانیم چند متغیر را همزمان بگیریم:
اگر کاربر بزند:
آنگاه:
مثلاً:
خروجی:
———————
12. مثال کاربردی برای کار امنیتی 🛡
فرض کن میخواهیم IP را از کاربر بگیریم:
اجرا:
حالا میتوانیم آن را وارد یک دستور کنیم:
یا در محیط آزمایشگاهی مجاز:
پس
——————-
گرفتن متغیر از کاربر
———————
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 آخرین دستور:
مهمترین حالتها:
⚠️ پس دقیقتر این است که نگوییم فقط
مثال:
اگر
اما:
اگر
—————————-
2. یک مثال خیلی ساده
اگر ساخت پوشه موفق باشد:
حالا:
اگر اجازه ساخت نداشته باشی، مثلاً:
یا یک کد غیرصفر دیگر دریافت میکنی.
——————————
3. نکته مهم درباره
مثلاً:
اینجا
ولی اگر بزنیم:
اینجا
——————————
4. دستور
مثلاً:
یعنی:
و:
یعنی:
————————
5.
اگر بنویسی:
یعنی:
مثلاً:
بعد از اجرای Script:
خروجی:
یعنی Script خودش اعلام کرده که با کد
⭐️ نکته مهم
خود برنامهنویس میتواند برای خطاهای مختلف کدهای مختلف تعریف کند:
مهم این است که:
——————-
6. مثال کاربردی 🔥
فرض کن Script بررسی میکند که یک فایل وجود دارد یا نه:
اگر فایل وجود داشته باشد:
و:
میشود:
اگر فایل وجود نداشته باشد:
و:
میشود:
اینجا
نمایش وضعیت اجرای فرمان — 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. روش قدیمی با
مثلاً:
خروجی:
یعنی:
——————-
2. روش پیشنهادی:
خروجی:
مثال:
خروجی:
——————————
4. یک مثال کاربردی با
مثلاً سن کاربر را میگیریم:
اگر وارد کند:
خروجی:
اعمال ریاضی در خط فرمان
———————
در 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
———————
فرمان
فرمان
مثلاً میخواهیم بفهمیم:
آیا یک فایل وجود دارد؟
آیا یک پوشه وجود دارد؟
آیا دو عدد برابرند؟
آیا یک رشته خالی است؟
آیا یک فایل قابل اجراست؟
——————————-
1.
ساختار کلی:
مثلاً:
خروجی:
یعنی شرط درست است.
اگر:
خروجی غیرصفر میشود؛ یعنی شرط غلط است.
پس:
———————
2. براکت
در Bash میتوانیم به جای
استفاده کنیم.
مثلاً:
این از نظر مفهومی همان:
است.
⚠️ نکته خیلی مهم
بنابراین فاصلهها مهماند:
درست:
غلط:
———————-
3. بررسی فایلها 📁
این قسمت خیلی مهم است.
بررسی میکند چیزی با این نام وجود دارد یا نه:
بررسی میکند آیا فایل معمولی (Regular File) است:
بررسی میکند آیا Directory است:
آیا فایل قابل خواندن است؟
آیا فایل قابل نوشتن است؟
آیا فایل قابل اجرا است؟
آیا فایل وجود دارد و حجم آن بیشتر از صفر است؟
————————
مثال واقعی
فرض کن میخواهیم ببینیم فایل وجود دارد یا نه:
چون
———————-
5. مقایسه اعداد 🔢
برای اعداد از این عملگرها استفاده میکنیم:
عملگر:
معنی:
مثلاً:
یعنی:
یا:
یعنی:
مثال کاربردی:
—————-
6. مقایسه رشتهها 📝
برای Stringها میتوانیم از:
و:
استفاده کنیم.
مثلاً:
شرط درست است.
یا:
این هم درست است.
——————-
7. بررسی خالی بودن String
اگر String خالی باشد، True است:
اگر String خالی نباشد، True است:
مثلاً:
——————-
8. ترکیب شرطها
AND →
هر دو شرط باید درست باشند:
OR →
حداقل یکی درست باشد:
9. NOT →
برای برعکس کردن نتیجه:
یعنی:
مثال:
———————
فرمان 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 برای بررسی یک شرط و اجرای دستورات بر اساس نتیجه آن استفاده میشود.ساختار اصلی:
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
فصل نهم - قسمت هشتاد و نهم 🐧
استفاده از
———————
1.
وقتی چند انتخاب مختلف داریم،
ساختار:
————————
مثال شبکهای که گفتی 🔥
میخواهیم کاربر یکی از اینها را وارد کند:
و دستور مربوطه اجرا شود.
اگر کاربر بنویسد:
اجرا میشود:
اگر بنویسد:
اجرا میشود:
و:
اجرا میشود:
——————-
2.
مثلاً:
وقتی اجرا کنی، Bash چیزی شبیه این نشان میدهد:
کاربر مثلاً:
و
تفاوت:
استفاده از
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 خودش یک منوی شمارهدار میسازد.
فصل نهم - قسمت نودم🐧
استفاده از حلقهها
———————
چیست؟
حلقه یعنی:
مثلاً به جای اینکه ۱۰ بار بنویسیم:
از حلقه استفاده میکنیم.
——————-
مثلاً:
خروجی:
و:
خروجی:
—————
حلقه
مثلاً:
خروجی:
ساختار:
————————
🔥 پورت اسکنر خیلی ساده
برای محیطی که مالک آن هستی یا اجازه تستش را داری، میتوانیم یک TCP port checker ساده با Bash بسازیم.
مثلاً:
مثلاً:
ممکن است:
این یک Port Scanner بسیار ابتدایی است و قابلیتهای ابزارهایی مثل Nmap را ندارد.
——————
استفاده از حلقهها
———————
چیست؟
حلقه یعنی:
یک دستور یا مجموعهای از دستورات را چند بار اجرا کنیم.
مثلاً به جای اینکه ۱۰ بار بنویسیم:
echo 1
echo 2
echo 3
...
از حلقه استفاده میکنیم.
——————-
seqseq برای تولید یک دنباله از اعداد استفاده میشود.مثلاً:
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 را ندارد.
——————
فصل نهم - قسمت نود و دوم🐧
اجرای فرمان در حالت خاص با
———————
است.
کارش این است که یک برنامه را طوری اجرا کنیم که با بستهشدن Session/ترمینال، تا حد امکان به SIGHUP وابسته نباشد و ادامه دهد.
مثلاً:
اینجا دو مفهوم داریم:
خروجی معمولاً به فایلی مثل:
میرود، مگر اینکه خودمان Redirect کنیم.
مثلاً:
خیلی کاربردی برای SSH است.
مثلاً:
بعد SSH را قطع میکنی و Script میتواند ادامه پیدا کند.
⭐️ نکته
—————————-
فصل نهم — قسمت ۹۲ 🐧
این قسمت برای مدیریت Linux خیلی مهم است.
دو ابزار داریم:
——————-
1.
مثلاً:
بعد داخل محیط
و در پایان:
یعنی:
————————
اجرای یک Script با
مثلاً:
یعنی:
پس نکتهای که در جزوهات نوشتهای درست است:
——————-
2.
مثلاً:
برای مدیریت Cron کاربر:
——————-
ساختار Cron
ساختار استاندارد پنج فیلد زمانی:
مثلاً:
یعنی:
مثال:
یعنی:
———————-
اجرای فرمان در حالت خاص با
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.
atat برای اجرای یکباره یک دستور در زمان مشخص است.مثلاً:
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.
croncron برای اجرای زمانبندیشده و تکرارشونده استفاده میشود.مثلاً:
هر روز ساعت ۲
هر دوشنبه
هر ماه
هر ۵ دقیقه
برای مدیریت 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های دیگران را بررسی کنی.
تغییرات پروژه را دنبال کنی.
مثلاً برای یک پروژه:
بعد:
و در صورت داشتن Repository روی GitHub، آن را به Remote متصل میکنی.
استفاده از 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 و پایان دوره الپیک هستش
از فردا فصل دهم دوره الپیک1 قسمت 102 رو داریم
که فصل اخر الپیک1 و پایان دوره الپیک هستش
فصل دهم - قسمت نود و چهارم🐧
intro » امن سازی لینوکس
———————
در این فصل روی امنیت لینوکس تا حد کم کار میکنیم و در سطح سیستم و لینوکس کار میکنیم
1: انجام وظایف امنیتی توسط مدیر
2: برسی امنیت در سطح هاست
3: امن سازی داده ها با رمزنگاری
4: صحبت پایانی و ادامه مسیر
intro » امن سازی لینوکس
———————
در این فصل روی امنیت لینوکس تا حد کم کار میکنیم و در سطح سیستم و لینوکس کار میکنیم
1: انجام وظایف امنیتی توسط مدیر
2: برسی امنیت در سطح هاست
3: امن سازی داده ها با رمزنگاری
4: صحبت پایانی و ادامه مسیر
فصل دهم - قسمت نود و پنجم🐧
برسی ورود به سیستم
———————
بررسی ورود به سیستم
در لینوکس میتوانیم ببینیم:
چه کاربرانی الان وارد سیستم هستند
هر کاربر از چه ترمینالی وصل شده
از چه زمانی وارد شده
چه کاری در حال انجام است
چه کسانی قبلاً وارد سیستم شدهاند
حتی ورودهای مربوط به یک کاربر خاص مثل
————————-
1️⃣ فرمان
فرمان
مثلاً:
معنی ستونها:
نکته مهم
————————-
2️⃣
برای نمایش اطلاعات کاملتر:
یا:
اطلاعات بیشتری درباره Sessionها و وضعیت Login نمایش میدهد.
🎯 نکته امتحانی:
→ کاربران فعلی
→ اطلاعات کاملتر Login/Session
——————————
3️⃣ فرمان
فرمان
مثلاً:
مهمترین تفاوت:
فقط وضعیت Login کاربران را بررسی میکند.
علاوه بر Login، نشان میدهد کاربر الان چه کاری انجام میدهد.
مثلاً:
پس برای بررسی سریع سیستم،
—————
4️⃣ فرمان
تا اینجا
اما
مثلاً:
یعنی
————————
5️⃣
اگر بخواهیم فقط ورودهای کاربر
این دستور فقط رکوردهای مربوط به کاربر
مثلاً:
کاربرد امنیتی 🔐
این دستور برای بررسی ورودهای مشکوک به
مثلاً اگر ببینی:
و این IP برای خودت نیست، باید بررسی بیشتری انجام بدهی.
البته وجود یک Login از IP ناشناس بهتنهایی اثبات نفوذ نیست؛ ممکن است NAT، VPN، Bastion یا سرویس مدیریتی در میان باشد.
برسی ورود به سیستم
———————
بررسی ورود به سیستم
در لینوکس میتوانیم ببینیم:
چه کاربرانی الان وارد سیستم هستند
هر کاربر از چه ترمینالی وصل شده
از چه زمانی وارد شده
چه کاری در حال انجام است
چه کسانی قبلاً وارد سیستم شدهاند
حتی ورودهای مربوط به یک کاربر خاص مثل
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
دستور:
آدرس Loopback است و به خود سیستم اشاره میکند.
یعنی:
TCP Connect Scan است.
Nmap تلاش میکند یک اتصال TCP واقعی به پورت ایجاد کند تا وضعیت آن را مشخص کند.
مثلاً ممکن است خروجی چیزی شبیه این باشد:
یعنی مثلاً روی سیستم:
در حال Listen هستند.
—————————-
2️⃣ اسکن UDP
در متن شما نوشته شده:
اما ⚠️ گزینه صحیح Nmap برای UDP این است:
حروف گزینه مهم هستند؛
مثلاً:
برای بررسی سرویسهای UDP استفاده میشود.
—————-
3️⃣ بررسی پورتهای Listen با netstat
دستور:
یا شکل کوتاه:
اگر UDP هم بخواهیم:
معنی:
پس:
یعنی:
——————-
4️⃣ بررسی با
امروزه
دستور شما:
معنی:
مثلاً:
——————-
⭐️ نکته مهم امنیتی:
اگر ببینی:
یعنی سرویس روی تمام Interfaceهای IPv4 سیستم Listen میکند.
اما:
یعنی فقط از طریق Loopback قابل دسترسی است.
پس این دو با هم فرق دارند:
—————-
5️⃣ بررسی با
دستور:
میتوانیم بفهمیم کدام Process یک پورت TCP را در اختیار دارد.
مثلاً:
اینجا میفهمیم:
—————
6️⃣ بررسی پورت 22
دستور:
این دستور نشان میدهد چه Processهایی از TCP Port 22 استفاده میکنند.
مثلاً:
پس متوجه میشویم SSH توسط
7️⃣ دستور
TCP Port 22
یعنی:
مثلاً:
———————
8️⃣ بررسی UDP
در متن شما:
یعنی Processهایی که از UDP Port 822 استفاده میکنند را بررسی کن.
اگر منظورتان پورت دیگری بوده، فقط شماره پورت را تغییر میدهیم:
——————-
9️⃣ چرا IPv6 مهم است؟ 🌐
یکی از نکات مهم این قسمت همین است.
ممکن است شما IPv4 را بررسی کنی و مثلاً ببینی:
اما سرویس از طریق IPv6 هم در دسترس باشد.
مثلاً:
پس هنگام بررسی Listening Socketها باید IPv4 و IPv6 را هم در نظر بگیری.
در
و برای دیدن جزئیات بیشتر:
همچنین میتوانی خانواده آدرس را در خروجی ببینی:
اولی IPv4 و دومی IPv6 است.
——————————-
🛡 رویکرد امنیتی این قسمت
فرض کن یک سرور Linux داری.
اول:
میزنی.
میبینی:
حالا سؤال مهم:
اگر مثلاً MySQL فقط باید توسط برنامهای روی همان سرور استفاده شود، بهتر است نیازی به Public Listening نداشته باشد.
یا اگر یک سرویس کاملاً غیرضروری است:
این همان مفهوم Hardening است.
اسکن کردن سیستم
———————
قبل از اینکه یک مهاجم سیستم ما را بررسی کند، خودمان باید سیستم خودمان را بررسی کنیم.
هدف:
سرویسهای غیرضروری را پیدا و غیرفعال کنیم.
پورتهای باز را بررسی کنیم.
سرویسهایی که روی پورتها 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 → SSH80 → HTTP443 → 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️⃣ دستور
fuserfuser هم برای پیدا کردن 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 را بهصورت امن تنظیم کنیم؟
——————————-
1️⃣ محل ذخیره رمز عبور کجاست؟
در لینوکس اطلاعات مربوط به حساب کاربران در:
قرار دارد.
اما رمز عبور واقعی در
هش رمز عبور معمولاً در:
ذخیره میشود.
مثلاً:
فایل
ساختار کلی یک خط:
مقدار مربوط به رمز، Hash است، نه خود Password به صورت Plain Text.
🎯 نکته امتحانی
———————
2️⃣ چرا رمز در
اگر Hash رمز داخل
به همین دلیل اطلاعات حساس به:
منتقل شده و دسترسی به آن محدودتر است.
————————
3️⃣ تنظیم یا تغییر رمز عبور
برای تغییر رمز کاربر فعلی:
سیستم از شما رمز فعلی و سپس رمز جدید را میخواهد.
برای تغییر رمز یک کاربر دیگر، معمولاً باید دسترسی مدیریتی داشته باشید:
مثلاً:
————————
4️⃣ Lock کردن کاربر 🔒
برای Lock کردن حساب:
مثلاً:
برای باز کردن Lock:
یعنی:
——————
روش دیگر با
میتوان از:
برای Lock استفاده کرد.
و:
برای Unlock.
نکته
این دستورات با تغییر وضعیت رمز/حساب کار میکنند؛ برای مسدودسازی کامل دسترسی یک حساب در همه روشهای احراز هویت، باید سیاستهای سرویس و سیستم را هم در نظر گرفت.
————————-
5️⃣ گروه
در توزیعهایی مثل Debian و Ubuntu، گروه:
معمولاً برای دادن دسترسی اجرای دستورات با
مثلاً:
حالا کاربر
بررسی عضویت:
یا:
————————-
6️⃣ گروه
در بسیاری از توزیعهای Red Hat مانند:
RHEL
CentOS
Fedora
AlmaLinux
گروه:
برای دسترسی مدیریتی از طریق
مثلاً:
بعد از Login مجدد، کاربر میتواند طبق تنظیمات sudo از دسترسی مدیریتی استفاده کند.
⭐️ تفاوت مهم
البته این یک قاعده رایج است، نه یک قانون مطلق؛ تنظیمات واقعی
—————————-
7️⃣
تنظیمات مربوط به اینکه چه کسی چه دستورات مدیریتی را با sudo اجرا کند در:
تعریف میشود.
مثلاً ممکن است قوانینی برای:
وجود داشته باشد.
⚠️ فایل
یک Syntax اشتباه میتواند باعث شود
——————————
8️⃣ چرا
به جای اینکه مستقیم بنویسیم:
روش استاندارد این است:
یعنی اگر اشتباه Syntax داشته باشیم، احتمال خراب شدن تنظیمات sudo کمتر میشود.
🎯 نکته امتحانی خیلی مهم
———————
9️⃣ مثال ساده
فرض کنیم میخواهیم گروه
با:
تنظیمات مربوط به گروه را بررسی یا تنظیم میکنیم.
در بسیاری از سیستمهای RHEL-like ممکن است خطی شبیه این وجود داشته باشد:
معنی کلی:
⚠️ این یک دسترسی بسیار قدرتمند است؛ روی سرور واقعی باید فقط به کاربر/گروهی داده شود که واقعاً نیاز دارد.
—————————
🔐 یک سناریوی واقعی
فرض کن یک سرور Linux داری و کاربر:
نباید با
بهجای دادن Password مربوط به
این مدل معمولاً مدیریت دسترسی را بهتر میکند.
امن سازی دسترسی و رمز عبور
———————
امنسازی دسترسی و رمز عبور
هدف این قسمت اینه که یاد بگیریم در لینوکس:
رمز عبور کاربران کجا نگهداری میشود؟
چطور رمز کاربر را تنظیم یا تغییر دهیم؟
چطور حساب کاربری را 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 ارتباط را رمزنگاری میکند؛ بنابراین اطلاعاتی مثل دستورات و اطلاعات احراز هویت در مسیر بهصورت ساده ارسال نمیشوند.
پورت پیشفرض SSH:
——————-
2️⃣ احراز هویت با Password
روش ساده:
بعد سیستم Password میخواهد:
اما برای سرورهای مهم، استفاده از SSH Key Authentication معمولاً امنتر و مناسبتر است.
————————-
3️⃣ SSH Key چیست؟
SSH از یک جفت کلید استفاده میکند:
به این مدل میگوییم:
Public/Private Key Pair
———————-
4️⃣ Private Key 🔴
Private Key باید محرمانه بماند.
مثلاً:
یا در بعضی سیستمها:
⚠️ Private Key را نباید برای کسی ارسال کنیم.
مثلاً:
———————
5️⃣ Public Key 🟢
Public Key برخلاف Private Key میتواند روی سرور مقصد قرار بگیرد.
مثلاً:
ساختار کلی:
Private Key روی Client میماند.
Public Key روی Server قرار میگیرد.
———————
6️⃣ ساخت SSH Key
در متن شما نوشته شده:
اما دستور صحیح:
مثلاً روش پیشنهادی امروزی:
بعد ممکن است بپرسد:
و سپس:
——————-
7️⃣ Passphrase چیست؟
Passphrase یک رمز برای محافظت از Private Key است.
یعنی:
پس دو مفهوم را قاطی نکن:
Password
رمز حساب کاربری روی سرور.
Passphrase
رمزی که میتواند Private Key را روی سیستم خودت محافظت کند.
———————————
8️⃣ فعال کردن SSH Key روی سرور
بعد از ساخت Key، باید Public Key را روی سرور قرار دهیم.
روش راحت:
بعد از وارد کردن Password، Public Key در فایل:
روی سرور قرار میگیرد.
——————————
9️⃣ اتصال با SSH Key
حالا:
SSH از Private Key موجود در سیستم Client استفاده میکند و Public Key موجود روی Server برای احراز هویت استفاده میشود.
ساختار:
در واقع Private Key به سرور ارسال نمیشود؛ کلاینت با آن در فرآیند احراز هویت اثبات میکند که کلید خصوصی مربوط به Public Key را در اختیار دارد.
—————————-
🔟 تغییر پورت SSH
فایل تنظیمات SSH Server:
باز کردن:
پیدا کردن:
و مثلاً تغییر به:
بعد بررسی تنظیمات:
اگر خطایی نداد، سرویس را Reload/Restart میکنیم:
در بعضی توزیعها نام سرویس:
است.
⚠️ نکته مهم
قبل از تغییر پورت روی سرور Remote، مطمئن شو Firewall هم پورت جدید را اجازه میدهد و Session فعلی SSH را تا زمان تست اتصال جدید نبند؛ وگرنه ممکن است دسترسی خودت را قطع کنی.
—————————-
1️⃣1️⃣ غیرفعال کردن Password Authentication 🔐
این همان چیزی است که پرسیدی.
وقتی مطمئن شدی SSH Key Login درست کار میکند، میتوانی Password Authentication را غیرفعال کنی.
فایل:
این گزینه را تنظیم کن:
سپس:
اگر Syntax صحیح بود:
یا در برخی سیستمها:
از این به بعد احراز هویت با Password برای SSH غیرفعال میشود و روشهای دیگری که در تنظیمات مجاز ماندهاند میتوانند استفاده شوند.
————————————
⭐️ گزینه مهم دیگر:
در بعضی سیستمها، فقط گذاشتن:
برای سیاست موردنظر کافی نیست؛ چون ممکن است احراز هویت تعاملی Keyboard/Challenge هنوز فعال باشد.
اگر هدفت این است که احراز هویت تعاملی رمز عبور هم غیرفعال شود، بسته به نسخه OpenSSH میتوانی:
را نیز تنظیم کنی.
در سیستمهای قدیمیتر ممکن است گزینهای مثل:
دیده شود.
پس برای Hardening باید روشهای Authentication فعال روی همان سیستم را بشناسی، نه اینکه فقط یک خط را کورکورانه تغییر بدهی.
————————-
1️⃣2️⃣ جلوگیری از Login مستقیم Root
یکی دیگر از تنظیمات مهم SSH:
در:
این باعث میشود Login مستقیم
مثلاً:
مدل امنتر:
بهجای:
—————————————-
🛡 SSH Hardening بهصورت خلاصه
برای یک سرور، معمولاً این موارد را بررسی میکنیم:
نکته: تغییر پورت 22 به یک پورت دیگر بهتنهایی یک کنترل امنیتی قوی نیست؛ بیشتر باعث کاهش اسکنهای خودکار و Noise میشود. کنترلهای اصلیتر، احراز هویت کلیدی، محدودسازی دسترسی و Hardening تنظیمات SSH هستند.
استفاده از 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
❌ 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 هستند.