Internet-এর বেশিরভাগ server Linux চালায়, আর এর command line ক্রমাগত security guide, hosting tutorial, আর troubleshooting article-এ দেখা যায় — এই সাইটের অন্য জায়গাতেও (Hosting & Deployment কোর্স SSH দিয়ে একটা server-এ connect করে আর ঠিক এই command-গুলোই ব্যবহার করে)। এই lesson একটা লম্বা, practical সফর, ইচ্ছাকৃতভাবে একটা সাধারণ "basics" chapter-এর চেয়ে অনেক বেশি — এর যত বেশি অংশ পরিচিত মনে হবে, একটা আসল server তত কম ভয়ের মনে হবে।
# বর্তমান folder দেখান
pwd
# এখানকার file আর folder list করুন
ls -la
# একটা folder-এ যান
cd Downloads
# এক level উপরে ফিরে যান
cd ..
# সরাসরি home folder-এ যান
cd ~বিশেষভাবে ls -la — -a flag hidden file দেখায় (dot দিয়ে শুরু হওয়া নাম, যেমন .ssh বা .bashrc), যা সাধারণ ls চুপচাপ বাদ দেয়। বিস্ময়কর পরিমাণ security-relevant configuration hidden file-এ থাকে।
Windows-এর আলাদা drive letter-এর মতো না, Linux-এর / (root) থেকে শুরু হওয়া একটা একক folder tree আছে — বাকি সব disk সহ সবকিছু এর ভেতরে কোথাও mount হয়।
| Folder | যেখানে কী থাকে |
|---|---|
| /home | প্রতিটি user-এর personal file (যেমন /home/sam) |
| /etc | System-wide configuration file |
| /var | প্রায়ই বদলায় এমন data — log, cache, mail |
| /usr | Install করা program আর তাদের সহায়ক file |
| /bin, /usr/bin | সাধারণ command-line program |
| /tmp | Temporary file, সাধারণত reboot-এ clear হয় |
| /root | root (administrator) user-এর home folder |
| /dev | Hardware represent করা device file |
# একটা খালি file তৈরি করুন
touch notes.txt
# একটা folder তৈরি করুন
mkdir project
# একটা file copy করুন
cp notes.txt backup-notes.txt
# পুরো একটা folder copy করুন
cp -r project project-backup
# Move বা rename (একই command দুটোই করে)
mv notes.txt archive/notes.txt
mv old-name.txt new-name.txt
# একটা file delete করুন
rm notes.txt
# একটা folder আর এর ভেতরের সবকিছু delete করুন
rm -rf project-backupসবচেয়ে বিপজ্জনক common command
rm -rf স্থায়ীভাবে delete করে — কোনো Recycle Bin না, কোনো undo না। চালানোর আগে path দুবার check করুন, বিশেষত একটা wildcard (rm -rf *) সহ বা root হিসেবে।
# একটা পুরো file screen-এ print করুন
cat notes.txt
# একটা লম্বা file scroll করে দেখুন (বের হতে q)
less server.log
# প্রথম 10 লাইন
head server.log
# শেষ 10 লাইন — একটা log বাড়তে দেখার জন্য দারুণ
tail server.log
# নতুন লাইন যোগ হওয়ার সাথে সাথে একটা file দেখতে থাকুন
tail -f server.logTerminal থেকে আসলে একটা file edit করার জন্য, nano সবচেয়ে বন্ধুত্বপূর্ণ শুরুর পয়েন্ট — arrow key প্রত্যাশিতভাবে কাজ করে, আর shortcut screen-এ list করা থাকে।
nano config.txt
# Save করতে Ctrl+O, বের হতে Ctrl+Xvim অন্য common option, শেখার পর অনেক বেশি শক্তিশালী কিন্তু প্রথমে সত্যিকারভাবে অস্বাভাবিক — এটা "normal mode"-এ খোলে, যেখানে i চাপা না পর্যন্ত টাইপ করলে টেক্সট insert হয় না। অন্তত exit sequence জানার যোগ্য, কারণ এটা একটা বিখ্যাত প্রথম বাধা।
vim config.txt
# টাইপ শুরু করতে i চাপুন (insert mode)
# insert mode থেকে বের হতে Esc চাপুন
# Save আর quit করতে :wq টাইপ করে Enter চাপুন
# Save না করে quit করতে :q! টাইপ করে Enter চাপুনপ্রতিটি command-এর তিনটি data stream আছে: stdin (input), stdout (সাধারণ output), আর stderr (error output) — এগুলো বোঝা command line-কে যা শক্তিশালী বানায় তার বেশিরভাগ unlock করে।
| চিহ্ন | এটা কী করে |
|---|---|
| > | stdout একটা file-এ পাঠায়, overwrite করে |
| >> | stdout একটা file-এ পাঠায়, append করে |
| 2> | stderr (শুধু) একটা file-এ পাঠায় |
| < | একটা file stdin হিসেবে দেয় |
| | | Pipe — এক command-এর stdout পরের command-এর stdin হিসেবে পাঠায় |
# একটা file-এ output save করুন
ls -la > filelist.txt
# Overwrite না করে append করুন
echo "new entry" >> notes.txt
# Error আলাদা file-এ পাঠান, সাধারণ output screen-এ রাখুন
some-command 2> errors.log
# Command একসাথে chain করুন — এই pipeline বাস্তবে সত্যিকারভাবে common
ps aux | grep nginx | wc -l
# ps aux: প্রতিটি process list করে
# grep nginx: শুধু nginx-এর কথা বলা লাইন রাখে
# wc -l: বাকি লাইন গোনেLinux-এর ছোট, single-purpose text tool একসাথে pipe করার জন্য বানানো — কোনো script না লিখেই log পড়া, data filter করা, আর দ্রুত one-off report-এর পেছনের toolkit এটাই।
| Command | এটা কী করে |
|---|---|
| grep "pattern" file | একটা pattern-এ মেলা লাইন print করে |
| grep -i | Case-insensitive মিল |
| grep -r "pattern" . | একটা folder-এর প্রতিটি file-এ recursively search করে |
| cut -d',' -f2 | Delimited টেক্সট থেকে একটা column বের করে (এখানে, ২য়, comma-separated) |
| sort | বর্ণানুক্রমিক বা সংখ্যাগতভাবে (-n) লাইন sort করে |
| uniq | পাশাপাশি ডুপ্লিকেট লাইন সরায় (সাধারণত আগে sort-এর সাথে জোড়া) |
| wc -l | লাইন গোনে (word-এর জন্য -w, character-এর জন্য -c-ও) |
| tr 'a-z' 'A-Z' | Character translate করে — এখানে, lowercase থেকে uppercase |
# একটা auth log-এ প্রতিটা failed login attempt খুঁজুন
grep "Failed password" /var/log/auth.log
# চেষ্টা করা IP-র একটা sorted, de-duplicated list পান
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn
# awk প্রতি লাইনে একটা field বের করে, sort+uniq -c প্রতিটা
# IP কতবার দেখা যায় গোনে, শেষ sort -rn সবচেয়ে খারাপগুলো আগে rank করেawk আর sed দুটোই নিজেরাই পূর্ণ text-processing language — প্রতিটা থেকে মনে রাখার মতো একটা মাত্র সবচেয়ে useful pattern: space-separated টেক্সটের N নম্বর column ধরতে awk '{print $N}', আর একটা stream-এ টেক্সট find-and-replace করতে sed 's/old/new/g'।
# "staging"-এর প্রতিটা occurrence "production" দিয়ে বদলান আর ফলাফল print করুন
sed 's/staging/production/g' config.txtLinux-এ প্রতিটা file-এর permission থাকে যা নিয়ন্ত্রণ করে কে read, write, বা execute করতে পারবে — এটা একটা formality না, এটা একটা আসল access-control mechanism। একটা world-writable config file বা একটা অতিরিক্ত permissive SSH key একটা আসল, সাধারণ vulnerability।
# একটা file-এর permission check করুন
ls -l script.sh
# -rwxr-xr-- 1 sam staff 220 Sep 3 10:00 script.shদশ character-এর সেই প্রথম block ভাগ হয়: file type, তারপর তিনটা permission triplet (owner, group, বাকি সবাই) — প্রতিটা triplet read (r), write (w), execute (x), বা "অনুমতি নেই"-এর জন্য একটা dash।
| চিহ্ন | সংখ্যাগত মান |
|---|---|
| r (read) | 4 |
| w (write) | 2 |
| x (execute) | 1 |
# Owner-কে read+write+execute, group-কে read+execute, বাকিদের কিছু না দিন
chmod 750 script.sh
# একই পরিবর্তন, symbolically লেখা
chmod u=rwx,g=rx,o= script.sh
# একটা file শুধু owner read আর write করতে পারবে এমন বানান (SSH key-এর জন্য common)
chmod 600 id_rsa
# একটা file কে owns করে তা বদলান
chown sam script.sh
# owner আর group একসাথে বদলান
chown sam:staff script.sh# একটা folder-কে একটা .tar file-এ bundle করুন
tar -cvf backup.tar project/
# একই, কিন্তু gzip-compressed (.tar.gz)
tar -czvf backup.tar.gz project/
# একটা .tar.gz unpack করুন
tar -xzvf backup.tar.gz
# Zip / unzip, ওই format দরকার হলে
zip -r backup.zip project/
unzip backup.zipc = create, x = extract, z = gzip, v = verbose (progress দেখায়), f = filename এরপর আসে।
# নাম দিয়ে search করুন, বর্তমান folder থেকে নিচে
find . -name "*.log"
# গত এক দিনে বদলানো একটা file-এর জন্য পুরো system search করুন
find / -name "config.php" -mtime -1
# আগে-থেকে-বানানো একটা index ব্যবহার করে দ্রুত search (সাধারণত দ্রুত, সামান্য পুরনো হতে পারে)
locate nginx.conf# প্রতিটা চলমান process list করুন
ps aux
# process আর resource use-এর live, auto-refreshing view
top
# process ID দিয়ে একটা process বন্ধ করুন (আগে ps aux থেকে ID খুঁজুন)
kill 4821
# সাধারণ kill ignore করা একটা process force-kill করুন
kill -9 4821বন্ধ করার আগে জানুন
একটা অপরিচিত process ID বন্ধ করলে এর উপর নির্ভরশীল অন্য কিছু ভেঙে যেতে পারে। বন্ধ করার আগে (ps aux বা নাম দিয়ে search করে) নিশ্চিত করুন process-টা কী।
# একটা লম্বা সময় চলা command background-এ শুরু করুন
long-task &
# বর্তমান background job list করুন
jobs
# একটা background job আবার foreground-এ আনুন
fg %1
# terminal বন্ধ হওয়ার পরও চলতে থাকা একটা command
nohup long-task &প্রতিটা file, process, আর permission শেষ পর্যন্ত একজন user-এর — আর প্রতিটা user এক বা একাধিক group-এর, যা আগের section-এর group-level permission আসলে কীভাবে apply হয় তা ঠিক করে।
# একটা নতুন user যোগ করুন
sudo useradd -m newuser # -m তাদের home folder-ও তৈরি করে
# ওই user-এর password সেট (বা বদল) করুন
sudo passwd newuser
# একটা বিদ্যমান user-কে একটা group-এ যোগ করুন
sudo usermod -aG developers newuser
# বর্তমান user কোন group-এ আছে দেখুন
groups
# একটা user delete করুন (আর চাইলে -r দিয়ে তাদের home folder-ও)
sudo userdel -r newusersudo সরাসরি root হিসেবে login করার বদলে administrator (root) privilege দিয়ে একটা মাত্র command চালায় — নিরাপদ, standard approach, কারণ এটা একটা command-এ সীমাবদ্ধ আর log হয়।
sudo apt update
# root হিসেবে একটা shell চালান (কম ব্যবহার করুন)
sudo -iLinux-এ software install করা মানে প্রায় কখনোই একটা installer download করা না — একটা package manager একটা বিশ্বস্ত repository থেকে software খোঁজা, install, update, আর সরানো handle করে।
| Distro পরিবার | Package manager | Install / update |
|---|---|---|
| Debian, Ubuntu | apt | sudo apt install |
| Fedora, RHEL, CentOS | dnf (বা পুরনো yum) | sudo dnf install |
| Arch | pacman | sudo pacman -S |
# উপলব্ধ package-এর local list আপডেট করুন
sudo apt update
# একটা package install করুন
sudo apt install htop
# একটা package সরান
sudo apt remove htop
# Installed package list করুন
apt list --installed
# প্রতিটা installed package upgrade করুন
sudo apt upgradeবেশিরভাগ modern Linux distribution background service (একটা web server, একটা database, একটা SSH server) systemd দিয়ে manage করে, systemctl command-এর মাধ্যমে।
# একটা service চলছে কিনা check করুন
sudo systemctl status nginx
# একটা service start / stop / restart করুন
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# boot-এ একটা service স্বয়ংক্রিয়ভাবে শুরু হতে বানান
sudo systemctl enable nginx
# একটা service-এর সাম্প্রতিক log পড়ুন
journalctl -u nginx --since todayএকটা environment variable সেই session-এ চালানো প্রতিটা program-এর জন্য উপলব্ধ একটা নামযুক্ত মান — PATH সবচেয়ে গুরুত্বপূর্ণটা, কারণ পুরো path ছাড়া একটা command টাইপ করলে shell যে folder-গুলো search করে তার list এটাই।
# প্রতিটা environment variable দেখান
env
# একটা নির্দিষ্ট variable দেখান
echo $HOME
echo $PATH
# শুধু বর্তমান session-এর জন্য একটা সেট করুন
export API_KEY=abc123
# স্থায়ীভাবে একটা সেট করুন — ~/.bashrc (বা ~/.zshrc)-এ যোগ করা, তারপর আবার load করা
echo 'export API_KEY=abc123' >> ~/.bashrc
source ~/.bashrc# এই machine-এর IP address দেখান
ip a
# একটা host reachable কিনা test করুন
ping -c 4 google.com
# একটা host-এ network hop trace করুন
traceroute google.com
# active network connection আর প্রতিটা ব্যবহার করা process list করুন
ss -tulnp
# পুরনো সমতুল্য, এখনো guide-এ common
netstat -tulnp
# command line থেকে একটা file download বা একটা API check করুন
curl -I https://example.com # -I: শুধু header
wget https://example.com/file.zip
# একটা domain-এর DNS record lookup করুন
dig example.com
nslookup example.comss -tulnp নিজেই মনে রাখার মতো — এটা প্রতিটা port list করে যেখানে একটা program listen করছে, যা কোনো machine-এ অপ্রত্যাশিতভাবে কিছু server চালাচ্ছে কিনা check করার জন্য ঠিক যা দরকার।
# প্রতি mounted filesystem-এ ব্যবহৃত disk space দেখান
df -h
# একটা নির্দিষ্ট folder কতটা space ব্যবহার করছে দেখান
du -sh /var/log
# যুক্ত block device (drive আর partition) list করুন
lsblk
# বর্তমানে কী কোথায় mount করা দেখান
mountযেকোনো command-এর ধারা একটা file-এ save করে একটা script হিসেবে চালানো যায় — এই lesson জুড়ে কভার করা একই command, শুধু automate করা।
#!/bin/bash
# উপরের লাইন "shebang" — system-কে বলে এই file কোন
# interpreter দিয়ে চালাতে হবে
name="World"
echo "Hello, $name!"chmod +x greet.sh # executable বানান
./greet.sh # চালান# একটা variable
count=5
# একটা conditional
if [ "$count" -gt 3 ]; then
echo "More than 3"
else
echo "3 or fewer"
fi
# একটা loop
for file in *.txt; do
echo "Found: $file"
done"এই machine-এ কী চলছে" তার জন্য একটা দ্রুত, standard check-এর সেট — শুধু আলাদাভাবে না, একটা ধারা হিসেবে জানার যোগ্য।
# এই system কতক্ষণ up আছে, আর কতটা loaded?
uptime
# কে login করে আছে (বা সম্প্রতি ছিল)?
who
last
# system log সম্প্রতি কী ঘটেছে বলে?
tail -50 /var/log/syslog # Debian/Ubuntu
journalctl -n 50 # systemd-ভিত্তিক system
# সবচেয়ে সাম্প্রতিক kernel/hardware message
dmesg | tail -50
# কতটা memory ফাঁকা?
free -h| প্রশ্ন | Command |
|---|---|
| System কি overloaded? | uptime (load average check করুন) |
| একটা নির্দিষ্ট service কি আসলে চলছে? | systemctl status |
| Disk কি ভরে গেছে? | df -h |
| কী সব memory ব্যবহার করছে? | top বা free -h |
| System-wide এইমাত্র কী ঘটল? | journalctl -n 50 বা tail -f /var/log/syslog |
| Command | কী করে |
|---|---|
| pwd | বর্তমান folder দেখায় |
| ls -la | hidden সহ file আর folder list করে |
| cd | folder বদলায় |
| cp / mv / rm | Copy / move-rename / delete |
| mkdir / rmdir | একটা খালি folder তৈরি / সরায় |
| cat / less / head / tail | একটা file দেখা — একসাথে, scrollable, প্রথম লাইন, শেষ লাইন |
| grep / awk / sed / cut / sort / uniq | টেক্সট search আর process করা |
| chmod / chown | Permission / ownership বদলানো |
| tar / zip | File archive আর compress করা |
| find / locate | File search করা |
| ps aux / top / kill | Process list, monitor, বন্ধ করা |
| useradd / usermod / passwd | User account manage করা |
| sudo apt install / update / upgrade | Package manage করা (Debian/Ubuntu) |
| systemctl start / stop / status | Background service manage করা |
| ip a / ping / curl / ss -tulnp | Network configuration, connectivity, request, খোলা port |
| df -h / du -sh / lsblk | Disk space, folder size, যুক্ত drive |
| uptime / free -h / journalctl | System load, memory, log |
এটা ইচ্ছাকৃতভাবে যা বাদ দেয়
ইচ্ছাকৃতভাবে এই lesson-এ বাদ: container (Docker), advanced storage (LVM), গভীর networking internals (পুরো TCP/IP stack, Netfilter/iptables rule-লেখা), আর boot process internals — সত্যিকারভাবে useful, কিন্তু এই কোর্স যে security-relevant CLI literacy-এর জন্য scoped তার চেয়ে DevOps/sysadmin-specialist territory।