folosind bash pentru a executa un grup de comenzi de la C fără a le depozita într-un fișier

Am un program care acceptă un set de reguli sub forma unui singur fișier de reguli.

Când una dintre condiții este considerată îndeplinită de programul meu, încerc să tratez blocul de comenzi asociat cu condiția ca un script bash independent care trebuie executat. Prefer să nu mă ocup de stocarea acestor comenzi în fișiere, deoarece acest lucru lasă un vector de atac indezirabil. Există o modalitate de a alimenta o listă de linii delimitate de comenzi bash pentru a bash ca un singur grup? Vreau ca condițiile și alte lucruri din scriptul bash să funcționeze corect, nu doar executarea fiecărei linii prime pe cont propriu.

Fișier exemplu de reguli:

if CONDITION
some nice
bash commands
pkill some process
./launching something!
endif

Vreau să pot executa cele patru linii de cod bash ca un grup de comenzi bash, nu în mod independent unul de altul, când CONDITION este adevărat, așa cum este determinat de programul meu C.

Evident, acest lucru este de la Linux, folosind C ca limbaj de programare.

0

2 răspunsuri

Cea mai simplă abordare este probabil folosirea șirului sh -c "care conține comenzi care trebuie executate" . Ce este complicat este liniile noi încorporate. Dacă comenzile în sine nu vor conține citate unice, atunci puteți împacheta șirul cu mai multe linii în ghilimele simple. Dacă aceasta poate conține citate simple, doriți să scăpați de șir pentru a vă asigura că acestea sunt neschimbate.

Asa de:

  • read the commands into a buffer
  • do escape processing on the buffer; replace each ' with '\'' (remembering that the backslash must be in the output, so the string in C looks like "'\\''")
  • format the command: snprintf(command, sizeof(command), "sh -c '%s'", escaped_buffer);
  • ensure there was enough room
  • run system(command);
0
adăugat
care sună ca o soluție viabilă. Sunt aproape la punctul în care va trebui să pun în aplicare acea secțiune, așa că nu voi ști până atunci, dar mulțumesc!
adăugat autor coder543, sursa

De asemenea, ați putea să popen un proces bash .

Cu toate acestea, abordarea dvs. sugerează de asemenea să încorporați un interpret de scripting în interiorul aplicației. Considerați că încorporarea de ex. lua în interiorul acesteia?

0
adăugat