Scegli la shell utilizzata da SSH?


31

Come posso impostare la shell che viene utilizzata quando un utente SSH su un server. Ad esempio, non posso sopportare BASH e devo usare ZSH, come posso farlo in modo che ZSH sia caricato insieme al mio profilo ( .zsh_profile) quando ssh sulla macchina.

Non voglio nemmeno passare un sacco di parametri con ssh, non posso impostare la shell predefinita?

Risposte:


34

Supponendo che tu stia funzionando su Linux, puoi usare il chshcomando.

chsh -s /bin/ksh foo
chsh -s /bin/bash username

4
Si noti che il percorso del binario deve essere attivo /etc/shellsaffinché la shell sia selezionabile.
Kimvais,

Ubuntu 16.04 non ha questo comando.
david.perez,

@ david.perez Sì lo fa, nel il passwdpacchetto .
dessert

Questo non funziona quando l'autenticazione viene gestita tramite LDAP
Daniel Kats,

10

man chsh cambia shell, non sempre funziona

In alternativa, puoi inserire il exec /bin/zshtuo script di accesso bash.Questo sostituirà l'istanza bash con la tua shell.

Oppure puoi farlo ssh host "zsh -l"


Perché il -1 (15 caratteri ...)?
Noufal Ibrahim,

quello è un minuscoloL
driftcatcher

1
ssh -tè richiesto per ottenere un TTY per le ultime opzioni. Per impostazione predefinita, se zsh -lviene fornito un comando (come ), OpenSSH eseguirà una shell non di accesso, che non allocherebbe TTY per te, e -lnon lo cambierà (perché viene eseguito dopo l'accesso).
Franklin Yu,

8

Modifica / etc / passwd (se disponi dei diritti o chiedi al tuo amministratore di sistema) di cambiare la shell predefinita.


Per qualche ragione gli utenti che ho creato di recente non avevano una shell predefinita. Questo ha funzionato per me. Grazie.
mimoralea,

2
Grazie questa risposta è fantastica. Non avevo nemmeno un guscio qui. Ho trovato la riga myusername: x: 1000: 1000 :: / home / myusername: e aggiunto / bin / bash alla fine. Esci ed entra e la mia sessione ssh sta usando bash :)
Stewart Evans,

6

Se non riesci a modificare la shell predefinita, ssh -t user@host 'zsh -l'funziona.

La -tbandiera forza un'allocazione pseudo-tty e la -lbandiera genera una shell di login .


4

Non sono sicuro di come puoi mettere il tuo locale .zshrc sul server remoto, (cioè senza memorizzarlo permanentemente lì), questo funziona per me per cambiare la mia shell di accesso sul server remoto.

Dal momento che è un account condiviso, posso usare zshsolo per me stesso con questo metodo.

Aggiungi questo al tuo ~/.ssh/configfile nel tuo computer locale.

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

Potrebbe esserci un modo hacker per realizzare ciò che stai cercando, come di seguito.

ATTENZIONE Questo non ha garanzie e non sembra "saggio", tuttavia sono riuscito a mettere il mio file locale sul server e a utilizzarlo nella shell di login usando questo.

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

Come funziona?

  • RemoteCommand definisce ciò che deve essere eseguito sul lato remoto.
  • LocalCommanddefinisce ciò che deve essere eseguito su local, che viene utilizzato per copiare il file locale sul server remoto per acquistarlo. Ecco il problema, succede solo dopo una connessione "riuscita" all'host remoto.

Significato:

  1. La tua connessione al telecomando dovrebbe essere aperta e attiva
  2. La tua shell remota non ha ancora il file, quindi deve aspettare che il file sia lì, ergo sleep
  3. Il tuo locale usa sftpper mettere il tuo file sul server remoto, il server remoto si risveglia sleepe genera i tuoi script.

È super hacker, mi piacerebbe sapere se esiste anche un modo migliore.

Aggiornamento: può essere utilizzato al posto del tempo di sospensione "lungo":
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

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.