Как ssh запускает команду?

15

Я использую Bash как на клиенте, так и на сервере. При запуске команды через SSH:

  • ssh <host> 'declare' дает список переменных оболочки.

  • ssh <host> 'mount' дает список точек монтирования.

Тем не менее, declareэто встроенный в Bash, а mountвнешняя команда. Как SSH узнает, какой запускать, если на сервере есть встроенная оболочка и внешняя команда с таким же именем?

Cyker
источник
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и оцениваются. Встроенные модули оцениваются внутри, а внешние команды вызываются так, как если бы вы делали это из локальной командной строки.

Jakuje
источник
Если оболочка всегда запускается демоном ssh, то интересно, когда пользователь вызывает команду ssh с помощью команды, тогда эта оболочка не является оболочкой входа в систему, даже если пользователь выполнил какой-либо вход в систему. Любая идея?
Cyker
Да. Оболочка, выполняющая команду: 1) Нет оболочки входа 2) Не интерактивная. Вы можете настроить интерактивность с помощью -tпереключателя, но он все равно не загрузит файлы rc.
Jakuje
1
Обратите внимание, что sshd(сервер) делает это, а не ssh(клиент).
ysdx
@ysdx Они работают вместе. Клиент говорит серверу выполнить команду через оболочку, а сервер делает это.
Бармар