Jak ssh uruchamia polecenie?

15

Używam Bash zarówno na kliencie, jak i serwerze. Podczas uruchamiania polecenia przez SSH:

  • ssh <host> 'declare' daje listę zmiennych powłoki.

  • ssh <host> 'mount' daje listę punktów montowania.

Jednak declarejest wbudowany w Bash, natomiast mountjest poleceniem zewnętrznym. Skąd SSH wie, które uruchomić, jeśli na serwerze jest wbudowana powłoka i zewnętrzne polecenie o tej samej nazwie?

Cyker
źródło
2
ssh zawsze uruchamia powłokę, w której jest przechowywany /etc/passwd. Jeśli nie /usr/sbin/nologinmożesz się zalogować.
Ipor Sircer

Odpowiedzi:

21

sshUruchamia komendy podasz w skorupkach zdalnego użytkownika (otrzymany z /etc/passwd), a widoczne z kodem źródłowym :

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

Dlatego odpowiednie polecenia, które są wykonywane w twoim przykładzie na zdalnym serwerze to:

  • bash -c declare
  • bash -c mount

Oba są przekazywane bashi oceniane. Wbudowane są analizowane wewnątrz, a zewnętrzne polecenia są wywoływane tak, jakbyś zrobił to z lokalnego wiersza poleceń.

Jakuje
źródło
Jeśli powłoka jest zawsze uruchamiana przez demona ssh, to interesujące jest to, że kiedy użytkownik wywołuje ssh za pomocą polecenia, to powłoka ta nie jest powłoką logowania, nawet jeśli użytkownik wykonał jakiś rodzaj logowania. Dowolny pomysł?
Cyker
Tak. Powłoka uruchamiająca polecenie to 1) Brak powłoki logowania 2) Nie interaktywna. Możesz wymusić interaktywność za pomocą -tprzełącznika, ale nadal nie ładuje on plików rc.
Jakuje
1
Zauważ, że sshdrobi to (serwer), a nie ssh(klient).
ysdx
@ysdx Pracują razem. Klient nakazuje serwerowi wykonanie polecenia przez powłokę, a serwer to robi.
Barmar