come posso usare bash come shell di login quando il mio amministratore di sistema rifiuta di farmi cambiare


38

Il sysadmin unix in cui sto lavorando è riluttante a darmi l'accesso per cambiare la mia shell di login da ksha bash. Ha dato varie scuse, la più divertente è che dal momento che scrivono tutti i loro script kshperché non funzioneranno se provo a eseguirli. Non so dove ottenga queste idee, ma dal momento che non riesco a convincerlo, c'è qualche alternativa che ho?

( chshè installato su queste macchine, ma per il login utilizziamo le coppie di chiavi pubbliche / private e non ho alcuna password, quindi quando chshmi viene richiesta una password non ho nulla da darle.)

Risposte:


69

Quando accedi, il file ~/.profileviene letto dalla shell di accesso (ksh per te). Puoi indicare a quella shell di login di sostituirsi con bash. Dovresti prendere alcune precauzioni:

  • Sostituisci la shell di accesso solo se è interattiva. Questo è importante: in caso contrario, l'accesso in modalità grafica potrebbe non funzionare (dipende dal sistema: alcuni ma non tutti i sistemi leggono ~/.profilequando si accede tramite xdm o simili) e modi di dire come ssh foo '. ~/.profile; mycommand'falliranno.
  • Controlla che bash sia disponibile, in modo da poter ancora accedere se l'eseguibile non è lì per qualche motivo.

Puoi scegliere se eseguire bash come shell di login o meno. L'unica grande differenza nel renderlo una shell di accesso è che verrà caricato ~/.bash_profileo ~/.profile. Quindi, se esegui bash come shell di login, fai molta attenzione a non avere ~/.bash_profileo fai attenzione a non eseguire bash in modo ricorsivo ~/.profile. Non c'è alcun vantaggio reale di aver ~/.profileeseguito da bash piuttosto che da ksh, quindi consiglierei di non farlo.

Imposta anche la SHELLvariabile d'ambiente su bash, in modo che programmi come gli emulatori di terminale invochino quella shell.

Ecco il codice per passare a bash. Mettilo alla fine di ~/.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
Risposta eccellente! stackexchange ha bisogno di un pulsante Invia una birra : questa sarebbe una volta che lo userei .
iconoclasta,

Grazie prima e. .profileFunziona solo per la shell di accesso (in base alle necessità dell'OP). Uso Connessione desktop remoto di Windows 10 per accedere a una workstation Linux, quindi apro Terminal in gnome. Voglio zshmentre il mio amministratore di sistema mi dà bash. In questo caso, devo aggiungere lo snippet .bashrcinvece di .profile.
Weekend

12

Questo è leggermente kludgey, ma puoi bashessere la shell che stai usando al momento del login creando un .profilefile nella tua home directory, contenente

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

Ciò causerà la kshsostituzione della sessione con una bashsessione. Non dovrai digitare exit(o ^D) due volte, come faresti se avessi avviato manualmente una nuova bashsessione ogni volta che accedi. E digitando

echo $SHELL

restituirà anche il percorso a bash.


3
puoi ovviamente cambiare $ SHELL abbastanza facilmente aggiungendo una riga per farlo prima del exec.
derobert,

2
Se vuoi che anche la nuova shell sia una shell di accesso, probabilmente dovresti exec bash -l.
jw013,

1
Un ultimo commento: typeè consigliato sopra which.
jw013,

1
Non capisco! Non bashleggerai anche .profilegenerando così un ciclo infinito? Sono d'accordo che qualcosa sulla falsariga di exec bashè quello che vuoi, ma devi assicurarti di farlo solo per il tuo login ksh quindi sono necessarie alcune istruzioni if!
Bananguin,

1
@ user1129682 non se c'è ~/.bash_profileo~/.bash_login
Ulrich Dangel il

4

Alla risposta di Giles dovrebbe essere aggiunto il flag -l quando si esegue bash, in modo che tutti gli script del profilo di accesso vengano forniti nella nuova shell bash. (Ad esempio qualsiasi cosa in /etc/profile.d/ su RHEL). Lo script dovrebbe quindi essere:

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

Puoi spiegare perché dici di aggiungere l' -lopzione? Lo uso da mesi senza di esso senza problemi.
cokedude,

1

È una risposta csh/tcshispirata al migliore votato da @Gilles

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

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

0

Solaris:

usermod -s /bin/bash root

1
Usermod non richiede diritti di amministratore e la domanda è "... quando il mio amministratore rifiuta ..."?
Beato Geek il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.