Wie kann ich Bash als Anmeldeshell verwenden, wenn mein Sysadmin es ablehnt, dass ich es ändere?

38

Der Unix-Systemadministrator, unter dem ich arbeite, scheut sich, mir den Zugriff zu gewähren, um meine Anmeldeshell von kshauf zu ändern bash. Er hat verschiedene Ausreden vorgebracht, die lustigste ist, dass sie, da sie alle ihre Skripte schreiben, kshnicht funktionieren, wenn ich versuche, sie auszuführen. Ich weiß nicht, woher er diese Ideen hat, aber da ich ihn nicht überzeugen kann, gibt es eine Alternative, die ich habe?

( chshIst auf diesen Computern installiert, aber wir verwenden öffentliche / private Schlüsselpaare für die Anmeldung. Ich habe kein Kennwort. Wenn chshich zur Eingabe eines Kennworts aufgefordert werde, kann ich es nicht weitergeben.)

Bilderstürmer
quelle

Antworten:

69

Wenn Sie sich einloggen, wird die Datei ~/.profilevon der Login-Shell (ksh für Sie) gelesen. Sie können diese Anmeldeshell anweisen, sich selbst durch Bash zu ersetzen. Sie sollten einige Vorsichtsmaßnahmen treffen:

  • Ersetzen Sie die Anmeldeshell nur, wenn sie interaktiv ist. Dies ist wichtig: Andernfalls funktioniert die Anmeldung im Grafikmodus möglicherweise nicht (dies ist systemabhängig: Einige, aber nicht alle Systeme, die ~/.profilebeim Anmelden über xdm oder ähnliches gelesen werden ), und Redewendungen wie schlagen ssh foo '. ~/.profile; mycommand'fehl.
  • Stellen Sie sicher, dass bash verfügbar ist, damit Sie sich trotzdem anmelden können, wenn die ausführbare Datei aus irgendeinem Grund nicht vorhanden ist.

Sie haben die Wahl, ob Sie bash als Login-Shell ausführen möchten oder nicht. Der einzige große Unterschied bei der Erstellung einer Login-Shell ist, dass sie geladen wird ~/.bash_profileoder ~/.profile. Wenn Sie also bash als Login-Shell ~/.bash_profileausführen , achten Sie darauf, dass a nicht rekursiv ausgeführt wird ~/.profile. Es gibt keinen wirklichen Vorteil, ~/.profiledurch Bash statt durch Ksh ausgeführt zu werden, daher würde ich empfehlen, dies nicht zu tun.

Setzen Sie außerdem die SHELLUmgebungsvariable auf bash, damit Programme wie Terminalemulatoren diese Shell aufrufen.

Hier ist der Code, um zu bash zu wechseln. Setzen Sie es am Ende von ~/.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
Gilles 'SO - hör auf böse zu sein'
quelle
17
Hervorragende Antwort! stackexchange benötigt die Schaltfläche " Send A Beer" (Ein Bier senden) .
Bilderstürmer
Danke erstmal und. .profileFunktioniert nur für Login-Shell (als OP nötig). Ich benutze die Remotedesktopverbindung von Windows 10, um mich auf einer Linux-Workstation anzumelden, und öffne dann Terminal in gnome. Ich will, zshwährend mein Sysadmin mir gibt bash. In diesem Fall muss ich das Snippet .bashrcanstelle von hinzufügen .profile.
Wochenende
12

Dies ist ein wenig klug, aber Sie können dazu führen bash, dass Sie die Shell verwenden, wenn Sie sich anmelden, indem Sie eine .profileDatei in Ihrem Home-Verzeichnis erstellen, die Folgendes enthält

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

Dadurch wird die kshSitzung durch eine bashSitzung ersetzt. Sie müssen nicht zweimal exit(oder ^D) basheingeben , wie Sie es tun würden, wenn Sie jedes Mal, wenn Sie sich anmelden, manuell eine neue Sitzung starten würden

echo $SHELL

wird sogar den Pfad zurückgeben zu bash.

Bilderstürmer
quelle
3
Sie können $ SHELL natürlich ziemlich einfach ändern, indem Sie vor dem exec eine Zeile hinzufügen.
Derobert
2
Wenn Sie möchten, dass die neue Shell auch eine Anmeldeshell ist, sollten Sie dies wahrscheinlich tun exec bash -l.
JW013
1
Ein letzter Kommentar: typewird über empfohlenwhich .
JW013
1
Ich verstehe es nicht! Wird nicht bashauch gelesen, .profilewodurch eine Endlosschleife erzeugt wird? Ich bin damit einverstanden, dass etwas in etwa das exec bashist, was Sie wollen, aber Sie müssen sicherstellen, dass Sie es nur bei Ihrem Login tun, ksh, so dass einige if-Anweisungen erforderlich sind!
Bananguin
1
@ user1129682 nicht wenn da ist ~/.bash_profileoder~/.bash_login
Ulrich Dangel
4

Bei der Antwort von Giles sollte das Flag -l hinzugefügt werden, wenn Bash ausgeführt wird, damit alle Anmeldeprofilskripte in der neuen Bash-Shell abgelegt werden. (Zum Beispiel alles in /etc/profile.d/ auf RHEL). Das Skript sollte dann sein:

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
rleelr
quelle
Können Sie erklären, warum Sie die -lOption hinzufügen ? Ich benutze dies seit Monaten ohne es ohne Probleme.
Koksud
1

Eine Antwort für csh/tcshinspiriert von der Top-Bewertung von @Gilles ist

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

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

Solaris:

usermod -s /bin/bash root
hienbuithanh88
quelle
1
Benötigt der Benutzer keine Administratorrechte und die Frage lautet "... wenn mein Administrator dies ablehnt ..."?
Blessed Geek