Дать контроль над оболочкой из кода C? - PullRequest
0 голосов
/ 03 декабря 2010

Как я могу выполнить оболочку из кода C?

Моя оболочка помещена в /bin/sh

Кажется, что следующее не работает для меня

system("/bin/sh");
exec("/bin/sh");

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Возможно, вам нужно указать оболочке, что она должна быть интерактивной:

system("/bin/sh -i");

Однако я считаю, что ваш исходный вызов system() должен был также выдать приглашение оболочки.

Обанотации (с и без '-i') в этой программе дают мне приглашение оболочки (вернитесь к предыдущей оболочке, набрав 'exit' и RETURN или Control-D ):

#include <stdlib.h>
int main(void)
{
    system("/bin/sh -i");
    return 0;
}
1 голос
/ 03 декабря 2010

Эта программа работает, как и ожидалось для меня:

int main()
{
    int ret = system("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}

использование -i вызывает некоторую проблему перенаправления, и все зависает, как только я набираю команду, которая выводит данные.

Существуют важные различия между system () и exec () . system () фактически совпадает с /bin/sh -c yourCommand в командной строке, поэтому system("/bin/sh") совпадает с

/bin/sh -c /bin/sh

Вот почему он используется редко, потому что требуемая команда выполняется при первом запуске ненужного процесса оболочки.

exec () вызывает замену всего образа процесса на указанную команду, поэтому, если бы я написал:

int main()
{
    int ret = exec("/bin/sh");
    printf ("Shell returned %d\n", ret);
    return 0;
}

printf () и все после него никогда не будет выполнено, потому что весь процесс преобразуется в экземпляр / bin / sh . Правильный способ выполнить дочернюю команду - это разветвить, а затем выполнить exec в дочернем элементе и ждать в родительском.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...