In che modo ssh esegue un comando?


15

Sto usando Bash sia su client che su server. Quando si esegue un comando su SSH:

  • ssh <host> 'declare' fornisce un elenco di variabili shell.

  • ssh <host> 'mount' fornisce un elenco di mountpoint.

Tuttavia, declareè incorporato in Bash, mentre mountè un comando esterno. Come fa SSH a sapere quale eseguire se è presente una shell integrata e un comando esterno con lo stesso nome sul server?


2
ssh sempre eseguire la shell, che è memorizzato in /etc/passwd. Se non /usr/sbin/nologinriesci ad accedere.
Ipor Sircer,

Risposte:


21

L' sshesegue i comandi forniti in guscio dell'utente remoto (ottenuti dalla /etc/passwd), come visibile dalla sorgente :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

Pertanto i rispettivi comandi eseguiti per il tuo esempio sul server remoto sono:

  • bash -c declare
  • bash -c mount

Entrambi vengono passati al bashe valutati. Gli built-in vengono valutati all'interno e i comandi esterni vengono chiamati come se lo si facesse dal prompt della riga di comando locale.


Se una shell viene sempre avviata dal demone ssh, la cosa interessante è che quando l'utente chiama ssh con un comando, quella shell non è una shell di login, anche se l'utente ha eseguito un tipo di login. Qualche idea?
Cyker,

Sì. La shell che esegue il comando è 1) Nessuna shell di accesso 2) Non interattiva. È possibile forzare l'interattività tramite l' -topzione, ma non caricherà comunque i file rc.
Jakuje,

1
Si noti che sshd(il server) lo sta facendo, non ssh(il client).
ysdx,

@ysdx Stanno lavorando insieme. Il client dice al server di eseguire il comando attraverso una shell e lo fa il server.
Barmar,
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.