• בלוג
  • על ההבדל בין -c ו -s ב su ו runuser

על ההבדל בין -c ו -s ב su ו runuser

26/04/2021

הפקודות su ו runuser נועדו כדי שנוכל להחליף משתמש או להריץ פקודות בתור משתמש אחר. ב su אנחנו משתמשים כדי לעבור ממשתמש רגיל למשתמש רגיל אחר, וב runuser נשתמש כדי לעבור ממנהל מערכת למשתמש רגיל. בשתי הפקודות האפשרויות -c ו -s משמשות לבחירת התוכנית שצריך להפעיל. בואו נראה את ההבדלים ביניהן.

1. חיבור בתור משתמש אחר

פקודת su או runuser תפעיל את shell ברירת המחדל של המשתמש אליו אנחנו עוברים אם לא נציין במפורש פקודה אחרת. לכן אם אני משתמש מנהל מערכת ורוצה לעבור למשתמש postgres כדי לנהל בסיס נתונים אוכל להפעיל:

runuser - postgres

וכן רבים מאיתנו ישתמשו ב su כי זה יותר קצר:

su - postgres

ההבדל בין השתיים הוא ש runuser לא כוללת מנגנון אימות למשתמש ולכן רק מנהל מערכת יכול להפעיל אותה, ונועדה להפעלה על מערכות SELinux במקומות שיש הגבלות על הפעלת su.

2. הפעלת תוכנית בתוך ה Shell הדיפולטי של משתמש אחר

אבל לא באנו לדבר על runuser אלא בשביל לדבר על שתי האפשרויות הנוספות של su (ולכן גם של runuser), לבחירת תוכנית להרצה או לבחירת Shell.

נתחיל בתוכנית להרצה: הרבה פעמים בסקריפטים אנחנו לא צריכים Shell אינטרקטיבי ומספיק לנו להריץ תוכנית ספציפית בתור משתמש אחר. במצב כזה נוכל להשתמש ב -c כדי להעביר את הנתיב לתוכנית ואת הפרמטרים שאנחנו רוצים להעביר. התוכנית תופעל מתוך ה Shell הדיפולטי של המשתמש ולכן אפשר להעביר גם משתנים והם יפוענחו בתוך הקונטקסט של המשתמש. הנה כמה דוגמאות:

root@60275c574ad5:/# runuser -c 'echo $USER' - postgres
postgres
root@60275c574ad5:/# runuser -c 'echo $HOME' - postgres
/var/lib/postgresql
root@60275c574ad5:/# runuser -c "python3 --version" - postgres
Python 3.8.5

בכל המקרים הרצת su -c לא טוענת את התוכן של ~/.bashrc או ~/.profile בגלל שמדובר ב Shell לא אינטרקטיבי.

3. הפעלת Shell חלופי

במקרים אחרים נרצה להתחבר בתור משתמש שלא מוגדרת עבורו Default Shell. שימו לב לשורה הבאה מתוך הקובץ /etc/passwd:

irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin

המשתמש irc הוא משתמש פיקטיבי שנועד רק לצורך הפעלת ה IRC Daemon על המכונה. בגלל זה ה Shell שלו מוגדרת להיות nologin. ניסיון להתחבר בתור משתמש זה באמצעות runuser לא יצליח:

root@60275c574ad5:/# runuser - irc
runuser: warning: cannot change directory to /var/run/ircd: No such file or directory
This account is currently not available.

במצב כזה אנחנו צריכים לשנות את ה Shell באופן זמני רק עבור הפעלת ה runuser הספציפית, ואת זה עושים עם -s:

root@60275c574ad5:/# runuser -s /bin/bash - irc
runuser: warning: cannot change directory to /var/run/ircd: No such file or directory
irc@60275c574ad5:/$ 

למרות שאין תיקיית בית לעבור עליה, ולמרות שאין Default Shell, עדיין הצלחתי לקבל Shell אינטרקטיבי עם המשתמש irc.