Як ssh запускає команду?


15

Я використовую Bash і для клієнта, і для сервера. Під час виконання команди над SSH:

  • ssh <host> 'declare' дає список змінних оболонок.

  • ssh <host> 'mount' надає перелік точок кріплення.

Однак, declareце Bash вбудований, в той час mountяк зовнішня команда. Як SSH знає, що запустити, якщо на сервері є вбудована оболонка та зовнішня команда з тим же ім'ям?


2
ssh завжди запускає оболонку, в якій зберігається /etc/passwd. Якщо /usr/sbin/nologinви не можете увійти.
Ipor Sircer

Відповіді:


21

sshЗапускає команди ви надасте в оболонці віддаленого користувача (отриманий з /etc/passwd), як і видно з вихідного коду :

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

Тому відповідні команди, які виконуються для вашого прикладу на віддаленому сервері:

  • bash -c declare
  • bash -c mount

Вони передаються bashта оцінюються. Вбудовані модулі оцінюються всередині, а зовнішні команди викликаються так, ніби ви зробите це з вашого локального командного рядка.


Якщо оболонку завжди запускає ssh daemon, то найцікавіше, що коли користувач викликає ssh командою, то ця оболонка не є оболонкою для входу, навіть якщо користувач здійснював якийсь вхід. Будь-яка ідея?
Кікер

Так. Оболонка, що виконує команду, - 1) Немає оболонки для входу 2) Не є інтерактивною. Ви можете примусити інтерактивність -tперемикачем, але він все одно не завантажить файли rc.
Jakuje

1
Зауважте, що sshd(сервер) це робить, а не ssh(клієнт).
ysdx

@ysdx Вони працюють разом. Клієнт каже серверу виконувати команду через оболонку, а сервер це виконує.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.