פוסט
פקודות Linux: דף העזר שלי
פקודות ה-Linux ששווה להכיר בעל פה, מקובצות לפי משימה: קבצים, חיפוש, טקסט, הרשאות, תהליכים, שירותים ולוגים, דיסק, רשת, ארכיונים, חבילות, SSH וקיצורי shell.
הפקודות שאני שולף על שרת Linux, בתוך container או במשימת CI. הדוגמאות מניחות GNU/Linux עם shell בסגנון Bash; ב-Mac הגרסאות של BSD שונות בפרטים, ואיפה שזה משנה אני מציין את זה. Linux רגישה לאותיות גדולות וקטנות: File.txt ו-file.txt הם שני קבצים שונים. סימן ⚠️ אומר שהפקודה יכולה להרוס נתונים: מריצים קודם את הגרסה הלא מזיקה (ls לפני rm, find בלי -delete) ומסתכלים. Linux חד-פעמי לתרגול נמצא במרחק פקודה אחת: docker run --rm -it ubuntu bash (ראו Docker מאפס לגיבור).
לקבל עזרה
man <פקודה>פותחת את דף המדריך./מילהמחפשת בתוכו,nמעבירה להתאמה הבאה, ו-qיוצאת.<פקודה> --helpמדפיסה סיכום שימוש קצר.man -k <מילה>(אוapropos <מילה>) מחפשת בדפי המדריך לפי מילת מפתח כשלא יודעים את שם הפקודה.type <פקודה>מראה אם משהו הוא תוכנה, פקודה מובנית ב-shell או alias, ו-which <פקודה>מראה את הנתיב של התוכנה שתרוץ.- ה-GNU Coreutils manual מפרט לעומק את כלי הקבצים והטקסט הבסיסיים.
איפה אני, ואיך זזים
pwdמדפיסה את התיקייה הנוכחית, ו-cd <תיקייה>משנה אותה.cdלבדה חוזרת הביתה,cd -קופצת לתיקייה הקודמת, ו-cd ..עולה רמה אחת.lsמציגה קבצים.ls -lהיא התצוגה הארוכה,ls -aכוללת קבצים מוסתרים (שמות שמתחילים בנקודה),ls -hמציגה גדלים קריאים, והם משתלבים:ls -lah. מוסיפים-tלמיון לפי זמן שינוי ו--Sלפי גודל.~היא תיקיית הבית שלנו,.היא התיקייה הנוכחית ו-..היא תיקיית האב שלה.- לוחצים Tab להשלמת שמות ו-Tab Tab להצגת האפשרויות.
עבודה עם קבצים ותיקיות
touch <קובץ>יוצרת קובץ ריק, או מעדכנת את זמן השינוי של קובץ קיים.mkdir <תיקייה>יוצרת תיקייה, ו-mkdir -p a/b/cיוצרת את כל הנתיב (בלי שגיאה אם הוא כבר קיים).cp <מקור> <יעד>מעתיקה קובץ,cp -r <תיקייה> <יעד>מעתיקה תיקייה, ו-cp -aמעתיקה ושומרת הרשאות וזמנים.mv <מקור> <יעד>מעבירה או משנה שם. כמוcp, היא דורסת יעד קיים בשקט: מוסיפים-iכדי שישאלו קודם, או-nכדי שלא תדרוס לעולם.rm <קובץ>מוחקת קובץ.rm -r <תיקייה>מוחקת תיקייה ואת כל מה שבתוכה, ו-rm -rf <תיקייה>עושה זאת בלי לשאול ⚠️. אין סל מחזור. קוראים את הנתיב פעמיים ונזהרים ממשתנים (rm -rf "$DIR/"כש-$DIRריק הוא האסון הקלאסי).ln -s <יעד> <קישור>יוצרת קישור סימבולי (מצביע לנתיב). בלי-sהיא יוצרת קישור קשיח.file <שם>אומרת איזה סוג קובץ זה, ו-stat <קובץ>מציגה גודל, הרשאות, בעלים וחותמות זמן.- שמות עם רווחים עוטפים במירכאות:
cp "My File.txt" backup/.
מסתכלים בקבצים
cat <קובץ>מדפיסה קובץ, ו-cat a b > cמחברת קבצים.less <קובץ>היא הצופה לקבצים ארוכים: חצים אוSpaceלגלילה,/מילהלחיפוש,qליציאה.less +F <קובץ>עוקבת אחרי קובץ כמוtail -f(Ctrl-Cמפסיק לעקוב).head <קובץ>מציגה את 10 השורות הראשונות ו-tail <קובץ>את 10 האחרונות.-n 50משנה את המספר.tail -f <קובץ>משאירה את הקובץ פתוח ומדפיסה שורות חדשות כשהן מגיעות, וככה צופים בלוג.tail -Fשורדת גם סיבוב לוגים (log rotation).wc -l <קובץ>סופרת שורות (-wמילים,-cבתים).diff a bמראה את ההבדלים בין שני קבצים, ו-diff -u a bמדפיסה אותם בפורמט ה-unified המוכר.
חיפוש
grep "טקסט" <קובץ>מדפיסה את השורות שמתאימות. הדגלים שישמשו אתכם:-iמתעלם מאותיות גדולות וקטנות,-nמציג מספרי שורות,-vהופך (שורות שלא מתאימות),-cסופר התאמות,-wמילים שלמות,-Eביטויים רגולריים מורחבים, ו--A 2/-B 2/-C 2לשורות אחרי, לפני וסביב כל התאמה.grep -rn "טקסט" .מחפשת בכל קובץ מתחת לתיקייה הנוכחית. מוסיפים--include='*.py'כדי להגביל לפי שם, ו--lכדי לרשום רק את הקבצים שמתאימים.find <איפה> <תנאים>מוצאת קבצים לפי התכונות שלהם:
find . -name "*.log" # by name (quote the pattern, or the shell expands it)
find . -iname "readme*" # same, ignoring case
find . -type d -name node_modules # only directories (f = files)
find . -type f -size +100M # bigger than 100 MiB
find . -mtime -1 # modified in the last 24 hours
find . -mtime +30 # modified more than 30 days ago
find . -mmin -10 # modified in the last 10 minutes
find . -name "*.tmp" -delete # delete matches ⚠️ (put -delete last, and run without it first)
find . -name "*.sh" -exec chmod +x {} + # run a command on the matches
find / -name "nginx.conf" 2>/dev/null # search everywhere, hide "permission denied" noise
find ... -print0 | xargs -0 <פקודה>היא הדרך הבטוחה להעביר שמות קבצים לפקודה אחרת, כי היא מתמודדת עם רווחים ושורות חדשות בשמות.locate <שם>מחפשת באינדקס מוכן והיא הרבה יותר מהירה מ-find, אבל דורשתplocateאוmlocateואינדקס מעודכן (sudo updatedb).
צינורות, הפניות ושרשור
a | bשולחת את הפלט שלaלתוךb.cmd > fileכותבת את הפלט לקובץ ומחליפה אותו ⚠️.cmd >> fileמוסיפה לסופו.cmd < fileקוראת קלט מקובץ.- לכל תוכנה יש שני ערוצי פלט: פלט סטנדרטי (1) ושגיאה סטנדרטית (2).
cmd 2> errors.txtמפנה רק את השגיאות,cmd > out.txt 2>&1שולחת את שניהם לאותו קובץ, ו-cmd > /dev/null 2>&1זורקת הכול (/dev/nullהוא הפח). cmd | tee fileמציגה את הפלט וגם שומרת אותו.tee -aמוסיפה לסוף.$(cmd)מכניסה את הפלט של פקודה לתוך פקודה אחרת:echo "Today is $(date +%F)".a && bמריצה אתbרק אםaהצליחה,a || bמריצה אתbרק אםaנכשלה, ו-a; bמריצה את שתיהן בכל מקרה.$?מחזיק את קוד היציאה של הפקודה האחרונה:0פירושו הצלחה.
עיבוד טקסט
cut -d: -f1,3 /etc/passwd # fields 1 and 3, split on ":"
awk -F: '{print $1}' /etc/passwd # the first field, with awk
sort file.txt | uniq -c | sort -rn | head # the most frequent lines, ranked
tr 'a-z' 'A-Z' < file.txt # translate characters (here: upper-case)
sed 's/old/new/g' file.txt # replace in the output (file unchanged)
sed -n '10,20p' file.txt # print only lines 10 to 20
sortממיינת שורות.-nממיין מספרית,-rהופך,-uמסיר כפילויות, ו--k2ממיין לפי העמודה השנייה.uniqמקפלת שורות זהות סמוכות, ולכן ממיינים קודם.uniq -cמוסיפה לכל שורה את מספר ההופעות שלה.sed -i 's/old/new/g' fileעורכת את הקובץ במקום ⚠️. ב-macOS צריך ארגומנט סיומת:sed -i '' .... מריצים קודם בלי-i.awkהיא שפה זעירה לעמודות:awk '{sum += $3} END {print sum}' fileמחברת את העמודה השלישית.xargsהופכת שורות קלט לארגומנטים:cat urls.txt | xargs -n 1 curl -sI.jq(בדרך כלל מותקנת בנפרד) היאgrepו-sedל-JSON:curl -s <url> | jq '.items[0].name'.
הרשאות ובעלות
ls -l מראה מי יכול לעשות מה. המחרוזת -rwxr-xr-- היא סוג קובץ ואחריו שלוש שלשות: לבעלים, לקבוצה ולכל השאר. כל שלשה היא קריאה (r, 4), כתיבה (w, 2) והרצה (x, 1), וחיבור המספרים נותן את הצורה האוקטלית ש-chmod משתמשת בה.
chmod 755 <קובץ>קובעת הרשאות במספרים. ערכים נפוצים:644לקבצים (הבעלים כותב, כולם קוראים),755לסקריפטים ולתיקיות,600לסודות כמו מפתחות SSH.chmod +x <קובץ>הופכת קובץ להרצה,chmod u+w <קובץ>מוסיפה כתיבה לבעלים, ו-chmod go-rwx <קובץ>מסירה הכול מהקבוצה ומהאחרים.chmod -R u+rwX,go-w <תיקייה>משנה עץ שלם. ה-Xהגדולה מוסיפה הרצה רק לתיקיות ולקבצים שכבר יש להם אותה.- בתיקייה,
xפירושו “מותר להיכנס אליה ולהגיע לקבצים שבתוכה”. chown <משתמש>:<קבוצה> <קובץ>משנה בעלים וקבוצה (דורשתsudoאלא אם הקובץ כבר שלנו).-Rמחילה את זה רקורסיבית ⚠️, אז קודם בודקים את הנתיב.sudo <פקודה>מריצה פקודה אחת כ-root.sudo -iפותחת shell של root, ו-sudo -u <משתמש> <פקודה>מריצה כמישהו אחר. עדיףsudoעל פקודה בודדת מאשר להישאר ב-shell של root.whoamiמדפיסה את שם המשתמש,idאת מזהי המשתמש והקבוצות, ו-groupsאת הקבוצות.chmod -R 777כמעט אף פעם אינה התשובה ⚠️: היא מאפשרת לכל אחד לכתוב לכל דבר. נותנים בדיוק את הגישה שמשתמש צריך.
תהליכים
ps auxרושמת כל תהליך עם הבעלים שלו ושימוש ב-CPU ובזיכרון, ו-ps -efמוסיפה מזהי תהליכי אב. ps aux --sort=-%mem | headמציגה את צורכי הזיכרון הגדולים ב-GNU/Linux.pgrep -af <שם>מוצאת תהליכים לפי שם ומדפיסה את שורות הפקודה שלהם.topהיא התצוגה החיה של מה שעסוק:qיוצא,Mממיין לפי זיכרון ו-Pלפי CPU.htopהיא גרסה נעימה יותר שבדרך כלל מתקינים בעצמנו.kill <pid>מבקשת מתהליך להיעצר בנימוס (SIGTERM).kill -9 <pid>כופה זאת עם SIGKILL, בלי הזדמנות לנקות אחריו, ולכן רק כשהדרך הנימוסית נכשלה ⚠️.pkill <שם>ו-killall <שם>עושות אותו דבר לפי שם, אז בודקים שהתבנית לא תופסת יותר ממה שהתכוונו.jobs,fgו-bgמנהלות משימות ב-shell:Ctrl-Zמשעה את הפקודה שרצה,bgממשיכה אותה ברקע, ו-fgמחזירה אותה לחזית. מסיימים פקודה ב-&כדי להפעיל אותה ברקע.nohup <פקודה> &משאירה פקודה רצה גם אחרי שמתנתקים. לכל דבר ארוך טווח עדיף שירות (בהמשך) אוtmux/screen.lsof -i :8080מראה מה משתמש בפורט, ו-lsof <קובץ>מראה מי פתח קובץ.
שירותים ולוגים (systemd)
ברוב ההפצות המודרניות של Linux מנהלים שירותים עם systemd (תיעוד). (לא ב-Mac, ובדרך כלל לא בתוך container.)
systemctl status <שירות>מראה אם שירות רץ ואת שורות הלוג האחרונות שלו.sudo systemctl start|stop|restart|reload <שירות>שולטת בו מיד; reloadקוראת מחדש את ההגדרות בלי הפעלה מחדש מלאה, אם נתמך.sudo systemctl enable <שירות>מפעילה אותו באתחול,disableמבטלת זאת, ו-enable --nowמפעילה גם מיד.systemctl list-units --type=serviceרושמת את השירותים, ו-systemctl --failedרושמת את אלה שנכשלו.sudo systemctl daemon-reloadגורמת ל-systemd לקרוא מחדש קובצי unit אחרי שערכנו אותם.
journalctl קוראת את הלוגים ש-systemd אוספת:
journalctl -u nginx # logs of one service
journalctl -u nginx -f # follow them live
journalctl -u nginx -n 100 # the last 100 lines
journalctl -b # everything since this boot (-b -1 = the previous boot)
journalctl --since "1 hour ago" # a time window (also --until)
journalctl -p err # only errors and worse
journalctl -k # kernel messages, like dmesg
journalctl --disk-usage # how much space the journal takes
קובצי לוג רגילים עדיין חיים ב-/var/log בהרבה תוכנות: tail -f /var/log/syslog (ב-Debian וב-Ubuntu) או /var/log/messages (במשפחת Red Hat).
דיסק וזיכרון
df -hמראה מקום פנוי לכל מערכת קבצים. דיסק מלא הוא הסיבה למספר מפתיע של תקריות “פתאום זה הפסיק לעבוד”.du -sh <תיקייה>מראה את הגודל הכולל של תיקייה, ו-du -h -d 1 . | sort -hמראה כל תיקייה ברמה אחת מתחת, מהקטנה לגדולה, כך שהאשם בתחתית. (sort -hהיא אפשרות של GNU.)ncduהוא דפדפן אינטראקטיבי לשימוש בדיסק שמתקינים בנפרד: הדרך המהירה ביותר למצוא מה מילא את הדיסק.free -hמציגה זיכרון ו-swap. קוראים את העמודה “available”, לא “free”: Linux משתמשת בזיכרון פנוי כ-cache.uptimeמראה כמה זמן המכונה פועלת ואת עומסי הממוצע, ו-lsblkרושמת דיסקים וחלוקות.mount | grep <נתיב>ו-findmntמראות מה מחובר לאן.ddכותבת בתים גולמיים להתקן ⚠️: אם מכוונים אותה להתקן הלא נכון, היא דורסת דיסק שלם.
רשת
ip addr(בקיצור:ip a) מציגה את הכתובות של המכונה, ו-ip routeמציגה את טבלת הניתוב. הן החליפו אתifconfigו-routeהישנות.ss -tulpnרושמת sockets שמאזינים:-tל-TCP,-uל-UDP,-lרק מאזינים,-pהתהליך שמחזיק,-nמספרים במקום שמות (עםsudoרואים תהליכים של משתמשים אחרים). ss -sמדפיסה סיכום, ו-ss -tn 'sport = :80'מצמצמת לפורט אחד. (netstatהיא הכלי הישן.)ping -c 4 <host>בודקת שמארח עונה (-cמגביל את המספר, אחרת היא רצה לנצח).curl <url>מושכת כתובת. הדגלים שכדאי להכיר:-Iרק כותרות,-sשקט,-Lעוקב אחרי הפניות,-o <file>שומר לקובץ,-fנכשל על שגיאות HTTP, ו--X POST -d '{"a":1}' -H 'Content-Type: application/json'לשליחת נתונים.curl -fsSL <url> -o fileהיא ההורדה האמינה. גםwget <url>מורידה.dig <domain> +short(אוnslookup) מחפשת רשומות DNS, ו-dig <domain> MXמבקשת סוג מסוים.nc -zv <host> <port>בודקת אם פורט TCP נגיש.traceroute <host>מראה את הקפיצות בדרך (ייתכן שצריך להתקין).curl -fsSL <url> | shמריצה סקריפט ישר מהאינטרנט ⚠️. מורידים אותו, קוראים אותו, ורק אז מריצים.
SSH והעתקת קבצים
ssh user@host # log in
ssh -i ~/.ssh/key.pem user@host # with a specific key
ssh -p 2222 user@host # a different port
ssh user@host 'df -h' # run one command and come back
ssh-keygen -t ed25519 -C "me@laptop" # create a key pair
ssh-copy-id user@host # install your public key on the server
scp file.txt user@host:/tmp/ # copy a file to the server
scp user@host:/var/log/app.log . # copy a file from the server
rsync -avzP ./site/ user@host:/var/www/site/ # sync a folder, resumable, with progress
rsync -avzn --delete ./site/ user@host:/var/www/site/ # dry run (-n) of a mirror
- מפתחות פרטיים חייבים להיות פרטיים:
chmod 600 ~/.ssh/key.pem, אחרת SSH מסרבת להשתמש בהם. ~/.ssh/configמאפשר לתת לשרת שם קצר, כך ש-ssh myserverמחליף את השורה הארוכה.rsyncהיא כלי ההעתקה הטוב יותר: היא מעבירה רק את מה שהשתנה. לוכסן הסיום חשוב:site/מעתיקה את התוכן של התיקייה, ו-siteאת התיקייה עצמה. --deleteמסירה מהיעד קבצים שאינם במקור ⚠️, ולכן קודם dry run (-n).
ארכיונים ודחיסה
tar czf backup.tar.gz <תיקייה>יוצרת ארכיון דחוס ב-gzip:cיצירה,zgzip,fשם הקובץ שבא אחריו. משתמשים ב-Jבמקוםzל-xz, וב-jל-bzip2.tar xzf backup.tar.gzמחלצת אותו,tar tzf backup.tar.gzרושמת את התוכן, ו--C <תיקייה>מחלצת למקום אחר:tar xzf backup.tar.gz -C /tmp/restore. מוסיפים-vכדי לראות כל קובץ. tar xfמודרנית בדרך כלל מזהה את הדחיסה בעצמה.tar czf backup.tar.gz --exclude=node_modules <תיקייה>משאירה דברים בחוץ.gzip <קובץ>דוחסת קובץ בודד (ומחליפה אותו ב-<קובץ>.gz), ו-gunzip <קובץ>.gzהופכת זאת.zip -r archive.zip <תיקייה>ו-unzip archive.zipמטפלות בפורמט הידידותי ל-Windows, וייתכן שצריך להתקין אותן.
התקנת תוכנה
הפקודה תלויה בהפצה:
sudo apt update && sudo apt install -y curl # Debian, Ubuntu
sudo dnf install curl # Fedora, RHEL and relatives
sudo apk add curl # Alpine (common in containers)
sudo pacman -S curl # Arch
- ב-Debian וב-Ubuntu,
apt updateמרעננת את רשימת החבילות ו-apt upgradeמתקינה עדכונים זמינים.apt search <מילה>מוצאת חבילות,apt remove <pkg>מסירה, ו-dpkg -l | grep <מילה>מראה מה מותקן. cat /etc/os-releaseאומרת באיזו הפצה וגרסה אנחנו, כדי לבחור את השורה הנכונה למעלה.
על המערכת ועל הסשן
uname -aמציגה את הליבה והארכיטקטורה,hostnamectlמציגה את שם המארח ואת מערכת ההפעלה, ו-dateמציגה את השעה.date +%Fמדפיסה אותה כ-2026-10-10, נוח לשמות קבצים.env(אוprintenv) רושמת משתני סביבה,echo "$PATH"מראה איפה ה-shell מחפש תוכנות, ו-export NAME=valueקובעת משתנה לתוכנות שמפעילים מה-shell הזה.historyרושמת פקודות עבר.Ctrl-Rמחפשת בהן תוך כדי הקלדה, וזה מהיר יותר מהחיצים.alias ll='ls -lah'יוצרת קיצור לסשן הזה. כדי לשמור אותו, מוסיפים את השורה ל-~/.bashrc.crontab -eעורכת את המשימות המתוזמנות שלנו ו-crontab -lרושמת אותן. בשורה יש חמישה שדות זמן ואז הפקודה:30 2 * * * /home/me/backup.shרצה ב-02:30 בכל יום (דקה, שעה, יום בחודש, חודש, יום בשבוע).sudo shutdown -h nowו-sudo rebootעושות מה שהן אומרות ⚠️. במכונה מרוחקת, מוודאים שזה באמת מה שרוצים.
קיצורי shell ששווה ללמוד
Ctrl-Cעוצר את הפקודה שרצה,Ctrl-Dמסיים קלט (ומנתק מפרומפט ריק),Ctrl-Lמנקה את המסך,Ctrl-Zמשעה את הפקודה.Ctrl-Aו-Ctrl-Eקופצים להתחלה ולסוף השורה,Ctrl-Wמוחק את המילה הקודמת ו-Ctrl-Uמוחק עד ההתחלה.!!חוזרת על הפקודה הקודמת, ולכןsudo !!פירושו “שכחתי sudo”.!$הוא הארגומנט האחרון של הפקודה הקודמת.