Come utilizzare una shell di accesso non predefinita per l'accesso ssh


9

Attualmente sto lavorando in una rete che utilizza LDAP per l'autenticazione. Avendo impostato zshcome shell di login, ho sshriscontrato un problema di accesso remoto a una delle macchine della rete che, a quanto pare, non è stata zshinstallata. L'accesso non riesce con

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Quindi la domanda è sostanzialmente: come posso dire al computer remoto di usare una shell di login diversa da quella configurata in LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e


Hai /bin/shmai pensato di cambiare la tua shell LDAP in qualcosa di più universale come e poi avere il tuo ~/.profileexec remoto la shell appropriata se disponibile?
RobertL

Sarebbe un'opzione, ma non molto pulita, quindi preferirei evitarlo, se possibile.
Sascha,

Risposte:


11

Se la shell di accesso non può essere eseguita su un computer, non è possibile accedere tramite SSH o con la maggior parte degli altri metodi. Il server SSH esegue sempre la shell di accesso. Se si passa un comando dalla sshriga di comando, la shell di login viene eseguita con -ce la stringa di comando¹ come argomenti; altrimenti la shell di login viene eseguita come shell di login senza argomenti.

Se esistesse un modo per bypassare la shell di accesso, sarebbe un buco nella sicurezza. Un account può essere configurato come un account limitato trasformando la sua shell di login in un programma che esegue solo un'attività specifica; per esempio, la shell di login potrebbe essere quella git-shelldi consentire l'accesso solo a un repository git, o rssh, ecc.

Per accedere a quella macchina, è necessario disporre /bin/zshdi essere presenti o modificare la shell di accesso in qualcosa che è presente.

Quello che raccomando in un ambiente eterogeneo come questo è attenersi alla /bin/shshell di login, perché è presente ovunque. Impostare la SHELLvariabile di ambiente su /bin/zshse è presente, in questo modo otterrai zsh come shell interattiva.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Mentre ci sei, questo ti consente di evitare di codificare il percorso verso zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Per far funzionare zsh automaticamente per un login in modalità testo, invocalo dal tuo .profile. Se vuoi usarlo .zprofileper configurare le cose, rendilo una shell di login (ma non otterrai lo stesso ambiente su macchine in cui zsh non è presente, quindi non lo consiglio). Fallo solo se si tratta di un accesso interattivo, non quando .profileviene eseguito da uno script, durante l'accesso in modalità GUI, ecc.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ Il client SSH concatena i suoi argomenti non-opzione con spazi tra, e invia la stringa risultante attraverso la connessione. I protocolli SSH definiscono il comando come una stringa, non un elenco di stringhe.


Grazie per la spiegazione dettagliata. Sembra che sia l'unica strada da percorrere che non implichi l'installazione di zsh sul computer remoto, e funziona perfettamente, quindi mi atterrò.
Sascha,

Suggerisco anche di aggiungere un test [ "0$SHLVL" -lt 2 ]nel caso in cui la shell di login predefinita supporti in $SHLVLmodo tale che bash -lo eventualmente possa essere eseguita un'altra shell (ad esempio nel caso in cui zsh fallisca per qualche motivo). Quindi ssh -t host bash -leseguire una bashshell di login senza eseguire zsh dietro. Inoltre, vorrei sostituire exec zshin exec zsh -lmodo che il .zloginfile provenga.
vinc17,

2

È necessario etere installare la shell sulla macchina specificata se si ha accesso in modo diverso o richiedere ad un amministratore di farlo per voi o cambiare la shell in ldap con una shell esistente sulla macchina remota.

(open) sshd controllerà sempre la shell dell'utente e eseguirà sempre quella shell qualunque cosa venga passata per l'esecuzione. Se viene passata un'altra shell per eseguirla, la eseguirà passando come argomento alla shell dell'utente, ad esempio la shell dell'utente è '/ bin / sh' e si passa come argomento una shell csh di quella che verrà eseguita "/ bin / sh -c / bin / csh '.


Leggi il commento redfast. openssh ti permette di bypassare la shell predefinita.
Rui F Ribeiro,

@Rui F Ribeiro Se lo facesse in qualche modo toglie la logica dietro l'impostazione della shell su qualcosa come '/ bin / false' o '/ sbin / nologin'. Se ti riferisci a cambiare la shell dopo il login di ok, ma lo fa come ho scritto sopra (sh -c othersh), se non c'è '/ bin / sh' di quello che sei sfortunato. (Testato su Redhat).
nkms

È vero, se passwd ha una shell che non è elencata in / etc / shells, non si accederà comunque. Ma se sei in grado di effettuare il login e, a meno che sshd_config non ti costringa a una particolare shell, qualsiasi comando che l'utente è in grado di eseguire è corretto. Se si eseguono altri due test, ad esempio ssh -l user server "ps ax" | grep bashè facile notare che la shell predefinita non viene sempre invocata. Ciò che impedisce davvero all'altra soluzione di funzionare è il controllo di sicurezza di zsh che non si trova in / etc / shells
Rui F Ribeiro,

@Rui F Ribeiro Esegui strace -f sshd sul lato server. Vedrai qualcosa come "execve (" / bin / bash ", [" bash "," -c "," ps "] ..." Inoltre, / sbin / nologin è una shell valida in / etc / shells.
nkms,

La risposta di @RuiFRibeiro redfast00 è chiaramente sbagliata. nkms's ha ragione.
Gilles 'SO- smetti di essere malvagio' l'
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.