LINUX.ORG.RU

как правильно завернуть ввод/вывод консольного приложения в сокет.


0

0

Есть консольное приложени, работает в диалоговом режиме, т.е. свой шелл.
Как малой кровью добавить к нему функцию удаленного управления?
Т.е. получить этот шелл с удаленной машины?

Исходники доступны, поэтому сделал следующее (изврат конечно, но..) :
   
for (;;) {
    	connfd = accept (listenfd, (struct sockaddr*) &servaddr, (socklen_t*) &len);
    	if (connfd < 0) {
    		perror("accept");
    		close(connfd);
    		close(listenfd);
    		exit(1);
    	}
        dup2(connfd , STDIN_FILENO);
        dup2(connfd, STDOUT_FILENO);
        dup2(connfd, STDERR_FILENO);
        close(connfd);
    	while ( (buff = readline("> "))  &&  ( 0< strlen(buff)) ) {
        error = luaL_loadbuffer(L, buff, strlen(buff), "line") 
                        || lua_pcall(L, 0, 0, 0);
// Здесь используется Lua для распарсивания ввода юзера и вызова 
//соответствующих команд (функций) настоящего шелла. Т.е. Lua 
//используется в качестве некоего враппера для функций шелла.

       }

}

Шелл запускается функцией (скажем iocsh()), функция блокирующая.
выход из этой функции в данном случае == останов программы.

Т.е. вышеприведенный readline это замена настоящему шеллу. 

Вопрос в том, как обеспечить требуемый функционал (отдать шелл 
удаленно) и не делать подобных костылей. Параллельный сервер не 
требуется, т.е. одновременно один клиент. Вариант с netcat'oм не катит, т.к. приложение должно работать не зависимо от того, 
подсоединился ли клиент, т.е. общение с клиентом посредством шелла 
это вторичная задача. Направьте в правильном направлении плз.

ЗЫ Опыта разработки под *nix мало...

Я вижу два разумных пути: 1. SSH 2. inetd

У SSH есть преимущества, так как он защищённый. Если надо не дать запускать другие приложения, то пользователю ставится shell в /etc/passwd на вашу программу. Если в программе есть своя авторизация, то inetd тоже подойдет.

P.S. в обоих случаях вообще не надо менять исходники.

rymis ★★
()
Ответ на: комментарий от Reset

nc -l -w -1 -p 8899 -c ./start.sh запускает приложение _после_ того, как клиент приконнектился. Это неправильно, т.к. диалог с пользователем это вторичная задача, приложение должно быть запущено независимо от того, подсоединился клиент или нет. Или я что-то упустил из man nc?

mr-badguy
() автор топика
Ответ на: комментарий от rymis

>Я вижу два разумных пути: 1. SSH 2. inetd

1 и 2 варианты запустят мое приложение после соединения клиента? Если так, то не подходит, мое приложение должно работать независимо от клиента

mr-badguy
() автор топика

По поводу кода. Надо аккуратнее обрабатывать результат accept, -1 может вернуться из-за ошибки на сетевом уровне...

А в целом, ИМХО, изобретение подобных вещей оправдано только в случае embedded-систем. Я бы посоветовал использовать screen, у него есть опция -S и т.д.

mky ★★★★★
()
Ответ на: комментарий от mky

Еще есть dtach. Создаешь сессию с запущенным приложением при старте системы или когда там нужно, деташишься, потом заходишь по ssh и делаешь атташ. У меня так сторрент работает на рутере.

anonymous
()
Ответ на: комментарий от mr-badguy

Не уверен но может можно сделать что то типа:
./myprog | nc -l -p 12345

Svoloch ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.