คำสั่ง su: ความต่างของ su กับ su - และ sudo su กับ sudo -i วิธีสลับบัญชี
ถ้าต้องการสลับไปใช้บัญชีอื่นเพื่อรันคำสั่งบน Linux โดยไม่ต้องออกจากระบบบัญชีปัจจุบัน ให้ใช้คำสั่ง su จากการรัน su จากบัญชี root ของเซิร์ฟเวอร์ AlmaLinux 9 ไปยัง daemon ซึ่งเป็นบัญชีระบบที่ล็อกอินไม่ได้ พบว่าขีดกลางเพียงตัวเดียวทำให้โฟลเดอร์ทำงานและ PATH เปลี่ยนไป และต้องระบุเชลล์ก่อนคำสั่งจึงจะทำงาน
ผลลัพธ์ด้านล่างได้จากเซิร์ฟเวอร์ AlmaLinux 9.8 (บัญชี root) และเซิร์ฟเวอร์ Debian 12 (บัญชีทั่วไป) หน้าจอที่ถามรหัสผ่านและ sudo ไม่ได้รันบนเซิร์ฟเวอร์ที่ใช้งานจริง แต่สรุปตามคู่มือทางการ และบางส่วนของค่า PATH กับหมายเลขเวอร์ชันแพตช์ของ util-linux ในตัวจำลองได้เปลี่ยนเป็นค่าตัวอย่าง
1️⃣ วิธีใช้คำสั่ง su
รูปแบบพื้นฐานคือ [su ชื่อบัญชี] และถ้าไม่ใส่ชื่อบัญชี su จะสลับไปเป็น root เมื่อพิมพ์ exit ในเชลล์ใหม่ เชลล์นั้นจะจบและคุณจะกลับไปที่เชลล์ของบัญชีเดิมที่รัน su
เมื่อรันจากบัญชีทั่วไป คุณต้องใส่รหัสผ่านของบัญชีปลายทางที่บรรทัด Password: (อ้างอิงการตั้งค่าเริ่มต้นของ PAM) บนเซิร์ฟเวอร์นี้ /etc/pam.d/su ตั้งไว้ให้ข้ามการยืนยันตัวตนเมื่อผู้รันเป็น root จึงไม่มีการถามรหัสผ่านตอนสลับจากบัญชี root ไปเป็น daemon
su --help
Usage:
su [options] [-] [<user> [<argument>...]]
Change the effective user ID and group ID to that of <user>.
A mere - implies -l. If <user> is not given, root is assumed.
Options:
-m, -p, --preserve-environment do not reset environment variables
-w, --whitelist-environment <list> don't reset specified variables
-g, --group <group> specify the primary group
-G, --supp-group <group> specify a supplemental group
-, -l, --login make the shell a login shell
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh)
-s, --shell <shell> run <shell> if /etc/shells allows it
-P, --pty create a new pseudo-terminal
-h, --help display this help
-V, --version display version
For more details see su(1).ตามที่ข้อความช่วยเหลือระบุ ขีดกลาง [-] คือตัวเลือกล็อกอินเหมือนกับ [-l] และอาร์กิวเมนต์ที่เขียนต่อจากชื่อบัญชีจะส่งต่อให้เชลล์ของบัญชีปลายทาง su บนเซิร์ฟเวอร์ AlmaLinux 9 มาจากแพ็กเกจ util-linux 2.37 และบนเซิร์ฟเวอร์ Debian 12 มาจากแพ็กเกจ 2.38
su --versionsu from util-linux 2.38.1ดูได้ว่าบัญชีที่ต้องการสลับไปเปิดเชลล์ได้หรือไม่จากช่องสุดท้ายของบรรทัดบัญชีนั้นใน getent passwd
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinเชลล์ของ daemon คือ /sbin/nologin บัญชีที่ใส่ nologin แทนเชลล์ล็อกอินจะไม่เปิดเชลล์แม้จะสลับไปด้วย su แล้วก็ตาม
2️⃣ ความต่างของ su กับ su -
เมื่อใส่ขีดกลาง (-) su จะเปิดเชลล์แบบเดียวกับที่ได้เมื่อล็อกอินด้วยบัญชีปลายทาง ในโฟลเดอร์ /tmp ได้รันคำสั่งเดียวกันแบบไม่มีขีดกลางหนึ่งครั้ง และแบบมีขีดกลางอีกหนึ่งครั้ง
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinเมื่อไม่มีขีดกลาง โฟลเดอร์ทำงานยังคงเป็น /tmp ส่วน [su -] ย้ายไปที่โฟลเดอร์โฮมของ daemon คือ /sbin บนเซิร์ฟเวอร์นี้ /sbin เป็นลิงก์ไปยัง /usr/sbin คำสั่ง pwd จึงแสดง /usr/sbin
สำหรับตัวแปรสภาพแวดล้อม ได้เลือกเปรียบเทียบเพียงห้าบรรทัดจากผลลัพธ์ของ env คือ HOME, USER, SHELL, PATH และ LOGNAME
su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binsu - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinHOME, USER และ LOGNAME เปลี่ยนเป็นค่าของ daemon ทั้งสองกรณี ส่วน PATH เมื่อไม่มีขีดกลางยังคงเป็นค่าของ root ที่รัน su และเมื่อใช้ [su -] จะถูกกำหนดใหม่ตามการตั้งค่าล็อกอิน
ตามคู่มือทางการ su แบบไม่มีขีดกลางจะเปลี่ยนเฉพาะ HOME และ SHELL และจะเปลี่ยน USER กับ LOGNAME ด้วยก็ต่อเมื่อบัญชีปลายทางไม่ใช่ root ดังนั้นถ้าสลับจากบัญชีทั่วไปไปเป็น root โดยไม่มีขีดกลาง USER จะยังเป็นชื่อบัญชีเดิม
[$0] ที่แสดงชื่อเชลล์ก็ต่างกันด้วย
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shเมื่อใช้ [su -] จะมีขีดกลางนำหน้าชื่อเชลล์และแสดงเป็น -sh เชลล์ที่ชื่อขึ้นต้นด้วยขีดกลางจะทำงานเป็นเชลล์ล็อกอินและอ่านไฟล์ตั้งค่าล็อกอิน (ตามคู่มือทางการ) ความต่างของทั้งสองแบบเป็นดังนี้
| การเปรียบเทียบ | su | su - |
|---|---|---|
| โฟลเดอร์งาน | คงเดิม (/tmp) | โฟลเดอร์โฮมของบัญชีปลายทาง (/usr/sbin) |
| HOME, USER, LOGNAME | ค่าของ daemon | ค่าของ daemon |
| PATH | ค่าของ root ที่รัน su | กำหนดใหม่ตามการตั้งค่าล็อกอิน |
| ชื่อเชลล์ ($0) | sh | -sh (เชลล์ล็อกอิน) |
| ตัวแปรสภาพแวดล้อมอื่น | คงอยู่ตามเดิม | ลบออก เหลือไว้เพียงบางตัว เช่น TERM (ตามคู่มือทางการ) |
คู่มือทางการแนะนำให้ใส่ตัวเลือกล็อกอินเสมอเพื่อไม่ให้สภาพแวดล้อมปะปนกัน และให้เขียน [--login] แทนขีดกลาง su แบบไม่มีขีดกลางจะคงโฟลเดอร์ปัจจุบันและ PATH ไว้ ถ้าต้องการตรวจคำสั่งด้วยการตั้งค่าของบัญชีอื่น ผลอาจต่างจาก [su -]
3️⃣ ตัวเลือก su -c และ su -s
ถ้าต้องการรันคำสั่งเดียวด้วยบัญชีอื่นโดยไม่เปิดเชลล์ ให้เขียนคำสั่งต่อจาก -c เมื่อรัน id ด้วย [su -c] กับบัญชีที่เป็น nologin ผลที่ได้คือข้อความปฏิเสธแทนผลของคำสั่ง
su -c id daemonThis account is currently not available.คำสั่งที่ส่งด้วย -c ก็ถูกเชลล์ของบัญชีรับไปรันเช่นกัน ถ้าเชลล์เป็น nologin คำสั่งจึงไม่ได้ทำงานเลย กรณีนี้ให้ระบุเชลล์ที่จะรันด้วย -s
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)เมื่อระบุ /bin/sh คำสั่ง id ทำงานด้วย UID 2 ของ daemon ใช้รูปแบบนี้เมื่อต้องการตรวจสิทธิ์ไฟล์หรือผลของคำสั่งด้วยบัญชีบริการ
ถ้าเชลล์ของบัญชีปลายทางเป็นเชลล์แบบจำกัดที่ไม่มีอยู่ใน /etc/shells เช่น nologin จะมีเพียง root ที่เปลี่ยนเชลล์ด้วย -s ได้ ตามคู่มือทางการ -s และตัวแปร SHELL ที่ผู้ใช้ซึ่งไม่ใช่ root ระบุจะถูกละเว้นในกรณีนี้
ถ้าคำสั่งหลัง -c มีช่องว่าง ให้ครอบด้วยเครื่องหมายคำพูดเพื่อส่งเป็นก้อนเดียว su จะคืนรหัสออกของคำสั่งที่รันตามเดิม คืน 126 ถ้ารันคำสั่งไม่ได้ และคืน 127 ถ้าหาคำสั่งไม่พบ (ตามคู่มือทางการ)
📌 ตัวเลือกหลัก: ผลที่รันในบทความนี้
| ตัวเลือก | หน้าที่ | ผลที่เห็นในบทความนี้ | |
|---|---|---|---|
| - | เปิดเชลล์แบบเดียวกับการล็อกอินด้วยบัญชีปลายทางและย้ายไปที่โฟลเดอร์โฮมของบัญชีนั้น | ใน /tmp เมื่อไม่มีขีดกลาง pwd เป็น /tmp เมื่อมีขีดกลางเป็น /usr/sbin และ echo $0 ได้ -sh | |
| -c คำสั่ง | รันคำสั่งเดียวด้วยเชลล์ของบัญชีปลายทางโดยไม่เปิดเชลล์ | เมื่อรัน su -c id daemon กับบัญชี nologin ชื่อ daemon ได้ [This account is currently not available.] | |
| -s เชลล์ | รันด้วยเชลล์ที่ระบุแทนเชลล์ที่ตั้งไว้ในบัญชี บัญชีที่เป็นเชลล์แบบจำกัดใช้ได้เฉพาะ root | su -s /bin/sh -c id daemon ได้ uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | แสดงวิธีใช้และรายการตัวเลือก | บรรทัด Usage และรายการตัวเลือก -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | แสดงข้อมูลเวอร์ชัน | su from util-linux 2.38.1 บนเซิร์ฟเวอร์ Debian 12 |
📎 ตัวเลือกอื่น: ตามคู่มือทางการ
| ตัวเลือก | หน้าที่ | |
|---|---|---|
| -l | ตัวเลือกล็อกอินเหมือนขีดกลาง (-) ชื่อยาวคือ --login | |
| -m | คงตัวแปรสภาพแวดล้อมไว้และไม่เปลี่ยน HOME, SHELL, USER, LOGNAME ถ้าใช้ร่วมกับตัวเลือกล็อกอินจะถูกละเว้น (เหมือน -p) | |
| -w รายการ | คงตัวแปรที่เขียนคั่นด้วยจุลภาคไว้เมื่อตัวเลือกล็อกอินล้างสภาพแวดล้อม ส่วน HOME, SHELL, USER, LOGNAME, PATH จะถูกกำหนดใหม่ | |
| -g กลุ่ม | ระบุกลุ่มหลัก ใช้ได้เฉพาะ root | |
| -G กลุ่ม | ระบุกลุ่มเสริม ใช้ได้เฉพาะ root ถ้าไม่มี -g กลุ่มเสริมกลุ่มแรกจะเป็นกลุ่มหลัก | |
| -f | ส่ง -f ให้เชลล์ เป็นตัวเลือกที่ใช้ใน csh และ tcsh | |
| -P | สร้างเทอร์มินัลเสมือนใหม่เพื่อไม่ให้ใช้เทอร์มินัลร่วมกับเซสชันเดิม | |
| --session-command คำสั่ง | เหมือน -c แต่ไม่สร้างเซสชันใหม่ คู่มือไม่แนะนำ |
🔲 ตัวจำลองคำสั่ง su
ตัวจำลองด้านล่างเริ่มจากบัญชีทั่วไป user1 คุณลองพิมพ์ su, [su -] และ sudo แล้วกลับด้วย exit ได้ด้วยตัวเอง บัญชีและรหัสผ่านเป็นค่าตัวอย่าง
4️⃣ ความต่างของ sudo su กับ sudo -i
sudo su คือการใช้ sudo รัน su ด้วยสิทธิ์ root เนื่องจาก root เป็นผู้รัน su จึงไม่ถามรหัสผ่าน root แต่ก่อนหน้านั้น sudo จะถามรหัสผ่านของผู้ที่รัน (ตามเอกสารทางการ)
บัญชีที่รัน sudo ได้ถูกกำหนดไว้ใน การตั้งค่า /etc/sudoers หากบัญชีที่ไม่ได้รับอนุญาตรัน sudo จะถูกปฏิเสธด้วย [user1 is not in the sudoers file.] (อ้างอิงข้อความในโปรแกรม)
รหัสผ่านที่ถามและโฟลเดอร์ทำงานของแต่ละคำสั่งที่เปิดเชลล์ root เป็นดังนี้ คำสั่งในส่วนนี้ไม่ได้รันบนเซิร์ฟเวอร์ที่ใช้งานจริง แต่สรุปตามคู่มือ su(1) และ sudo(8)
| คำสั่ง | รหัสผ่านที่ถาม | เชลล์ที่รัน | โฟลเดอร์งาน |
|---|---|---|---|
| su | root | เชลล์ root | คงเดิม |
| su - | root | เชลล์ล็อกอิน root | /root |
| sudo su | บัญชีที่รัน | เชลล์ root | คงเดิม |
| sudo su - | บัญชีที่รัน | เชลล์ล็อกอิน root | /root |
| sudo -i | บัญชีที่รัน | เชลล์ล็อกอิน root | /root |
| sudo -s | บัญชีที่รัน | เชลล์ในตัวแปร SHELL (สิทธิ์ root) | คงเดิม |
[sudo -i] และ [sudo su -] จบที่เชลล์ล็อกอิน root เหมือนกัน [sudo -i] ให้ sudo รันเชลล์ของ root เป็นเชลล์ล็อกอินโดยตรง ส่วน [sudo su -] ผ่าน su อีกหนึ่งครั้งระหว่างทาง
[sudo -s] รันเชลล์ในตัวแปร SHELL ด้วยสิทธิ์ root และไม่ย้ายไปที่โฟลเดอร์โฮม เมื่อใส่รหัสผ่านถูกหนึ่งครั้ง sudo จะไม่ถามซ้ำในเทอร์มินัลเดิมเป็นเวลา 5 นาทีตามค่าเริ่มต้น (ตามคู่มือ sudoers)
ความต่างของ su กับ sudo เหมือนความต่างระหว่างการยืมกุญแจบ้านกับการเขียนชื่อที่ห้องนิติบุคคลเพื่อเข้าออก
5️⃣ ข้อผิดพลาดของคำสั่ง su
ถ้าสลับไปยังบัญชีที่ล็อกอินไม่ได้ nologin จะทำงานแทนเชลล์และขึ้น [This account is currently not available.] เมื่อรัน [su daemon] จาก root ก็ขึ้นเพียงบรรทัดนี้บรรทัดเดียว และรหัสออกเป็น 1
su daemonThis account is currently not available.ข้อความนี้มาจากโปรแกรม nologin ที่เขียนไว้ในช่องสุดท้ายของบรรทัดบัญชี และพบข้อความเดียวกันในไฟล์ /usr/sbin/nologin บนเซิร์ฟเวอร์ ถ้าเป็น root สามารถระบุเชลล์ด้วย -s แล้วรันคำสั่งด้วยบัญชีนั้นได้
ถ้ารหัสผ่านไม่ถูกต้องจะขึ้น [su: Authentication failure] ข้อความนี้คือข้อความที่ไลบรารี PAM ส่งกลับเมื่อการยืนยันตัวตนล้มเหลว ตามคู่มือทางการ ถ้า su ล้มเหลวก่อนรันคำสั่ง รหัสออกจะเป็น 1
ถ้าใส่รหัสผ่านของบัญชีตัวเองถูกต้องแล้ว แต่ su ยังปฏิเสธ ให้ตรวจก่อนว่าตรงนั้นต้องใส่รหัสผ่านของบัญชีปลายทางหรือไม่ เพราะ sudo ถามรหัสผ่านของผู้ที่รัน ส่วน su ถามรหัสผ่านของบัญชีที่จะสลับไป
ถ้าเขียนชื่อบัญชีที่ไม่มีอยู่จะขึ้น [su: user user9 does not exist or the user entry does not contain all the required fields] (อ้างอิงข้อความในโปรแกรม) สาเหตุและสิ่งที่ต้องตรวจของแต่ละข้อผิดพลาดเป็นดังนี้
| เอาต์พุต | สาเหตุ | สิ่งที่ต้องตรวจ |
|---|---|---|
| This account is currently not available. | เชลล์ของบัญชีปลายทางเป็น nologin | ช่องสุดท้ายของบรรทัดบัญชีใน getent passwd ถ้าเป็น root ให้ระบุเชลล์ด้วย -s |
| su: Authentication failure | รหัสผ่านไม่ถูกต้อง | เป็นรหัสผ่านของบัญชีปลายทางหรือไม่ (sudo ถามรหัสผ่านของคุณเอง) |
| su: user user9 does not exist … | ไม่มีบัญชีชื่อนั้น | getent passwd ชื่อบัญชี |
| user1 is not in the sudoers file. | บัญชีที่ไม่ได้รับอนุญาตให้ใช้ sudo | การตั้งค่า sudoers และกลุ่ม wheel |
🔢 FAQ & เนื้อหาแนะนำ
สิทธิ์ · ความเป็นเจ้าของ
สิทธิ์ของ Linux (4,2,1) และความเป็นเจ้าของ | คำสั่ง chmod, chown, umask
บทความเรื่องวิธีดูและเปลี่ยนสิทธิ์อ่าน เขียน รัน และเจ้าของของไฟล์และไดเรกทอรี
ผู้ใช้และการเข้าถึง
คำสั่ง Linux who, w & คำสั่ง user
คำสั่งสำหรับดูผู้ใช้ที่ล็อกอินอยู่บนเซิร์ฟเวอร์ตอนนี้และงานที่ผู้ใช้นั้นกำลังรัน
เครือข่ายและการเข้าถึง
คำสั่ง SSH: ตัวเลือกและวิธีใช้
บทความเรื่องรูปแบบพื้นฐานและตัวเลือกของคำสั่ง ssh ที่ใช้เชื่อมต่อเซิร์ฟเวอร์ระยะไกลด้วยบัญชีผู้ใช้
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน