Ubah sudo su shell

13

Setiap kali saya menjalankan sudo sudari normal saya zsh(yang menggunakan kerangka oh-my-zsh ), saya dipaksa untuk menggunakan shell Bourne lama ( sh) secara default (jelas; ini adalah perilaku standar pada kebanyakan sistem * mirip-nix). Jika saya lari zshdari dalam shsetelah berlari sudo su, saya mendapatkan shell Z, tetapi tanpa perbaikan dari oh-my-zsh.

Apakah ada cara untuk mengubah sudo supeluncuran shell ke zsh? Jika demikian, apakah mungkin untuk zshmenggunakan instance peluncuran itu juga oh-my-zsh?

Saya menggunakan OS X 10.8.4.

Jules
sumber

Jawaban:

21

Cara lain untuk mengeksekusi shell interaktif sebagai superuser adalah sudo -s, yang digunakan $SHELLsebagai shell.

Seperti komentar dalam jawaban lain yang disebutkan, su -s /path/to/zshtidak berfungsi di OS X.

OS X juga tidak mendukung penggantian shell login /etc/passwd, tetapi Anda dapat menggunakan dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shbukan shell Bourne lagi di sebagian besar platform. Ini adalah versi bash POSIX-compliant di OS X dan dash di Ubuntu.

Lri
sumber
Inilah yang menurut saya pertanyaan yang diinginkan. Jelas itulah yang bekerja untuk saya; Terima kasih banyak! sunting Saya melihat apa yang dia inginkan sekarang - saya tidak berpikir ini yang dia inginkan, jadi saya tidak bisa cukup mengangkatnya untuk pertanyaan ini, tapi saya pikir Anda tetap berhak mendapatkan medali. Anda punya jawaban untuk pertanyaan saya !
Wyatt8740
4

Dari halaman sumanual, ada dua cara untuk mencapai hal ini.


Metode pertama adalah dengan hanya menggunakan tanda -satau --shell(dengan anggapan Anda menggunakan OS * NIX dengan versi suyang mendukung argumen ini), diikuti dengan jalur ke shell pilihan Anda. Jika shell yang diteruskan tidak dapat ditemukan, sukembali ke metode berikut, dan jika gagal, akan mencoba memohon /bin/sh.

Misalnya, Anda dapat memaksa suuntuk meluncurkan zsh(dengan asumsi itu ada di /bin/zsh) sebagai:

sudo su --shell /bin/zsh

Metode kedua adalah memodifikasi shell default yang ditentukan untuk rootpengguna ( hati-hati! ). Ini dapat dilakukan dengan mengedit file /etc/passwddan mengubah shell yang ditentukan untuk rootpengguna. Untuk melihat shell apa yang ditentukan secara default, Anda dapat menjalankan perintah berikut (dengan asumsi superuser adalah root):

sudo grep root /etc/passwd 

Perintah harus menampilkan sesuatu seperti root:x:0:0:root:/root:/bin/bash. Anda dapat dengan mudah mengubah /bin/bash(atau apa pun yang diatur dalam sistem Anda) untuk menunjuk zsh.

Penerobosan
sumber
3
Seperti biasa, berhati-hatilah dalam mengganti shell root. Anda tidak ingin berada dalam mode pengguna tunggal, dan memiliki shell root yang perlu / usr ketika rusak. Sewaktu-waktu pastikan shell baru Anda tidak memiliki ketergantungan sistem file lebih dari yang Anda ganti
Rich Homolka
Menjalankan sudo su -s /bin/zsh(atau menggunakan --shell) mengembalikan su: illegal option -- s. Saya menggunakan OS X 10.8.4; apakah OS X mengambil perintah yang berbeda?
Jules
@ JulesMazur apa outputnya cat /etc/shells? Secara teknis hanya shell yang diizinkan dalam file itu yang akan diluncurkan, meskipun halaman sumanual mengatakan ini tidak masalah jika sudisebut oleh root: S
Terobosan
cat /etc/shellskembali /bin/zshsebagai shell yang dapat diterima.
Jules
2
@JulesMazur harap ingat untuk selalu menyertakan OS Anda untuk menghindari kebingungan semacam ini.
terdon
1

Cara bersih yang juga akan melindungi sistem Anda jika shell kustom Anda diledakkan adalah dengan membuat .profile di direktori home root dengan:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

Ubah saja path ke shell yang Anda inginkan alih-alih bash.

cybrhippy
sumber
0

Dapat dengan mudah dilakukan dengan chpass:

$ sudo chpass -s /bin/zsh
pengguna686249
sumber