Ustawienie domyślnej powłoki zsh bez dostępu root


52

Korzystam z komputerów w mojej szkole i chciałbym ich używać zshzamiast bash. Chciałbym ustawić ją jako domyślną powłokę, ale nie mogę uruchomić polecenia, na przykład $ chsh -s $(which zsh)dlatego, że nie mam uprawnień administratora.

Czy istnieje sposób, w jaki mogę umieścić coś w sobie .bashrclub coś, co automatycznie wywołuje, zshgdy otworzy się to jako obejście?

Aby wyjaśnić, zshjest już zainstalowany.


2
Tak, wystarczy dodać zshw .bashrcpliku. Wyloguj się i zaloguj i gotowe!
fedorqui

Przepraszam za to. Ale aby zakończyć pytanie, po prostu postawiłem zshpierwszy wiersz?

3
Umieszczenie zsh w .bashrc sprawi, że będzie ono zawsze wykonywane, nawet jeśli bashzostanie wywołane jawnie. Lepiej umieść to w .bash_profilezamian.
konsolebox

Możesz ustawić zsh jako domyślną powłokę w preferencjach terminalu (utwórz nowy profil).
lmaooooo,

Odpowiedzi:


68

Utwórz .bash_profilew swoim katalogu domowym i dodaj następujące wiersze:

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

Aktualizacja: .profilemoże działać jako ogólne rozwiązanie, gdy domyślną powłoką nie jest bash. Nie jestem pewien, czy .profileZsh może go również wezwać, że może stać się zbędny, ale możemy to zrobić bezpiecznie za pomocą prostej kontroli:

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

Możemy również użyć, whichaby uzyskać ścieżkę dynamiczną, zshktórej wartość zależy od $PATH:

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

Co jeśli administrator Linuksa (root) zmieni domyślną powłokę na inną niż bash (ale nie zsh), na przykład ksh? W takim .bash_profileprzypadku nie można się do niego odwoływać. Co powiesz na to .profilezamiast tego?
Joshua Huber

@JoshuaHuber Ostatni test, który zrobiłem, .profilenie zadziałał. Nie .profilezadzwoniłby też Zsh? To może stać się zbędne. Jeszcze tego nie sprawdziłem. (Aktualizacja: Teraz działało, nie jestem pewien, jaki błąd popełniłem wcześniej.) Czy są jakieś przemyślenia na temat możliwych wad używania .profile?
konsolebox

1
@konsolebox Bash pobiera źródła tylko .profilewtedy, .bash_profilegdy nie istnieje (chyba że ręcznie je źródłeś .bash_profile, oczywiście). Konkretnie, źródła bash pierwszy plików [ .bash_profile> .bash_login> .profile] znajdzie. Wygląda tylko na .profilefunkcję zgodności z POSIX (powłoką Bourne'a).
pirokrastyka

@pyrocrasty Rzeczywiście. Tak jak powiedziano w instrukcji: „Po odczytaniu tego pliku szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności, i odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny . ”
konsolebox

Działało, aby skonfigurować nowy profil terminala za pomocą polecenia Uruchom niestandardowe zamiast mojej powłoki zmienionej na zsh. .bash_profilei .profilenie działało (pliki nawet nie zostały wykonane, Fedora 26 na komputerze uniwersyteckim).
lmaooooo

12

Zwykle możesz używać go chshjako użytkownik inny niż root. Ale czasami jest wyłączana, zwykle w witrynach korzystających z jakiejś formy sieciowej bazy danych użytkowników, takich jak NIS i LDAP. Zamiast tego może występować ypchsh(NIS) lub chsh.ldap(LDAP).

chshzazwyczaj zezwalają tylko na niektóre zatwierdzone powłoki, zazwyczaj te wymienione w /etc/shells.

Jeśli nie możesz używać chshlub jego wariantów na swojej stronie, execustaw swoją powłokę logowania w swojej ulubionej powłoce i ustaw SHELLzmienną tak, aby wskazywała twoją ulubioną powłokę.

  • Jeśli Twój login shell jest sh, dashalbo ksh: plik trzeba edytować to ~/.profile. Uważaj, aby ten plik był czytany na początku sesji interaktywnej, a także przez niektóre nieinteraktywne skrypty uruchamiania sesji (np. Dla sesji X11), więc musisz uważać: wywoływać exec(zastępuje bieżący proces), gdy bieżący powłoka jest interaktywna. Z wyjątkiem powłoki Bourne'a ( /bin/shSolaris 10 i wcześniejszych), można stwierdzić, że powłoka jest interaktywna dzięki obecności ina liście opcji ( $-).

    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
    

    Jeśli chcesz, aby zsh Cię przeczytał .zprofile, podaj tę -lopcję.

  • Jeśli twoja powłoka logowania jest bash, możesz postępować jak wyżej. Alternatywnie możesz wprowadzić te polecenia ~/.bash_profile. Większość skryptów uruchamiania sesji tylko czyta ~/.profilei nie ~/.bash_profile, ale widziałem niektóre, które działają w trybie bash i read .bash_profile, więc nawet tam powinieneś uważać, aby nie wywoływać execpowłoki nieinteraktywnej.

  • Jeśli twoja powłoka logowania to csh lub tcsh, zobacz przykład w Zmiana domyślnej powłoki bez uprawnień chsh lub administratora


1

Wierzę, że polecenie chshjest właśnie w tym celu. Chociaż nie jestem pewien, czy każda dystrybucja Linux / Unix to obsługuje. Sprawdź stronę podręcznika użytkownika chsh.


Niektóre systemy też to mają passwd -s.
Stéphane Chazelas,

1

Jeśli nie możesz uruchomić, chshponieważ nie masz uprawnień administratora, porozmawiaj z kimś, kto ma uprawnienia .

Najprawdopodobniej nie można użyć go chshjako użytkownika innego niż root, ponieważ używany system jest skonfigurowany tak, chshaby nie działał, na przykład ponieważ system używa NIS lub LDAP, a nie tylko /etc/passwdpliku. A może administrator twojego systemu chce po prostu zachować kontrolę.

Procedura zmiany powłoki zależy od zasad organizacji. Może istnieć polecenie lokalne, które robi to, co chshzwykle. Lub może być konieczne przesłanie zgłoszenia do pomocy technicznej z prośbą o zmianę powłoki.

Większość pozostałych odpowiedzi jest dobra, ale jeśli administratorzy reagują dość szybko, możesz nie chcieć kłopotać się włamywaniem skryptów startowych. Prawdopodobnie zsh -lpo zalogowaniu wywołam ręcznie, dopóki administrator nie zacznie aktualizować mojego konta.

Kolejna rzecz, o której należy pamiętać: czasami różne powłoki mogą korzystać z tych samych plików startowych. Na przykład, sha bashmoże obie wykonać $HOME/.profile, a cshi tcshmoże zarówno wykonać $HOME/.logini $HOME/.cshrc(choć powłoka specyficzne pliki startowe, takie jak .bashrc, .bash_profilei .tcshrcmoże zastąpić tych). Jeśli twoją domyślną powłoką jest /bin/cshi chcesz użyć /bin/tcsh, zaktualizowanie twojego .logininvoke /bin/tcsh -lmoże stworzyć nieskończoną pętlę. zshnie zdarza się bashuruchamiać plików startowych specyficznych dla użytkownika, więc nie stanowi to problemu.

Większość muszle ustawić zmienne, które identyfikują który Shell używasz ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Jeśli zamierzasz napisać kod startowy, aby wywołać preferowaną powłokę, nie jest złym pomysłem, aby umieścić go w iftak, aby był wykonywany tylko wtedy, gdy nie korzystasz już z tej powłoki. Za pomocą kodu z odpowiedzi konsoli konsolebox :

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

(Dodana komplikacja sprawdzania "${ZSH_VERSION:-unset}"zamiast tylko "$ZSH_VERSION"pozwala na to, że już to zrobiłeś set -o unset, opcję, która powoduje, że odwołanie do niezdefiniowanej zmiennej jest błędem).


1

Mogę wymyślić kilka scenariuszy.

  1. zshnie jest włączony /etc/shells, a OP chce go używać bez konieczności wpisywania zshw wierszu polecenia. Możliwe rozwiązania.

    a) użyj sztuczek profilowych, aby wykonać go podczas logowania. Jest to tak samo skuteczne, jak zmiana powłoki.

    b) prosić administratora, aby dodać zshdo /etc/shellstak można chshgo do

    c) błagaj administratora, aby zmienił twoją powłokę. nie jest to mądre, ponieważ spowoduje to utratę możliwości wejścia ftp. Możesz użyć tylko, ftpjeśli masz w sobie powłokę/etc/shells

  2. użytkownik chce uciec przed ograniczoną powłoką, najprawdopodobniej rbashlub rsh.

    Jeśli .profilemożna edytować, PATHmożna go rozwinąć, edytując. Gdy znajdziesz /binsię na ścieżce, możesz zacząć bashod środka rsh/rbash, uzyskując dostęp do chshpolecenia umożliwiającego zmianę powłok. Wiele poleceń ma znaki ucieczki powłoki, których można użyć do ucieczki z ograniczonej powłoki i odzyskania dostępu chsh.

  3. chshnaprawdę nie działa z innego powodu. rozwiązanie z możliwości 1 również jest tutaj odpowiedzią.

Scenariusz 2 jest jedynym powodem do zmiany domyślnej powłoki (jest zbyt restrykcyjna).


-3

Nie sądzę, że podana odpowiedź faktycznie tworzy zshdomyślną powłokę. Po prostu zmienia powłokę na zsh, gdy tylko użytkownik zaloguje się do swojej domyślnej powłoki . Użytkownik nadal będzie się logować do niego, DEFAULT SHELLale dzięki temu powłoka zmieni się nazsh

Aby zmienić domyślną powłokę użyj:

usermod -s /path/to/shell username 

Powinieneś być rootem, aby to zrobić.

W przeciwnym razie powyższe obejście się przyda.

Dodano z komentarza

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

i może być przywołany przez użytkownika dla niego samego.


4
Pytanie dość wyraźnie stwierdza, że ​​modyfikacja bazy danych użytkowników systemu (bit, który musisz zrobić root w tej odpowiedzi) nie jest opcją.
Caleb

3
chsh -s /path/to/zshjest bardziej standardowy i zwykle (ale nie zawsze) nie wymaga dostępu do roota, w przeciwieństwie do tego, usermodco zawsze. Więc twoja odpowiedź ma więcej problemów niż to, co w pytaniu już nie działa.
Gilles „SO- przestań być zły”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.