jak mogę użyć bash jako mojej powłoki logowania, gdy mój administrator nie chce mi go zmienić


38

Administrator systemu unix, w którym pracuję, niechętnie daje mi dostęp do zmiany powłoki logowania z kshna bash. Podawał różne wymówki, najśmieszniejsze jest to, że skoro piszą wszystkie swoje skrypty, bo kshnie będą działać, jeśli spróbuję je uruchomić. Nie wiem, skąd bierze te pomysły, ale skoro nie mogę go przekonać, czy jest jakaś alternatywa, którą mam?

( chshjest zainstalowany na tych komputerach, ale do logowania używamy kluczy publicznych / prywatnych, a ja nie mam hasła, więc kiedy pojawia się chshmonit o hasło, nie mam nic do podania).

Odpowiedzi:


69

Po zalogowaniu plik ~/.profilejest odczytywany przez powłokę logowania (ksh dla ciebie). Możesz poinstruować tę powłokę logowania, aby zastąpiła się bash. Powinieneś podjąć pewne środki ostrożności:

  • Wymień powłokę logowania tylko, jeśli jest interaktywna. Jest to ważne: w przeciwnym razie logowanie w trybie graficznym może nie działać (jest to zależne od systemu: niektóre, ale nie wszystkie systemy czytają ~/.profilepodczas logowania przez xdm lub podobny), a idiomy takie jak ssh foo '. ~/.profile; mycommand'nie powiedzie się.
  • Sprawdź, czy bash jest dostępny, abyś mógł nadal się logować, jeśli z jakiegoś powodu nie ma pliku wykonywalnego.

Masz wybór, czy uruchomić bash jako powłokę logowania, czy nie. Jedyną zasadniczą różnicą w tworzeniu powłoki logowania jest to, że się załaduje ~/.bash_profilelub ~/.profile. Więc jeśli uruchamiasz bash jako powłokę logowania, bądź bardzo ostrożny, aby mieć ~/.bash_profilelub staraj się nie uruchamiać bash rekurencyjnie ~/.profile. Nie ma żadnej realnej korzyści z ~/.profilewykonania przez bash zamiast ksh, więc polecam nie robić tego.

Ustaw także SHELLzmienną środowiskową na bash, aby programy takie jak emulatory terminali wywoływały tę powłokę.

Oto kod, aby przełączyć się na bash. Połóż to na końcu ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
Doskonała odpowiedź! stackexchange potrzebuje przycisku Send A Beer : to byłby czas, gdybym go użył.
iconoclast

Dzięki najpierw i. .profiledziała tylko w przypadku powłoki logowania (w razie potrzeby OP). Korzystam z połączenia pulpitu zdalnego systemu Windows 10, aby zalogować się do stacji roboczej Linux, a następnie otworzyć terminal w gnome. Chcę, zshdopóki mój sysadmin mi da bash. W takim przypadku muszę dodać fragment .bashrczamiast .profile.
Weekend

12

Jest to trochę kludgey, ale możesz spowodować, bashże będziesz powłoką, której używasz podczas logowania, tworząc .profileplik w katalogu domowym, zawierający

SHELL=`type -P bash`
exec bash -l

Spowoduje to, że kshsesja zostanie zastąpiona bashsesją. Nie będziesz musiał wpisywać exit(lub ^D) dwa razy, tak jak w przypadku ręcznego rozpoczynania nowej bashsesji przy każdym logowaniu. I pisanie

echo $SHELL

zwróci nawet ścieżkę do bash.


3
możesz oczywiście zmienić $ SHELL dość łatwo, dodając linię, aby to zrobić przed exec.
derobert

2
Jeśli chcesz, aby nowa powłoka była również powłoką logowania, prawdopodobnie powinieneś exec bash -l.
jw013,

1
Ostatni komentarz: typejest zalecany zamiast which.
jw013,

1
Nie rozumiem Czy bashodczyt również nie .profilewygeneruje nieskończonej pętli? Zgadzam się, że coś jest zgodne z exec bashtym, czego chcesz, ale musisz upewnić się, że robisz to tylko dla swojego loginu ksh, więc niektóre instrukcje if są wymagane!
Bananguin,

1
@ user1129682 nie, jeśli istnieje ~/.bash_profilelub~/.bash_login
Ulrich Dangel

4

Do odpowiedzi Gilesa należy dodać flagę -l podczas wykonywania bash, aby wszelkie skrypty profilu logowania były pozyskiwane w nowej powłoce bash. (Na przykład wszystko w /etc/profile.d/ na RHEL). Skrypt powinien wtedy być:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

Czy możesz wyjaśnić, dlaczego chcesz dodać tę -lopcję? Używam tego od miesięcy bez tego bez żadnych problemów.
Cokedude

1

Odpowiedź na csh/tcshzainspirowaną jedną z najlepszych głosowanych przez @Gilles jest

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

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.