Perintah su Linux: beralih pengguna dan shell login
su adalah alat yang digunakan untuk menjalankan shell atau perintah dengan ID pengguna dan grup alternatif. Jika tidak ada pengguna yang ditentukan, biasanya ditujukan ke root, dan menggunakan su --login user beralih ke lingkungan yang mirip dengan masuk langsung sebagai pengguna tersebut.
su user sederhana mempertahankan direktori kerja saat ini dan sebagian variabel lingkungan, yang dapat bercampur dengan pengaturan pengguna lain. Untuk pergantian akun interaktif, su --login user biasanya digunakan, dan jika tujuannya hanya untuk menjalankan satu perintah administratif, sebaiknya pertimbangkan terlebih dahulu apakah sudo berbasis kebijakan lebih tepat.
Apa itu perintah su?
su adalah singkatan dari substitute user and group ID, dan menjalankan perintah menggunakan ID pengguna dan grup alternatif. Jika nama pengguna tidak diberikan, su mencoba memulai shell interaktif sebagai akun root.
su dari util-linux melakukan autentikasi, serta manajemen akun dan sesi melalui PAM (Pluggable Authentication Modules). Kata sandi yang diperlukan, apakah hanya grup tertentu yang bisa menggunakan su, dan di mana upaya login dicatat, dapat berbeda tergantung pada PAM distribusi dan pengaturan keamanan.
Artikel ini didasarkan pada implementasi util-linux, yang banyak digunakan di Linux. Perilaku yang tepat dan file konfigurasi spesifik sistem dapat ditemukan di halaman manual su resmi util-linux.
Sintaks Dasar dan Pergantian Akun
Sintaks berikut adalah pola; ganti placeholder dengan akun dan opsi yang sebenarnya.
su [options] [-] [user [arguments...]]
Jika tidak ada pengguna yang ditentukan, ia akan mencoba beralih ke akun root.
su
Ketika dijalankan oleh pengguna biasa, biasanya akan meminta kata sandi dari akun root target. Jika akun root terkunci atau kebijakan PAM tidak mengizinkannya, berpindah akun tidak bisa dilakukan meskipun kata sandi pengguna yang benar diketahui.
Untuk beralih ke pengguna tertentu, tentukan nama akun. Akun deploy dalam contoh harus ada dan Anda harus diizinkan menggunakannya; ganti dengan akun yang sesuai.
su deploy
Untuk kembali ke shell semula, jalankan exit di shell yang telah dipindahkan atau tekan Ctrl+D.
exit
Perbedaan antara su dan su --login
| Kategori | su user |
su --login user |
|---|---|---|
| direktori kerja | pertahankan direktori saat ini | pindah ke direktori home pengguna target |
| variabel lingkungan | hanya sebagian diubah dan mungkin bercampur dengan lingkungan yang ada | sebagian besar dibersihkan untuk menyiapkan lingkungan login pengguna target |
| PATH | Terpengaruh oleh pengaturan sistem dan PAM | Inisialisasi agar sesuai dengan lingkungan login target |
| Metode startup shell | Shell interaktif standar | Mulai sebagai login shell |
| Situasi yang disarankan | Dimaksudkan untuk kasus terbatas di mana retensi lingkungan diinginkan | Pengalihan pengguna interaktif normal |
Manual util-linux menyarankan penggunaan --login untuk menghindari efek samping dari lingkungan campuran. Bentuk pendek - memiliki makna yang sama.
su --login deploy
su - deploy
Perubahan dalam lingkungan shell login
Membersihkan sebagian besar variabel lingkungan yang ada
su --login dari util-linux membersihkan lingkungan yang ada kecuali TERM, COLORTERM, NO_COLOR, dan variabel yang diizinkan secara eksplisit. Kemudian menginisialisasi HOME, SHELL, USER, LOGNAME, dan PATH berdasarkan pengguna target.
Lingkungan akhir juga dapat mencerminkan nilai yang ditambahkan atau diubah oleh modul PAM, sehingga tidak boleh diasumsikan sama persis di seluruh distribusi.
Pindah ke direktori home pengguna target
--login memulai shell login setelah pindah ke direktori home pengguna target. Setelah beralih, Anda dapat memeriksa pengguna, home, dan direktori kerja dengan perintah berikut.
id
printf '%s\n' "$HOME"
pwd
Perubahan file inisialisasi shell
Shell login membaca file inisialisasi untuk login sesuai dengan aturan shell yang digunakan. Untuk Bash, hal ini dapat dipengaruhi oleh pengaturan sistem dan pengguna seperti /etc/profile dan ~/.bash_profile. Periksa manual shell target dan pengaturan akun untuk urutan yang sebenarnya.
Opsi su yang sering digunakan
| Opsi | Fungsi | Penggunaan dan perhatian |
|---|---|---|
-, -l, --login |
Beralih ke lingkungan shell login | Umumnya disarankan untuk pergantian interaktif |
-c command, --command command |
Mengirimkan satu perintah ke shell | Harus memeriksa penanda kutip dan status keluar |
-s shell, --shell shell |
Menentukan shell yang akan dijalankan | Dalam akun shell terbatas, mungkin diabaikan jika pemanggil bukan root |
-m, -p, --preserve-environment |
Pertahankan lingkungan saat ini sebanyak mungkin | Diabaikan saat digunakan dengan --login, gunakan dengan hati-hati untuk keamanan |
-w list, --whitelist-environment list |
Pertahankan variabel lingkungan tertentu saat berganti login | Dipisahkan dengan koma, kecuali variabel akun inti |
-P, --pty |
Buat terminal pseudo terpisah dalam sesi | Membuat pseudoterminal terpisah untuk mengurangi risiko berbagi terminal secara langsung |
-g group |
Tentukan grup default | Hanya pengguna root yang bisa menggunakan |
-G group |
Tentukan grup sekunder | Hanya pengguna root yang bisa menggunakan dan dapat diulang |
Jalankan satu perintah sebagai pengguna lain
Jalankan satu perintah dengan -c
Jika Anda tidak perlu tetap berada di shell interaktif, Anda dapat mengirim perintah ke shell pengguna target dengan -c.
su -c 'id' deploy
Saat perintah selesai, su juga akan berhenti dan kembali ke shell asli. Karena string perintah diinterpretasikan ulang oleh shell target, berhati-hatilah dengan tanda kutip, ekspansi variabel, dan waktu pengalihan.
Menjalankan perintah dalam lingkungan login
Untuk menjalankan perintah dalam lingkungan login dan direktori rumah pengguna target, gunakan --login bersama-sama.
su --login -c 'pwd; id' deploy
Kedua perintah yang dihubungkan dengan titik koma dijalankan di dalam shell pengguna target. Jangan langsung melewatkan string yang dibuat secara dinamis dengan hak istimewa yang ditinggikan jika string tersebut mencakup input eksternal, karena ini berisiko menyebabkan injeksi perintah.
Memeriksa status keluar dari perintah
su umumnya mengembalikan status keluar dari perintah yang dijalankan. Dalam implementasi util-linux, ia mengembalikan 126 jika perintah tidak dapat dijalankan, 127 jika perintah tidak ditemukan, dan 1 untuk kesalahan umum sebelum eksekusi perintah.
su -c '/usr/local/bin/check-job' deploy
status=$?
printf 'exit=%s\n' "$status"
Dalam otomatisasi, periksa status keluar selain output. Jalur /usr/local/bin/check-job adalah contoh; ganti dengan program yang benar-benar tersedia.
Menangani Shell dan Akun Terbatas
Shell Default dari Pengguna Target
Kecuali ditentukan lain, shell yang diatur dalam entri passwd akun target umumnya digunakan, dan jika tidak ada, secara default menggunakan /bin/sh. Saat memeriksa informasi akun, jangan sembarangan mengubah seluruh /etc/passwd; sebaliknya, query seperti berikut.
getent passwd deploy
Menentukan Shell dengan -s
Anda dapat menentukan shell yang berbeda dengan -s.
su -s /bin/sh -c 'id' deploy
Jika shell akun target adalah shell terbatas yang tidak tercantum di /etc/shells, shell yang ditentukan oleh pengguna biasa bisa diabaikan. Hanya karena root bisa melewati batasan tidak berarti aman membuka shell interaktif untuk akun layanan.
Menghormati Tujuan Akun Layanan
Akun dengan nologin atau false yang diatur sebagai shell mereka kemungkinan tidak dimaksudkan untuk login interaktif. Jika Anda perlu bekerja dengan akun semacam itu, jalankan hanya perintah yang diperlukan dan periksa terlebih dahulu apakah ada perintah manajemen yang disediakan oleh layanan atau jika fitur systemd tersedia.
Gunakan pelestarian variabel lingkungan dengan hati-hati
Arti dari --preserve-environment
Opsi --preserve-environment mempertahankan lingkungan saat ini tanpa mengatur ulang HOME, SHELL, USER, atau LOGNAME. Ini akan diabaikan jika ditentukan bersama dengan --login.
su --preserve-environment deploy
Kecuali dalam kasus khusus di mana pengaturan pengguna pemanggil harus diteruskan apa adanya, mencampur lingkungan rumah dan eksekusi akun target dapat menyebabkan kepemilikan berkas atau perubahan konfigurasi yang tidak terduga.
Hanya izinkan variabel yang diperlukan
Dalam util-linux, Anda dapat mempertahankan hanya variabel yang diperlukan dengan menggabungkan --login dan --whitelist-environment.
su --login --whitelist-environment=LANG,LC_ALL deploy
HOME, SHELL, USER, LOGNAME, dan PATH dikecualikan dari daftar putih. Variabel locale juga dapat mempengaruhi perilaku program, jadi hanya teruskan nilai yang benar-benar diperlukan.
Perbedaan antara su dan sudo
| Kategori | su |
sudo |
|---|---|---|
| Tujuan Utama | Jalankan shell atau perintah sebagai pengguna lain | Jalankan perintah sebagai pengguna lain yang diizinkan oleh kebijakan |
| Otentikasi Umum | Kata sandi pengguna target | Kata sandi pengguna yang memanggil |
| Cakupan hak akses | Lanjutkan menggunakan hak istimewa akun target di shell yang dialihkan | Dapat dibatasi dengan perintah dan kondisi yang diizinkan |
| Audit dan pelacakan | Fokus pada catatan pergantian sesi, dan pelacakan perintah internal memerlukan pelacakan terpisah | Permintaan eksekusi dapat dicatat melalui plugin kebijakan/log |
| Situasi yang sesuai | Jika akun target membutuhkan lingkungan interaktif | Menjalankan satu perintah administratif atau hak istimewa minimum per peran |
Metode otentikasi dan pencatatan dapat bervariasi menurut PAM dan kebijakan, jadi tabel di atas adalah perbandingan umum. Jika hanya perintah root yang diperlukan, sudo, yang dapat membatasi hak istimewa per perintah, seringkali lebih sesuai daripada su, yang berbagi kata sandi akun. Untuk penggunaan rinci, lihat panduan sudo dan konfigurasi sudoers.
Alasan tidak beralih ke akun root
Akun root mungkin terkunci
Beberapa distribusi menonaktifkan login dengan kata sandi untuk akun root secara default dan menggunakan administrasi melalui sudo. Dalam kasus ini, memasukkan kata sandi pengguna saat ini di su - tidak akan berhasil.
Jika pengguna memiliki hak istimewa sudo dan kebijakan mengizinkannya, shell root bergaya login dapat dibuka sebagai berikut, tetapi jika hanya perintah tertentu yang diperlukan, lebih aman menggunakan sudo command daripada shell administrator.
sudo -i
PAM atau kebijakan grup mungkin memberlakukan pembatasan
Kebijakan di /etc/pam.d/su dapat membatasi penggunaan su untuk kelompok tertentu atau memberlakukan persyaratan otentikasi tambahan. Jangan secara sembarangan melemahkan pengaturan PAM untuk mendapatkan hak istimewa; sebaliknya, berikan administrator sistem dengan tugas yang diperlukan dan akun target.
Mungkin ada masalah dengan status akun target.
Pergantian mungkin gagal karena akun kedaluwarsa, terkunci, direktori home salah, shell terbatas, atau izin file. Jika Anda seorang administrator, periksa penyebabnya dengan getent passwd user, alat manajemen akun, dan log otentikasi.
Saat root menjalankan sebagai pengguna lain
runuser mungkin lebih cocok untuk otomatisasi
Manual util-linux merekomendasikan runuser saat dijalankan sebagai pengguna lain dari proses dengan hak istimewa tinggi atau skrip root. runuser bukan set-user-ID, tidak memerlukan otentikasi kata sandi, dan menggunakan konfigurasi PAM terpisah.
runuser -u backup -- /usr/local/bin/backup-job
Akun backup dan program dalam contoh harus ada; pastikan targetnya sebelum menjalankan. Manual runuser menjelaskan opsinya. runuser adalah alat administratif yang digunakan oleh root, jadi ini bukan perintah untuk pengguna biasa agar memperoleh hak istimewa sebagai pengganti sudo.
Jika sesi PAM tidak diperlukan, pertimbangkan kembali tujuannya
Jika Anda hanya perlu mengubah ID pengguna/grup dan atribut izin untuk menjalankan sebuah program dan sesi PAM tidak diperlukan, util-linux juga menyarankan setpriv sebagai alternatif. Alat ini langsung mengelola hak istimewa dan atribut keamanan, jadi sebaiknya hanya digunakan oleh administrator yang memahami pengaturan pengguna, grup, grup tambahan, dan kemampuan secara tepat.
Pisahkan sesi dengan terminal semu
Pemisahan sesi dengan --pty
--pty membuat terminal semu terpisah antara sesi asli dan sesi target, dan su menyalurkan input dan output. Ini dapat meningkatkan keamanan dengan mencegah kedua sesi berbagi terminal yang sama secara langsung dalam sesi interaktif.
su --pty --login deploy
Bukan sesi login systemd penuh
Bahkan ketika menggunakan su --login, itu tidak membuat sesi login baru yang sepenuhnya nyata dari perspektif systemd-logind. Jika Anda membutuhkan tugas yang memerlukan layanan pengguna, kursi (seats), atau batas sesi, Anda harus mempertimbangkan alat yang sesuai untuk tujuan tersebut, seperti systemd-run atau machinectl, dengan memeriksa opsi dan hak yang sesuai.
Tindakan pengamanan
- Jangan membagikan kata sandi root atau kata sandi pengguna lain dengan beberapa orang.
- Jangan meletakkan kata sandi di baris perintah, riwayat shell, skrip, atau pipa.
- Jangan biarkan shell root terbuka lebih lama dari yang diperlukan; gunakan
exitsegera setelah menyelesaikan pekerjaan. - Segera setelah melakukan switch, periksa
id,pwd, danHOMEuntuk menghindari kebingungan antara pengguna dan jalur. - Untuk perintah yang dijalankan dengan hak istimewa yang lebih tinggi, pertama tinjau opsi, jalur target, dan hasil dari ekspansi wildcard.
- Jangan menganggap log disimpan; sebaliknya, periksa pengaturan dan kebijakan retensi aktual dari PAM, jurnal, dan log autentikasi.
Perintah yang dijalankan setelah membuka shell root dengan su terpisah dari catatan autentikasi su itu sendiri. Jika audit per perintah diperlukan, sebaiknya dirancang bersamaan dengan audit shell, pencatatan terpusat, atau metode seperti sudo yang menyediakan kebijakan per perintah.
Masalah umum dan solusi
| Gejala | Kemungkinan penyebab | Cara memeriksa |
|---|---|---|
Authentication failure |
Kesalahan kata sandi target, akun terkunci, atau batasan PAM | Periksa akun target dan kebijakan/log otentikasi |
| Tidak dapat menemukan perintah setelah beralih | PATH pengguna target berbeda | Periksa command -v dan printf '%s\n' "$PATH" |
| Direktori home tidak berubah | Gunakan su user tanpa opsi login |
Gunakan su --login user |
| Pengaturan pengguna tampaknya bercampur | Gunakan su reguler yang sebagian mempertahankan lingkungan yang ada | Periksa env, HOME, USER |
| Shell yang ditentukan tidak berjalan | Shell terbatas atau pembatasan izin panggilan | Periksa getent passwd dan /etc/shells |
Pertanyaan yang Sering Diajukan
Password siapa yang Anda masukkan untuk su?
Umumnya, Anda memasukkan password pengguna target yang ingin Anda alihkan. Namun, jika root menjalankannya atau kebijakan PAM menggunakan metode autentikasi yang berbeda, perilakunya bisa bervariasi. Tidak menampilkan karakter saat kata sandi dimasukkan adalah hal yang normal.
Apa bedanya antara su dan su -?
su menjalankan shell root sambil mempertahankan direktori saat ini dan sebagian lingkungan. su - berpindah ke home root dan menyiapkan lingkungan login. Dalam util-linux, bentuk login disarankan untuk mengurangi pencampuran lingkungan.
Bagaimana cara memeriksa pengguna saat ini setelah beralih dengan su?
id berguna untuk memeriksa baik pengguna dan grup nyata maupun efektif secara bersamaan. Jika Anda hanya memerlukan nama pengguna sederhana, Anda dapat menggunakan whoami, tetapi untuk memeriksa grup tambahan, id memberikan lebih banyak informasi.
Apakah boleh menempatkan kata sandi su dalam skrip?
Tidak. Kata sandi bisa terekspos di file, informasi proses, atau log. Jika otomatisasi dilakukan sebagai root, buat metode menggunakan runuser yang terbatas. Jika ini untuk eskalasi hak istimewa sebagai pengguna biasa, buat cara yang tidak menyematkan kata sandi, seperti menggunakan aturan sudoers hak minimal atau layanan khusus untuk tugas tersebut.
Ringkasan
Untuk pergantian akun interaktif umum, Anda bisa menggunakan su --login user, dan untuk satu perintah, su -c 'command' user. su user yang sederhana dapat mencampur lingkungan, jadi sebaiknya periksa id, HOME, dan pwd setelah pergantian.
Jika tujuannya adalah untuk menjalankan hanya satu perintah root, sudo, yang menyediakan kontrol dan audit izin per-perintah, mungkin lebih tepat. Saat menjalankan sebagai pengguna lain dalam otomatisasi root, pertimbangkan runuser. Anda juga dapat memeriksa alat dasar terkait bersama-sama dalam daftar perintah yang umum digunakan di Linux (bahasa Inggris).




