Membuat shell default zsh tanpa akses root


52

Saya menggunakan komputer sekolah saya dan ingin menggunakan zshbukan bash. Saya ingin menjadikannya shell default, tetapi saya tidak dapat menjalankan perintah seperti itu $ chsh -s $(which zsh)karena saya tidak memiliki hak admin.

Apakah ada cara saya dapat memasukkan sesuatu ke dalam saya .bashrcatau sesuatu yang secara otomatis memanggil zshketika terbuka sebagai solusi?

Untuk memperjelas, zshsudah diinstal.


2
Ya, tambahkan saja zshpada .bashrcfile. Logout dan login dan selesai!
fedorqui

Maaf soal itu. Tetapi untuk menyelesaikan pertanyaan, saya hanya memakai zshbaris pertama?

3
Menempatkan zsh di .bashrc akan membuatnya selalu mengeksekusi bahkan ketika bashdipanggil secara eksplisit. Lebih baik tempatkan .bash_profilesaja.
konsolebox

Anda dapat mengatur zsh sebagai shell default di preferensi terminal (buat profil baru).
lmaooooo

Jawaban:


68

Buat .bash_profiledi direktori home Anda dan tambahkan baris ini:

export SHELL=/bin/zsh
exec /bin/zsh -l

Pembaruan: .profiledapat berfungsi sebagai solusi umum ketika shell default bukan bash. Saya tidak yakin apakah .profiledapat dipanggil oleh Zsh juga bahwa itu bisa berlebihan tetapi kita bisa melakukannya dengan aman dengan cek sederhana:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

Kita juga bisa menggunakan whichuntuk mendapatkan jalur dinamis zshyang bergantung pada nilai $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

Bagaimana jika admin Linux (root) mengubah shell default Anda menjadi sesuatu selain bash (tetapi bukan zsh), misalnya ksh? Maka .bash_profiletidak akan dirujuk. Bagaimana kalau dimasukkan ini .profilesebagai gantinya?
Joshua Huber

@ JoshuaHuber Tes terakhir yang saya buat, .profiletidak berhasil. Juga tidak .profileakan dipanggil oleh Zsh? Itu bisa berlebihan. Belum memeriksa itu. (Pembaruan: Itu berhasil sekarang, tidak yakin kesalahan apa yang saya buat sebelumnya.) Adakah pemikiran tentang kemungkinan kelemahan menggunakan .profile?
konsolebox

1
@konsolebox Bash hanya sumber .profilejika .bash_profiletidak ada (kecuali jika Anda sumbernya secara manual .bash_profile, tentu saja). Secara khusus, bash sumber yang pertama dari file [ .bash_profile> .bash_login> .profile] yang ditemukan. Ini hanya terlihat .profilesebagai fitur kompatibilitas POSIX (shell Bourne).
pyrocrasty

@pyrocrasty Memang. Seperti yang dikatakan dalam manual: "Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca . "
konsolebox

Ini berhasil untuk mengatur profil terminal baru dengan Jalankan perintah kustom alih-alih shell saya diubah menjadi zsh. .bash_profiledan .profiletidak berfungsi (file-file itu bahkan tidak dieksekusi, Fedora 26 di komputer universitas).
lmaooooo

12

Biasanya Anda dapat menggunakan chshsebagai pengguna non-root. Tapi kadang-kadang dinonaktifkan, biasanya di situs yang menggunakan beberapa bentuk database pengguna jaringan seperti NIS dan LDAP. Mungkin ada ypchsh(NIS) atau chsh.ldap(LDAP) sebagai gantinya.

chshbiasanya juga hanya mengizinkan beberapa shell yang disetujui , biasanya yang terdaftar di /etc/shells.

Jika Anda tidak dapat menggunakan chshatau variasinya di situs Anda, maka atur shell login execAnda ke shell favorit Anda, dan atur SHELLvariabel untuk menunjuk ke shell favorit Anda.

  • Jika shell login Anda adalah sh, dashatau ksh: file yang perlu Anda edit adalah ~/.profile. Berhati-hatilah bahwa file ini dibaca pada awal sesi interaktif dan juga oleh beberapa skrip startup sesi non-interaktif (misalnya untuk sesi X11), jadi Anda harus berhati-hati: hanya panggilan exec(yang menggantikan proses saat ini) saat saat ini shell bersifat interaktif. Kecuali untuk shell Bourne (versi /bin/shSolaris 10 dan sebelumnya), Anda dapat mengatakan bahwa shell interaktif dengan kehadiran idalam daftar opsi ( $-).

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    Jika Anda ingin zsh untuk membaca Anda .zprofile, sampaikan -lopsi.

  • Jika shell login bashAnda, Anda dapat melanjutkan seperti di atas. Atau, Anda dapat menempatkan perintah ini di ~/.bash_profile. Sebagian besar skrip startup sesi hanya membaca ~/.profiledan tidak ~/.bash_profile, tetapi saya telah melihat beberapa skrip berjalan di bawah bash dan membaca .bash_profile, jadi bahkan di sana Anda harus berhati-hati untuk tidak memanggil execshell non-interaktif.

  • Jika shell login Anda adalah csh atau tcsh, lihat contoh di Mengganti shell default tanpa chsh atau hak administrator


1

Saya percaya bahwa perintahnya chshadalah untuk tujuan ini. Meskipun, saya tidak yakin bahwa setiap distro Linux / Unix mendukung itu. Periksa halaman manual dari chsh.


Beberapa sistem juga memilikinya passwd -s.
Stéphane Chazelas

1

Jika Anda tidak dapat berlari chshkarena Anda tidak memiliki hak admin, bicaralah dengan seseorang yang punya .

Kemungkinan besar Anda tidak dapat menggunakan chshsebagai non-root karena sistem yang Anda gunakan dikonfigurasi sehingga chshtidak akan berfungsi, misalnya karena sistem menggunakan NIS atau LDAP daripada hanya /etc/passwdfile. Atau mungkin administrator sistem Anda hanya ingin mempertahankan kontrol.

Prosedur untuk mengganti shell Anda tergantung pada kebijakan organisasi Anda. Mungkin ada perintah lokal yang melakukan apa yang chshbiasanya dilakukan. Atau Anda mungkin perlu mengirimkan tiket dukungan meminta perubahan shell.

Sebagian besar jawaban lain baik, tetapi jika administrator Anda cukup responsif, Anda mungkin tidak ingin repot-repot meretas skrip startup Anda. Saya mungkin baru saja memohon zsh -lsecara manual setelah masuk hingga administrator dapat memperbarui akun saya.

Hal lain yang perlu diingat: Kadang-kadang shell yang berbeda dapat menggunakan file startup yang sama. Misalnya, shdan bashdapat baik mengeksekusi $HOME/.profile, dan cshdan tcshkeduanya dapat mengeksekusi $HOME/.logindan $HOME/.cshrc(meskipun file startup shell khusus seperti .bashrc, .bash_profile, dan .tcshrcdapat menimpa mereka). Jika shell default /bin/cshAnda dan Anda ingin menggunakan /bin/tcsh, memperbarui Anda .loginuntuk memohon /bin/tcsh -ldapat membuat loop tak terbatas. zshtidak terjadi untuk menjalankan bashfile startup khusus, jadi itu bukan masalah bagi Anda.

Kebanyakan kerang set variabel yang mengidentifikasi shell Anda menjalankan ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Jika Anda akan menulis kode startup untuk memohon shell pilihan Anda, itu bukan ide yang buruk untuk menyertakannya di ifsehingga dijalankan hanya jika Anda belum menjalankan shell itu. Menggunakan kode dari jawaban konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(Komplikasi tambahan dari pemeriksaan "${ZSH_VERSION:-unset}"daripada hanya "$ZSH_VERSION"memungkinkan untuk kemungkinan yang telah Anda lakukan set -o unset, opsi yang menyebabkan referensi ke variabel yang tidak ditentukan menjadi kesalahan.)


1

Saya bisa memikirkan beberapa skenario.

  1. zshtidak ada /etc/shells, dan OP ingin menggunakannya tanpa harus mengetikkan zshcommand prompt. Solusi yang memungkinkan.

    a) menggunakan trik profil untuk menjalankannya saat login. Ini sama efektifnya dengan benar-benar mengubah shell.

    b) mohon admin untuk menambahkan zshke /etc/shellssehingga Anda dapat chshuntuk itu

    c) mohon admin untuk mengganti shell Anda. ini tidak bijaksana, karena Anda akan kehilangan kemampuan untuk ftpmasuk. Anda hanya dapat menggunakan ftpjika Anda memiliki shell/etc/shells

  2. pengguna ingin keluar dari shell terbatas, kemungkinan besar rbashatau rsh.

    Jika .profiledapat diedit, PATHdapat diperluas dengan mengeditnya. Setelah /binberada di jalur, Anda bisa mulai bashdari dalam rsh/rbash, mendapatkan akses ke chshperintah untuk membiarkan Anda mengganti shell. Banyak perintah memiliki shell escapes yang dapat digunakan untuk keluar dari shell yang dibatasi dan mendapatkan kembali akses ke chsh.

  3. chshbenar-benar tidak berfungsi karena beberapa alasan lain. solusi dari kemungkinan 1 adalah jawaban di sini juga.

Skenario 2 adalah satu-satunya alasan untuk benar-benar mengubah shell default (terlalu ketat).


-3

Saya tidak berpikir jawaban yang diberikan benar-benar membuat zshshell default. Sederhana mengubah shell ke zsh segera setelah pengguna login ke shell default- nya . Pengguna masih akan login ke nya DEFAULT SHELLtetapi dengan ini, shell akan berubah menjadizsh

Untuk mengubah penggunaan shell default:

usermod -s /path/to/shell username 

Anda harus menjadi root untuk melakukan itu.

Kalau tidak, solusi di atas akan berguna.

Ditambahkan dari komentar

chsh -s /path/to/zsh  # considered as standard as compared to usermod

dan itu bisa dipanggil oleh pengguna untuk dirinya sendiri.


4
Pertanyaannya cukup jelas menyatakan bahwa memodifikasi database pengguna sistem (bit yang perlu Anda root untuk dilakukan dalam jawaban ini) bukanlah suatu pilihan.
Caleb

3
chsh -s /path/to/zshlebih standar dan biasanya (tetapi tidak selalu) tidak memerlukan akses root, tidak seperti usermodyang selalu dilakukan. Jadi jawaban Anda memiliki lebih banyak masalah daripada yang dinyatakan tidak berfungsi.
Gilles 'SO- berhenti bersikap jahat'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.