Comment ssh exécute-t-il une commande?

15

J'utilise Bash sur le client et le serveur. Lors de l'exécution d'une commande sur SSH:

  • ssh <host> 'declare' donne une liste de variables shell.

  • ssh <host> 'mount' donne une liste de points de montage.

Cependant, declareest une commande intégrée Bash, tandis que mountest une commande externe. Comment SSH sait-il quoi exécuter s'il y a un shell intégré et une commande externe portant le même nom sur le serveur?

Cyker
la source
2
ssh exécute toujours votre shell, qui est stocké dans /etc/passwd. Si c'est le cas, /usr/sbin/nologinvous ne pouvez pas vous connecter.
Ipor Sircer

Réponses:

21

L' sshexécute les commandes que vous fournissez dans le shell de l'utilisateur distant (obtenues à partir de /etc/passwd), comme visible dans le code source :

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

Par conséquent, les commandes respectives qui sont exécutées pour votre exemple sur le serveur distant sont:

  • bash -c declare
  • bash -c mount

Les deux sont transmis au bashet évalués. Les fonctions intégrées sont évaluées à l'intérieur et les commandes externes sont appelées comme si vous le faisiez à partir de votre invite de ligne de commande locale.

Jakuje
la source
Si un shell est toujours démarré par le démon ssh, alors la chose intéressante est que lorsque l'utilisateur appelle ssh avec une commande, ce shell n'est pas un shell de connexion, même si l'utilisateur a effectué une sorte de connexion. Une idée?
Cyker
Oui. Le shell exécutant la commande est 1) Pas de shell de connexion 2) Pas interactif. Vous pouvez forcer l'interactivité par le -tcommutateur, mais il ne chargera toujours pas les fichiers rc.
Jakuje
1
Notez que sshd(le serveur) fait cela, pas ssh(le client).
ysdx
@ysdx Ils travaillent ensemble. Le client indique au serveur d'exécuter la commande via un shell, et le serveur le fait.
Barmar