LINUX.ORG.RU

переменная в system()


0

0

или меня глючит, или просто руки кривые (скорее второе...)

мне нужно проделать вот что:

#include <stdio.h>

int main(void)

{

char name_program[99];

scanf("%s",&name_program);

system("find /usr/* | grep name_program");

}

вопрос вот в чем, как в этом system'e вместо "name_program" вставить значение символьной переменной name_program, а не слово "name_program"?

большое блин спасибо.

★★★★★

#include <stdio.h> 

char cmdline[256];
char name_program[128];

int main(void) 

{ 

...
scanf("%s",name_program);
...
sprintf(cmdline,"find /usr/* | grep %s",name_program); 

system(cmdline); 

...

}

Только что ты будешь делать с выводом grep?

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

спасибо большое, а то что-то я совсем замучался...

>Только что ты будешь делать с выводом grep?

что-то наподобии:

#find /* | grep name_program >/grep.txt #vim /grep.txt

soko1 ★★★★★
() автор топика

>#find /* | grep name_program >/grep.txt #vim /grep.txt

как меня достал этот TeX=(

я хотел написать не

#find /* | grep name_program >/grep.txt #vim /grep.txt

а

#find /* | grep name_program >/grep.txt

#vim /grep.txt

soko1 ★★★★★
() автор топика

ну с этим вроде разобрался. получилось примерно такое:

#include <stdio.h>

int main(void)

{

char cmdline[256];

char name_program[128];

printf("Введите название программы:\n");

scanf("%s",&name_program);

sprintf(cmdline,"find /usr/* | grep %s >/unp.log",name_program);

system(cmdline);

}

только вот сейчас ломаю голову над тем, как сделать чтобы прога открыла файл /unp.log и считывала каждую строку приписывая например к ней команду rm. ну тоесть, вот прога открыла файл а там:

/root/1

/root/2

/root/3

и чтобы поочерезности (!) удалила все эти папки.

ну незнаю, мот есть и получше алгоритм, но я додумался тоько до такого. ито не знаю как реализовать. ну насчет открытия меня спасет fopen() а вот далее...

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

понимаешь, мне не столь нужен этот скрипт, сколько разобраться. разобраться в алгоритме. поэтому мне собственно по барабану на чем писать. хоть на бейсике=)

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

во блин, я думал у тебя для меня есть что-то на башэ=)))

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

Лучше использровать popen(3) и rmdir(2) какой-нибудь. Кстати, system() - не безопасное решение, потому что если name_program например будет "foo;rm -rf ~/" - это будет не очень приятно :)

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

>char name_program[128];

>printf("Введите название программы:\n");

>scanf("%s",&name_program)

А может scanf ("%s", name_program) всё-таки? Но в данном случае, если требуется сделать программу безопасной, лучше будет fgets.

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

Novel, спасибо за совет. я попробую использовать popen. но вообще, я понимаю что system() в этом плане не очень то и безопасно. но если размышлять так как ты размышляешь, то тогда вообще нельзя использовать никаке скрипты (потому как там может быть написано 'rm -fR /'), и проги перед использованием нужно дизасемблировать на наличие 'rm -fR /' =))))

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

ksk, ну насколько я знаю, при вводе какого-то значения (я про scanf()) нужно использовать аперсанд (&), хотя хз, может я и ошибаюсь. но по-крайней мере работает.

вы мне можете объяснить чем fgets безопаснее scanf'a? я просто не совсем понимаю (ибо еще новичек в программинге). на хакер.ру ммне бы в этом слечае начали рассказывать про переполнение буфера=)

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

> понимаю что system() в этом плане не очень то и безопасно.

Дело в том, что в system() и popen() комманда передаётся шелу, то есть возможны комбинации типа "foo; rm -rf /" и т.д. Если всё это вводится пользователем, то мало ли что из этого может получиться? Ситауции разные бывают - представь, что твоя прога SUIDная, тогда любой непривелегированный пользователь сможет выполнить любую комманду с правами рута. Поэтому в случае использования этих функций надо фильтровать спец. символы шелла (типа |, ; и т.п.) или использовать fork()+wait() + что-нибудь из семейства execl(), execv(), etc.

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

>я про scanf()) нужно использовать аперсанд (&), хотя хз, может я и ошибаюсь. но по-крайней мере работает.

Функции scanf передаются адреса переменных, в которые нужно что-то записать. В частности, name_program (в твоём примере) - это адрес первого элемента массива. Соответственно, &name_program - это адрес ячейки памяти, в котором храниться адрес первого элемента массива.

А fgets безопаснее тем, что контролируется длина буфера.
man 3 fgets
man 3 scanf

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

soko1(*) (31.10.2004 10:06:45):

> ...насколько я знаю, при вводе какого-то значения (я про scanf()) нужно использовать аперсанд (&),хотя хз, может я и ошибаюсь.

Ошибаешься.

Программа твоя СЛУЧАЙНО работает правильно, поскольку для выделенного массива name_program обращение name_program эквивалентно &name_program.

Если бы было нечто

char buf[128];

char *name_program=buf;

то между scanf("%s",name_program) (как надо делать) и canf("%s",&name_program) (как ты делаешь) была бы ОЧЕНЬ большая разница.

scanf сканирует в некий буфер, то есть, ему нужен указатель.

int i;

int *iptr=&i;

char buf[128]

char *cptr=buf;

scanf("%s",buf); -- правильно

scanf("%s",cptr); -- правильно

scanf("%s",&cptr);-- НЕ правильно

scanf("%d",iptr);-- правильно

scanf("%d",&i);-- правильно

scanf("%d",i);-- НЕ правильно

scanf("%d",&iptr);-- НЕ правильно

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