Как я могу выполнить оболочку из кода C?Предоставление контроля оболочке из кода C?
Моя оболочка помещается в /bin/sh
После, похоже, не работает для меня
system("/bin/sh");
exec("/bin/sh");
Как я могу выполнить оболочку из кода C?Предоставление контроля оболочке из кода C?
Моя оболочка помещается в /bin/sh
После, похоже, не работает для меня
system("/bin/sh");
exec("/bin/sh");
Может быть, вам нужно сообщить оболочке он должен быть интерактивным:
system("/bin/sh -i");
Однако , Я считаю, что ваш оригинальный вызов system()
также должен был вызвать приглашение оболочки.
Обе нотации (с и без «-i») в этой программе дает мне приглашение оболочки (возврат к предыдущей оболочки, набрав «выход» и RETURN или Control-D):
#include <stdlib.h>
int main(void)
{
system("/bin/sh -i");
return 0;
}
Эта программа работает, как ожидается, для меня:
int main()
{
int ret = system("/bin/sh");
printf ("Shell returned %d\n", ret);
return 0;
}
с помощью -i вызывает какой-то вопрос переназначения и все висит, как только я набираю команду, которая производит вывод.
Имеются важные отличия между системой () и exec(). система() фактически то же самое, как /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;
}
Е() и все после того, как он никогда не был выполнен из-за весь процесс превращается в экземпляр /bin/sh. Правильный способ запуска дочерней команды - это форк, а затем exec в дочернем элементе и ждать в родительском элементе.
Не работает? Можете ли вы рассказать об этом? И какой из функций семейства exec вы использовали? – vpit3833 2010-12-03 07:47:08