Один из стандартных способов вызова оболочки и запуска команды - это вызов программы оболочки с параметрами командной строки -c
и командой для запуска.Этот метод используется сервером SSH OpenSSH для вызова команд, запрошенных клиентами.
Когда клиент SSH подключается к серверу OpenSSH и запрашивает выполнение команды на сервере, сервер в конечном итоге вызывает эквивалентthis:
$SHELL -c 'the-command'
, где $SHELL
- это оболочка по умолчанию для пользователя, -c
- буквальная опция командной строки, а the-command
- команда, запрошенная клиентом.Команда передается оболочке как один аргумент командной строки.
В вашем случае оболочкой будет ваша пользовательская программа оболочки.Ему нужно будет проанализировать параметры командной строки, чтобы определить тот факт, что он был запущен с «-c» и командной строкой.Затем он должен будет выполнить команду, указанную в командной строке, вместо чтения команд из входного потока.
Как и любая другая программа на С, точкой входа в вашу программу оболочки является функция с именем main
:
int main(int argc, char **argv)
{
...
Когда ваша оболочка вызывается с SSH-сервера таким способом, вы должны обнаружить, что argc
и argv
будут отражать аргументы командной строки ["/name/of-shell", "-c", "the-command"]
.Существуют стандартные функции, такие как getopt(3)
, которые можно вызывать для анализа параметров командной строки.
Я добавлю, что scp
работает, когда сервер вызывает программу черезтвоя раковина.Таким образом, вы увидите, что ваша пользовательская оболочка вызывается (с параметром -c
и командой для запуска) для сеансов scp.Вы также можете увидеть это для сеансов sftp, в зависимости от того, как настроен сервер.