¿Cómo ejecuta ssh un comando?

15

Estoy usando Bash tanto en el cliente como en el servidor. Al ejecutar un comando sobre SSH:

  • ssh <host> 'declare' da una lista de variables de shell.

  • ssh <host> 'mount' da una lista de puntos de montaje.

Sin embargo, declarees un Bash incorporado, mientras que mountes un comando externo. ¿Cómo sabe SSH qué ejecutar si hay un shell incorporado y un comando externo con el mismo nombre en el servidor?

Cyker
fuente
2
ssh siempre ejecuta su shell, que se almacena en /etc/passwd. Si es así, /usr/sbin/nologinno puede iniciar sesión.
Ipor Sircer

Respuestas:

21

El sshejecuta los comandos suministrados por el usuario en la cáscara del usuario remoto (obtenido de la /etc/passwd), como es visible desde el código fuente :

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

Por lo tanto, los comandos respectivos que se ejecutan para su ejemplo en el servidor remoto son:

  • bash -c declare
  • bash -c mount

Ambos son pasados ​​al bashy evaluados. Los incorporados se evalúan en el interior y los comandos externos se llaman como si lo hiciera desde la línea de comandos local.

Jakuje
fuente
Si un shell siempre se inicia con ssh daemon, lo interesante es que, cuando el usuario llama a ssh con un comando, ese shell no es un shell de inicio de sesión, incluso si el usuario realizó algún tipo de inicio de sesión. ¿Alguna idea?
Cyker
Si. El shell que ejecuta el comando es 1) No hay un shell de inicio de sesión 2) No es interactivo. Puede forzar la interactividad mediante el -tinterruptor, pero aún así no cargará los archivos rc.
Jakuje
1
Tenga en cuenta que sshd(el servidor) está haciendo esto, no ssh(el cliente).
ysdx
@ysdx Están trabajando juntos. El cliente le dice al servidor que ejecute el comando a través de un shell, y el servidor lo hace.
Barmar