Kök erişimi olmadan zsh varsayılan kabuk yapma


52

Ben okulun bilgisayarlarını kullanıyorum ve kullanmak istiyoruz zshyerine bash. Varsayılan kabuk yapmak istiyorum, ancak $ chsh -s $(which zsh)yönetici ayrıcalıklarına sahip olmadığım için böyle bir komutu çalıştıramıyorum .

Bir şey koyabilir .bashrcveya zshgeçici bir çözüm olarak açıldığında otomatik olarak çağıran bir şey koyabilir miyim ?

Netleştirmek zshiçin zaten yüklü.


2
Evet, tıpkı eklemek zshüzerine .bashrcdosyaya. Çıkış ve giriş ve bitti!
fedorqui

Bunun için üzgünüm. Ama soruyu bitirmek için, sadece zshilk sıraya koydum ?

3
.Bashrc içine zsh yerleştirilmesi bash, açıkça çağrıldığında bile daima çalıştırılmasını sağlar . .bash_profileBunun yerine daha iyi yerleştirin .
konsolebox

Zsh'yi terminal tercihlerinde varsayılan kabuk olarak ayarlayabilirsiniz (yeni bir profil oluşturun).
lmaooooo

Yanıtlar:


68

Oluşturmak .bash_profileev dizininde ve şu satırları ekleyin:

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

Güncelleme: .profilevarsayılan kabuk bash olmadığı zaman genel bir çözüm olarak çalışabilir. .profileZsh tarafından gereksiz hale gelebileceği gibi çağrılıp çağrılmayacağından emin değilim , ancak basit bir kontrolle güvenle yapabiliriz:

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

Değerine dayanan whichdinamik yolu almak için de kullanabiliriz :zsh$PATH

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

Bir Linux yöneticisi (root) varsayılan kabuğunuzu bash (ama zsh değil) dışındaki bir şeyle değiştirirse, örneğin ksh? O .bash_profilezaman referans alınmayacak. .profileBunun yerine bunu koymak nasıl ?
Joshua Huber

@JoshuaHuber Yaptığım son test .profileişe yaramadı. Ayrıca .profiletarafından aranmaz Zshmıydı? Gereksiz gidebilir. Bunu henüz kontrol etmedim. (Güncelleme: İşe yaradı, daha önce hangi hatayı yaptığımdan emin değilim.) Kullanmanın olası sakıncaları hakkında düşünceleriniz var .profilemı?
konsolebox

1
@konsolebox Bash sadece kaynaklar .profileise .bash_profile(el onu kaynak sürece yok .bash_profileelbette). Özellikle, dosyaların bash kaynakları ilki [ .bash_profile> .bash_login> .profile] bulduğu. Sadece .profilebir POSIX (Bourne kabuğu) uyumluluk özelliği arar .
pyrocrasty,

@ pyrocrasty Gerçekten. Kılavuzda belirtildiği gibi: "Bu dosyayı okuduktan sonra, bu sırada ~ / .bash_profile, ~ / .bash_login ve ~ / .profile ifadelerini arar ve var olan ve okunabilen ilk komuttan komutları okur ve yürütür ."
konsolebox

Bu yeni bir terminali profili kurmak için çalıştı benim kabuk yerine Çalıştır özel komuta değiştirildi zsh. .bash_profileve .profileişe yaramadı (dosyalar bile yürütülmedi, bir üniversite bilgisayarında Fedora 26).
lmaooooo

12

Normalde chshroot olmayan bir kullanıcı olarak kullanabilirsiniz . Ancak, genellikle NIS ve LDAP gibi bir tür ağ bağlantılı kullanıcı veritabanı kullanan sitelerde zaman zaman devre dışı bırakılır. Bunun yerine bir ypchsh(NIS) veya chsh.ldap(LDAP) olabilir.

chshayrıca genellikle yalnızca bazı onaylanmış mermilere, tipik olarak listelenmiş mermilere izin verir /etc/shells.

chshSitenizdeki varyantlarını veya türevlerini kullanamıyorsanız , giriş kabuğunuzu execfavori kabuğunuza ayarlayın ve SHELLdeğişkeni favori kabuğunuza işaret edecek şekilde ayarlayın .

  • Giriş kabuğu ise sh, dashya ksh: Düzenlemek için gereken dosyadır ~/.profile. Bu dosyanın etkileşimli bir oturumun başlangıcında ve bazı etkileşimli olmayan oturum başlatma komut dosyaları (örneğin, X11 oturumları için) tarafından okunmasına dikkat edin, bu nedenle dikkat etmeniz gerekir: execgeçerli olduğunda kabuk etkileşimlidir. Bourne kabuğu hariç ( /bin/shSolaris 10 ve öncesi), kabuğun iseçenek listesindeki ( $-) varlığıyla etkileşimli olduğunu söyleyebilirsiniz .

    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

    Zsh'inizi okumasını istiyorsanız .zprofile, -lseçeneği işaretleyin.

  • Giriş kabuğunuz varsa, bashyukarıdaki gibi devam edebilirsiniz. Alternatif olarak, bu komutları girebilirsiniz ~/.bash_profile. Çoğu oturum başlatma komut dosyası yalnızca okunur ~/.profileve okunmaz ~/.bash_profile, ancak bash altında çalışan ve okunan bazı yazılar gördüm .bash_profile, bu nedenle orada bile execetkileşimli olmayan bir kabukta çağrı yapmamaya dikkat edin .

  • Giriş kabuğunuz csh veya tcsh ise, chsh veya yönetici ayrıcalıkları olmadan varsayılan kabuğu değiştirme konusunda bir örneğe bakın


1

Bu emrin bu chshamaç için olduğuna inanıyorum . Yine de her Linux / Unix dağıtımının bunu desteklediğinden emin değilim. Man sayfasını kontrol edin chsh.


Bazı sistemlerde de var passwd -s.
Stéphane Chazelas 18:15

1

Çalıştırmak yapamıyorsanız chshyönetici ayrıcalıklarına sahip olmadığından, yapar birisiyle konuşmak .

Büyük olasılıkla chshroot olmayan bir sistem olarak kullanamazsınız , çünkü kullandığınız sistem chsh, örneğin sistem yalnızca /etc/passwddosya yerine NIS veya LDAP kullandığı için çalışamayacak şekilde yapılandırılmıştır . Belki de sisteminizin yöneticisi sadece biraz kontrol sağlamak istiyor.

Kabuğunuzu değiştirme prosedürü kuruluşunuzun politikalarına bağlıdır. chshNormalde yapılanları yapan yerel bir komut olabilir . Veya bir kabuk değişikliği talep eden bir destek bileti göndermeniz gerekebilir.

Diğer cevapların çoğu iyidir, ancak yöneticileriniz makul şekilde yanıt veriyorsa, başlangıç ​​komut dosyalarınızı çiğnemekle uğraşmak istemeyebilirsiniz. Muhtemelen zsh -lgiriş yaptıktan sonra yönetici hesabımı güncellemeye gelene kadar manuel olarak çağırırdım.

Akılda tutulması gereken başka bir şey: Bazen farklı mermiler aynı başlangıç ​​dosyalarını kullanabilir. Örneğin, shve bashyürütebileceği hem $HOME/.profileve cshve tcshyürütebileceği hem $HOME/.loginve $HOME/.cshrc(gerçi gibi kabuk özgü başlatma dosyaları .bashrc, .bash_profileve .tcshrcgeçersiz kılabilir). Varsayılan kabuğunuz /bin/cshbuysa ve kullanmak istiyorsanız /bin/tcsh, .loginçağırmanızın güncellenmesi /bin/tcsh -lsonsuz bir döngü oluşturabilir. belirli başlangıç ​​dosyalarını zshyürütmek için olmaz bash, bu yüzden bu sizin için bir sorun değildir.

Çoğu kabukları Eğer (çalıştırıyorsanız kabuk tespit değişkenleri ayarlamak $BASH_VERSION, $tcsh, $ZSH_VERSION). Tercih ettiğiniz kabuğunuzu çağırmak için başlangıç ​​kodunu yazacaksanız, onu içine almak kötü bir fikir değildir, bu ifnedenle yalnızca bu kabuğu çalıştırmıyorsanız çalıştırılır. Konsolebox'un cevabındaki kodu kullanarak :

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

(Eklemenin karmaşıklığı, "${ZSH_VERSION:-unset}"yalnızca "$ZSH_VERSION"yapma ihtimalinize, set -o unsettanımsız bir değişkene referans verilmesine neden olan bir seçeneğin bir hata olmasına izin verir.)


1

Birkaç senaryo düşünebilirim.

  1. zshdeğil /etc/shells, ve OP yazmak zorunda kalmadan bunu kullanmak istediği zshkomut isteminde. Olası çözümler.

    a) oturum açma sırasında uygulamak için profil hileleri kullanın. Bu, kabuğu değiştirmek kadar etkilidir.

    b) eklemek için yönetici dilenmek zshiçin /etc/shellsböylece yapabilirsiniz chshkendisine

    c) kabuğunuzu değiştirmek için yöneticiye yalvarın. Bu akıllıca değildir, çünkü size içeri girme kabiliyetinizi kaybedecektir ftp. Sadece ftpiçinde bir kabuğunuz varsa kullanabilirsiniz ./etc/shells

  2. kullanıcı, büyük olasılıkla rbashveya kısıtlı bir kabuktan kaçmak ister rsh.

    Eğer .profiledüzenlenebilir, PATHdüzenleyerek genişletilebilir. /binYolun bashiçine girdikten sonra , mermileri değiştirmenize izin rsh/rbashveren chshkomuta erişerek içeriden başlayabilirsiniz . Birçok komut, sınırlı bir kabuktan kaçmak ve tekrar erişim kazanmak için kullanılabilen kabuk çıkışlarına sahiptir chsh.

  3. chshgerçekten başka bir nedenden dolayı çalışmıyor. olasılık 1'den çözüm a da burada bir cevaptır.

2. senaryo, varsayılan kabuğu değiştirmenin tek nedenidir (çok kısıtlayıcıdır).


-3

Verilen cevabın aslında zshvarsayılan kabuğu çıkardığını sanmıyorum . Basit, kullanıcı kendi varsayılan kabuğuna giriş yaptığı anda kabuğu zsh olarak değiştirir . Kullanıcı hala giriş yapacak DEFAULT SHELLama bununla birlikte kabuk değişecekzsh

Varsayılan kabuk kullanımını değiştirmek için:

usermod -s /path/to/shell username 

Bunu yapmak için kök olmalısın.

Aksi takdirde, yukarıdaki geçici çözüm kullanışlı olacaktır.

Yorumdan eklendi

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

ve kullanıcı tarafından kendisi için çağrılabilir.


4
Soru oldukça açık bir şekilde, sistem kullanıcı veritabanını değiştirmenin (bu cevapta yapmanız gereken kök) bir seçenek olmadığını belirtir.
Caleb,

3
chsh -s /path/to/zshdaha standart ve genellikle (ancak her zaman değil), usermodher zaman yaptığından farklı olarak kök erişimi gerektirmez . Bu nedenle, cevabınız, sorunun çalışılmadığını belirttiğinden daha fazla soruna sahip.
Gilles 'SO- kötülük olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.