คำสั่ง su: ความต่างของ su กับ su - และ sudo su กับ sudo -i วิธีสลับบัญชี

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8util-linux 2.37บัญชี rootDebian 12 · util-linux 2.38 บัญชีผู้ใช้ทั่วไปตรวจสอบเมื่อ 2026-11-05
รันคำสั่งด้วยบัญชีอื่น

ถ้าต้องการสลับไปใช้บัญชีอื่นเพื่อรันคำสั่งบน Linux โดยไม่ต้องออกจากระบบบัญชีปัจจุบัน ให้ใช้คำสั่ง su จากการรัน su จากบัญชี root ของเซิร์ฟเวอร์ AlmaLinux 9 ไปยัง daemon ซึ่งเป็นบัญชีระบบที่ล็อกอินไม่ได้ พบว่าขีดกลางเพียงตัวเดียวทำให้โฟลเดอร์ทำงานและ PATH เปลี่ยนไป และต้องระบุเชลล์ก่อนคำสั่งจึงจะทำงาน

ผลลัพธ์ด้านล่างได้จากเซิร์ฟเวอร์ AlmaLinux 9.8 (บัญชี root) และเซิร์ฟเวอร์ Debian 12 (บัญชีทั่วไป) หน้าจอที่ถามรหัสผ่านและ sudo ไม่ได้รันบนเซิร์ฟเวอร์ที่ใช้งานจริง แต่สรุปตามคู่มือทางการ และบางส่วนของค่า PATH กับหมายเลขเวอร์ชันแพตช์ของ util-linux ในตัวจำลองได้เปลี่ยนเป็นค่าตัวอย่าง

1️⃣ วิธีใช้คำสั่ง su

  • ↪️ รูปแบบพื้นฐานและการกลับด้วย exit

รูปแบบพื้นฐานคือ [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 --version
su from util-linux 2.38.1

ดูได้ว่าบัญชีที่ต้องการสลับไปเปิดเชลล์ได้หรือไม่จากช่องสุดท้ายของบรรทัดบัญชีนั้นใน getent passwd

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

เชลล์ของ daemon คือ /sbin/nologin บัญชีที่ใส่ nologin แทนเชลล์ล็อกอินจะไม่เปิดเชลล์แม้จะสลับไปด้วย su แล้วก็ตาม

2️⃣ ความต่างของ su กับ su -

  • ↪️ เชลล์ล็อกอินและตัวแปรสภาพแวดล้อม

เมื่อใส่ขีดกลาง (-) su จะเปิดเชลล์แบบเดียวกับที่ได้เมื่อล็อกอินด้วยบัญชีปลายทาง ในโฟลเดอร์ /tmp ได้รันคำสั่งเดียวกันแบบไม่มีขีดกลางหนึ่งครั้ง และแบบมีขีดกลางอีกหนึ่งครั้ง

su -s /bin/sh -c pwd daemon
/tmp
su - -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/bin
su - -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/sbin

HOME, USER และ LOGNAME เปลี่ยนเป็นค่าของ daemon ทั้งสองกรณี ส่วน PATH เมื่อไม่มีขีดกลางยังคงเป็นค่าของ root ที่รัน su และเมื่อใช้ [su -] จะถูกกำหนดใหม่ตามการตั้งค่าล็อกอิน

ตามคู่มือทางการ su แบบไม่มีขีดกลางจะเปลี่ยนเฉพาะ HOME และ SHELL และจะเปลี่ยน USER กับ LOGNAME ด้วยก็ต่อเมื่อบัญชีปลายทางไม่ใช่ root ดังนั้นถ้าสลับจากบัญชีทั่วไปไปเป็น root โดยไม่มีขีดกลาง USER จะยังเป็นชื่อบัญชีเดิม

[$0] ที่แสดงชื่อเชลล์ก็ต่างกันด้วย

su -s /bin/sh -c 'echo $0' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

เมื่อใช้ [su -] จะมีขีดกลางนำหน้าชื่อเชลล์และแสดงเป็น -sh เชลล์ที่ชื่อขึ้นต้นด้วยขีดกลางจะทำงานเป็นเชลล์ล็อกอินและอ่านไฟล์ตั้งค่าล็อกอิน (ตามคู่มือทางการ) ความต่างของทั้งสองแบบเป็นดังนี้

การเปรียบเทียบsusu -
โฟลเดอร์งานคงเดิม (/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 daemon
This account is currently not available.

คำสั่งที่ส่งด้วย -c ก็ถูกเชลล์ของบัญชีรับไปรันเช่นกัน ถ้าเชลล์เป็น nologin คำสั่งจึงไม่ได้ทำงานเลย กรณีนี้ให้ระบุเชลล์ที่จะรันด้วย -s

su -s /bin/sh -c id daemon
uid=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 เชลล์รันด้วยเชลล์ที่ระบุแทนเชลล์ที่ตั้งไว้ในบัญชี บัญชีที่เป็นเชลล์แบบจำกัดใช้ได้เฉพาะ rootsu -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 ได้ด้วยตัวเอง บัญชีและรหัสผ่านเป็นค่าตัวอย่าง

ตัวจำลองคำสั่ง suutil-linux 2.37
[user1@server1 ~]$
ทำงานเฉพาะในเบราว์เซอร์ บัญชีและรหัสผ่านเป็นค่าตัวอย่าง และใช้ ↑↓ เรียกคำสั่งก่อนหน้ากลับมาได้ (รหัสผ่านไม่ถูกเก็บในประวัติ)

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)

คำสั่งรหัสผ่านที่ถามเชลล์ที่รันโฟลเดอร์งาน
surootเชลล์ 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

  • ↪️ This account is currently not available · Authentication failure

ถ้าสลับไปยังบัญชีที่ล็อกอินไม่ได้ nologin จะทำงานแทนเชลล์และขึ้น [This account is currently not available.] เมื่อรัน [su daemon] จาก root ก็ขึ้นเพียงบรรทัดนี้บรรทัดเดียว และรหัสออกเป็น 1

su daemon
This 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 & เนื้อหาแนะนำ

คู่มือทางการอธิบาย su ว่าเป็นคำสั่งสำหรับผู้ใช้ทั่วไปเป็นหลัก และแนะนำคำสั่ง runuser ที่ไม่ผ่านการยืนยันตัวตนสำหรับสคริปต์ที่ root รัน รูปแบบคือ [runuser -u บัญชี -- คำสั่ง]

ถ้าเขียนชื่อตัวแปรที่จะคงไว้คั่นด้วยจุลภาคต่อจาก -w (--whitelist-environment) [su -] จะคงตัวแปรนั้นไว้ตอนล้างสภาพแวดล้อม ตามคู่มือทางการ HOME, SHELL, USER, LOGNAME, PATH จะถูกกำหนดใหม่แม้อยู่ในรายการ

ตามคู่มือทางการ su จะบันทึกความพยายามล็อกอินที่ล้มเหลวไว้ในไฟล์ btmp เสมอ และไม่เขียนลงไฟล์ lastlog ดูบันทึกใน btmp ได้ด้วยคำสั่ง lastb

🔗 เนื้อหาแนะนำ
การสร้างบัญชี Linux: คำสั่ง useradd & คำสั่ง passwd คำสั่งสำหรับสร้างบัญชีผู้ใช้ที่จะสลับเข้าไปด้วย su โดยใช้ useradd และตั้งรหัสผ่านของบัญชีนั้นด้วย passwd อ่านบทความ → บัญชีที่สร้างด้วยคำสั่ง useradd ตรวจดูได้ใน /etc/passwd

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 3   +   1   =