Передача команд в двоичный файл, который запускает оболочку с использованием сценария bash

Новичок в сценариях bash, поэтому у меня возникла небольшая проблема с прорезыванием зубов, и мне было интересно, может ли кто-нибудь устранить некоторые проблемы, с которыми я столкнулся. У меня есть простой файл C с именем test, который создает оболочку, как показано ниже:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
  execl("/bin/sh", "/bin/sh", (void *) NULL);
  perror("exec");
 return 1;
}

Я хочу создать сценарий bash для выполнения этого файла, который я сделал ниже, но затем при выполнении я хочу отправить команды в оболочку, которую создает двоичный файл - возможно ли это? Я пытаюсь сделать следующее безрезультатно:

#!bin/bash
/var/testfolder/test; # execute the test c file to spawn the shell
??? #don't know how to pass commands to the new shell created :(

person TIMMY    schedule 22.03.2015    source источник
comment
Такой подход кажется странным; сценарий оболочки, который выполняет программу C, открывающую другую оболочку. Какую проблему ты пытаешься решить? Может быть, кто-то может предложить лучший подход.   -  person Hunter McMillen    schedule 22.03.2015
comment
для части работы в универе лектору нужен сценарий, показывающий, как мы использовали программу - я запускал серию команд Linux по отдельности, я хочу объединить их все в 1 сценарий для автоматического запуска команд, которые я использовал. В этом случае предоставленная программа создает оболочку, затем мне нужно запустить соответствующие команды в этой оболочке, и я надеялся, что смогу сделать это с помощью одного скрипта (я знаю, что проще этого не делать)   -  person TIMMY    schedule 22.03.2015
comment
Какое место в этом уравнении занимает программа C? Сценарий для последовательного выполнения ряда команд — это просто последовательность команд в файле. Зачем вообще задействовать эту программу на C?   -  person Etan Reisner    schedule 22.03.2015
comment
Вы пытаетесь сгенерировать команды оболочки в файл, а затем выполнить сгенерированный файл оболочки? Вам просто нужно chmod u+x <generated script file>, а затем выполнить его с помощью ./<generated script file>, если он сгенерирован в текущем каталоге. Этот сценарий будет выполняться в дочернем процессе оболочки.   -  person Sylvain Bugat    schedule 22.03.2015
comment
Забудьте мой предыдущий комментарий, я думаю, это объясняет лучше: например, мне дали программу C с правами root, она запускает оболочку - я хочу, чтобы скрипт bash сначала запускал программу C (что я могу сделать), а затем передавать команды в оболочка bash, которую он генерирует (что я не могу понять)   -  person TIMMY    schedule 22.03.2015
comment
Вы имеете в виду стандартные методы без использования эксплойтов или какие-то методы эксплойтов? Я предполагаю, что вы имеете в виду первое, но было бы хорошо уточнить ваш вопрос. Кроме того, можно ли изменить программу C или она должна оставаться такой, какая она есть?   -  person kaylum    schedule 22.03.2015
comment
Обратите внимание, что /bin/sh НЕ обязательно является оболочкой bash, и даже если она реализована bash в вашей системе, bash работает в режиме совместимости, который пытается имитировать традиционное поведение sh. Если вы действительно хотите использовать команды, специфичные для bash, запустите /bin/bash (или эквивалент, в зависимости от того, где в вашей системе находится bash). Если желательна переносимость, используйте /bin/sh и избегайте использования функций, эксклюзивных для bash.   -  person ghoti    schedule 23.03.2015


Ответы (2)


Я полагаю, ваш скомпилированный двоичный файл C имеет разрешение SETUID? С двоичным файлом и аргументами вы можете выполнить любую оболочку, подобную этой, с этим двоичным разрешением:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main( int argc, char ** argv )
{
    execv("/bin/sh", argv );
    perror("exec");
    return 1;
}

Вывод тестового скрипта для печати аргументов и текущего процесса:

$ ./test_execv ./test.sh foo bar
Executing $0: ./test.sh
Args $*: foo bar
process:
  PID TTY          TIME CMD
 3300 pts/1    00:00:08 bash
 3498 pts/1    00:00:00 sh
 3499 pts/1    00:00:00 ps

Проблема безопасности
Если вы можете выполнить сценарий в корневой оболочке, это может сделать любой. Я думаю, вам просто нужно добавить некоторые из ваших скриптов (только те, которые необходимы) с разрешением sudo для запуска от имени пользователя root из нужной учетной записи.

person Sylvain Bugat    schedule 22.03.2015

Попробуй это:

#!/bin/bash
/var/testfolder/test <<EOF
cmdtopass1
cmdtopass2
cmdtopass3
EOF
person Danogentili    schedule 22.03.2015