LINUX.ORG.RU

Как запустить шел(+)


0

0

Хочу в своей линуксовой C программе сделать возможность
вызова шела ну и соответственно чтоб дальше команды
системе через него давать, бегло почитал на эту тему
и пока вижу такую последовательность
fork
setsid (для того чтобы отвязаться от родителя)
дескрипторы 0,1,2
открываем на нужные источники ввода-вывода
и наконец
execve("/bin/bash"......) (пускаем нужный интерпритатор или скрипт)
моя схема верна или я всеже
что-то неучел\попутал ?

anonymous
Ответ на: комментарий от anonymous_incognito

Ну вобще для себя
и хочется баш
не дождался ответов
написал тест, вроде стартует все
только почемуто в ответ на любую команду
получаю ощибку
command not found
или
no such file or directory
дескрипторы 0,1,2 вешаю на сокет
ну вот кусок кода в общем
if((new_sd = accept(cmds_sock, (struct sockaddr *)&addr, &len)) < 0){
if(errno == EINTR) continue;
wlog("Can't accept socket (1): %s\n",strerror(errno));
continue;
}
wlog("con OK\n");
if((pid = fork()) < 0){
sprintf(buf,"Can't fork: %s\n", strerror(errno));
wlog(buf);
close(new_sd);
continue;
}
if(pid == 0){
wlog("fork OK\n");
setsid();
close(0);
close(1);
close(2);
if(dup2(new_sd, 0) < 0){
wlog("Dup2 error: %s\n", strerror(errno));
}
if(dup2(new_sd, 1) < 0){
wlog("Dup2 error: %s\n", strerror(errno));
}
if(dup2(new_sd, 2) < 0){
wlog("Dup2 error: %s\n", strerror(errno));
}
if(execlp("/bin/bash", "/bin/bash", (char *) NULL) < 0){
wlog("Execve error: %s\n", strerror(errno));
}
exit(0);
}
close(new_sd);

может кто подскажет что я не так делаю ?

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

всем спасибо разобрался
оказалось какого-то хрена
после команды
\r\n добавлялось
а не \n как надо...
ну а дальше мелочи жизни уже порасковыривал :)

anonymous
()

system("screen -d -m ./program");

вытащить из скрина в консоли screen -rd

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