Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/48: Рейтинг темы: голосов - 48, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16

Определить, что файл является исполняемым и запустить его

03.04.2011, 11:53. Показов 9150. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такой вот вопрос, как мне определить исполнительный файл. Задача такая, нужно написать программу которая запускает исполнительные файлы и скрипты. Проблема в том, что любой юзер может создать простой текстовый файл, и присвоить ему права 777, т.е. иполнимый. Но моя программа должно запускать только бинарники!!! Кто мне может помочь разобраться?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2011, 11:53
Ответы с готовыми решениями:

Определить, является ли файл исполняемым
Добрый день! Есть в с++ очень хорошая функция - SHGetFileInfo, с ее помощью, в частности, можно определить является файл исполняемым....

Как определить является ли файл исполняемым?
Собственно нужно написать программу, которая при запуске в текущей папке удаляла все неисполняемые файлы и оставляла исполняемые. Как можно...

Сделать файл исполняемым и вывести его в консоли
Здравствуйте. Подскажите пожалуйста я уже не знаю что делать, надо сделать файл исполняемым и вывести его в консоли убунту. Сохранила файл...

27
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.04.2011, 12:23
Честно говоря не вижу в этом проблемы...
Если проверить magic #! не сложно, то проверка сигнатуры ELF/a.out в заголовках файла не даст гарантий, а полный парсинг еще тот геморой, ИМХО не стоит оно того.
Ну вернет вам система на execXX() ENOEXEC, что в этом страшного???

ЗЫ: для a.out можно еще сделать nlist() - какая никакая, а гарантия что это действительно бинарник а не мусор.
2
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
03.04.2011, 12:51  [ТС]
реализацию какую нить показать можно?

Добавлено через 36 секунд
в смысле листинг
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.04.2011, 13:25
Листинг чего именно?
Если вы хотите изобразить простейший шелл умеющий запускать программы и ничего больше, то у
вас должен быть цикл из функции парсинга ввода + fork(), wait() в родителе и любой exec() в ребенке.
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
11.04.2011, 13:38  [ТС]
а как проверить сигнатуры ELF/a.out в заголовках файла???
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.04.2011, 18:01
Ну как... вестимо прочитать начало файла и сравнить с заданным образцом. Сигнатуры можно смело выдрать из /etc/magic. Но повторюсь, это бессмысленная трата времени.
1
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
22.04.2011, 10:28  [ТС]
Вот такой вот вопрос, а как мне определить скрипт, если мне запрещено чтение данного файла, я могу только выполнить его???
мне что проверить первые символы с '#!' надо иметь доступ для чтения...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
22.04.2011, 10:37
Можно делать от рута, а перед собственно запуском сбрасывать привилегии (вариант с ACL рассматривать уж не будем)
Но правильнее объяснить преподавателю что это дурь и ересь.
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
22.04.2011, 10:42  [ТС]
понятно, а ты не можешь мне помочь, у меня проблема сейчас заключается в запуске программы из под программы, а ещё осложняется тем что в первой программе используется ncurses режим...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
22.04.2011, 10:44
Помочь чем?
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
22.04.2011, 10:45  [ТС]
разобраться, с процессами и ncurses...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
22.04.2011, 10:47
Если у вас есть конкретные вопросы - создавайте тему, не я кто-нибудь другой скорее всего ответит.
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
22.04.2011, 10:48  [ТС]
а тут можно исходники разместить, чтобы ориентироваться легче было?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
22.04.2011, 10:53
Думаю, да) Но если много то лучше заливайте на какой-нибудь pastebin.com а тут ссылку...
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
23.04.2011, 12:33  [ТС]
Вот моя функция для запуска программ
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
int script(char *pathname) {
    struct stat name;
    char buff[2];
    int fl,rd;
    //const char bash = "/bin/bash";
    pid_t result,childpid;
    int exit_result;
    char* prog_args[] = { "/usr/bin/clear","NULL" };
    stat(pathname,&name);
    if ( name.st_mode & S_IXUSR ) {
    if ( name.st_mode & S_IRUSR ) {
        fl=open(pathname,O_RDONLY,S_IRUSR);
        rd=read(fl, buff, 2);
        if (buff=="#!") {
        result = fork();
        switch(result) {
            case -1:
            fprintf(stderr, "Owibka scripta 1: %s\n", strerror(errno));break;
            case 0: endwin(); if ((execv("/bin/bash",&pathname))<0) {
                fprintf(stderr, "Owibka  scripta 2: %s\n", strerror(errno)); break; }
            else  exit(-1);break;
            default: while(result!=wait(&exit_result)) {
                endwin();
                if (WIFEXITED(exit_result)==0 || WEXITSTATUS(exit_result)==0 ) {
                refresh();break;}  
                }
                refresh();
        }
        } 
        else {
        result = fork();
        switch(result) {
            case -1:
            fprintf(stderr, "Owibka progi 1: %s\n", strerror(errno));break;
            case 0:
            endwin();
            if ((execv(pathname,NULL))<0) {
                fprintf(stderr, "Owibka  progi 2: %s\n", strerror(errno));
                refresh();break;
            }
            else exit(-1);break;
            default: while(result!=wait(&exit_result)) {
                endwin();
                if (WIFEXITED(exit_result)==0 || WEXITSTATUS(exit_result)==0 ) {
                refresh(); break; } 
                }
                refresh();
        }
        }
    }
    else {
        result = fork();
        switch(result) {
            case -1:
            fprintf(stderr, "Owibka progi 3: %s\n", strerror(errno));break;
            case 0:
            endwin();
            if ((execv(pathname,NULL))<0) {
                fprintf(stderr, "Owibka  progi 4: %s\n", strerror(errno));break;
            }
            else exit(-1);break;
            default: while(result!=wait(&exit_result)) {
                endwin();
                if (WIFEXITED(exit_result)==0 || WEXITSTATUS(exit_result)==0 ) {
                    refresh(); break; }
                }
                refresh();
        }
    }
    //execv(pathname,NULL);
    }
    return 0;
}
Добавлено через 2 минуты
Каждый раз когда я запускаю программу, то она запускаеться вместе с моей оболочкой, мне надо чтобы выполнялась только запускаемая программа... Кто поможет???
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
23.04.2011, 13:33
У меня вот
так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <sys/types.h>
#include <sys/wait.h>
#include <err.h>
#include <errno.h>
#include <ncurses.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
 
#define ARG_MAX         10
 
int
main()
{
        size_t           len;
        pid_t            pid;
        char            **ap, *args[ARG_MAX];
        char             cmd[BUFSIZ];
        char            *cmdp;
        const char       msg[] = "Enter a program name to execute: ";
        int             col, status, row;
 
        initscr();
        cbreak();
        start_color();
        init_pair(1, COLOR_CYAN, COLOR_BLACK);
        attron(COLOR_PAIR(1));
        getmaxyx(stdscr, row, col);
 
        while (1) {
                erase();
                mvprintw(row / 2, (col - strlen(msg)) / 2, "%s", msg);
                refresh();
                getstr(cmd);
 
                if ((len = strlen(cmd)) < 2)
                        continue;
                if (cmd[len - 1] == '\n')
                        cmd[len - 1] = '\0';
                if (strncmp(cmd, "exit", 4) == 0) {
                        endwin();
                        printf("\nExiting\n");
                        return (0);
                }
 
                /* Parse command to vector */
                cmdp = cmd;
                for (ap = args; ap < &args[ARG_MAX - 1] &&
                    (*ap = strsep(&cmdp, " \t")) != NULL;)
                        if (**ap != '\0')
                                ap++;
                *ap = NULL;
 
                /* Fork and exec */
                endwin();
                pid = fork();
                if (pid == -1)
                        err(1, "fork");
                if (pid) {
                        pid = wait(&status);
                } else {
                        endwin();
                        execv(args[0], args);
                        warn("cannot execute \"%s\"", args[0]);
                }
                cbreak();
                getch();
        }
}
получается.
1
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
23.04.2011, 13:36  [ТС]
cbreak(); - что это за функция?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
23.04.2011, 13:42
man cbreak чтоли
можете смело выкинуть - я сделал после запуска ожидание нажатия любой клавиши, без нее будет ждать enter. Вообщем на вашу проблему ни как не влияет.
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 16
23.04.2011, 13:52  [ТС]
я понял, а вы смотрели сколько ваша программа создает процесов и не один из них не завершаеться.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
23.04.2011, 14:02
да, простите, exit() после wait() забыл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2011, 14:02
Помогаю со студенческими работами здесь

Как в Outlook определить что его вызывают и запустить свой код
Здравствуйте, специалисты и не очень. После того как я перешел с Bat на Outlook мне всегда хотелось его (Outlook) заставить сортировать...

Скачать файл, а не запустить его
Доброго всем времени суток! Заранее всех откликнувшихся благодарю и прошу извинить, если не туда написал. Прошу подсказать: Есть...

Исполняемым файл jar, не работает
День добрый. Есть утилитка, которая обрабатывает табличные файлы dbf, использует библиотеку DBF_JDBC30_OK, рабоче через hxtt и т.д. Так...

Как сделать файл исполняемым?
Доброго времени суток всем. Не могу делать файлы исполняемыми и собственно запускать. Есть файл созданный в Qt Creatore, его нужно...

Запустить файл из ресурсов, не извлекая его
Доброго времени суток. Столкнулся с проблемой, что надо запустить файл из ресурсов, не извлекая его. Подскажите, как это сделать? Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru