2014-09-16 2 views
0

에 C에서받은 인수를 물려 내가 한 인수와 함께 호출되는 C 코드의 다음 조각 : 나는 모든 인수가 script.sh 아래로받은 통과 어떻게bash는 스크립트

int main(int argc, char *argv[]) 
{ 
    system("/home/user/script.sh"); 
    return 0; 
} 

?

+0

['snprintf'] (http://en.cppreference.com/w/c/io/fprintf)를 사용하여 문자열을 설정하면? –

+0

쉘 스크립트를 호출하는 C 프로그램을 작성하는 이유는 무엇입니까? 그냥 바보 같은 짓을하는 것 같아. –

답변

1

나는 execv 기능을 찾고 있다고 생각합니다. 선택적인 인수를 전달하는 특정 파일을 실행하도록 권한을 부여합니다.

3

system(3)에 대해 일부 문자열 (Shell related utility functions of Glib처럼 필요에 따라 인용 부호 또는 공백 같은 장난 문자를 이스케이프 처리)을 합성 할 수 있습니다.

하지만 당신이 정말로 사용하지 않고 execv(3)를 호출 할 (리눅스 및 POSIX에)

system(3)

당신은 (내가 위의 링크 된 사람 페이지 추가) 읽을 수 있습니다

: Advanced Linux Programming

+1

아니, 위에서 링크 된 맨 페이지 나 책을 읽을 수 있어야한다. –

1

다음 뭔가를보십시오 :

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main() { 
    system("cat /etc/passwd"); 

    extern char * const environ[]; 
    char * const command[] = {"mylsname", "-lR", "/", NULL}; 
    execve("/bin/ls", command, environ); 
    perror("execve"); 
    exit(EXIT_FAILURE); 
} 
+0

당신은'perror ("execve");를 잊어 버렸습니다. exit (EXIT_FAILURE);'마지막'}'바로 전에 –

+0

@BasileStarynkevitch 맞다! 편집 : – jm666

0

문자열을 프레임하는 데 snprintf() 함수를 사용할 수 있습니다. 예 : snprintf(filename, sizeof(char) * 64, "/home/user/script.sh %s", argv[1]); 및 사용 system(filename);

+0

그런 다음 원본 프로그램을'./a.out "foo; rm -rf $ HOME"cc'로 실행 해보십시오.하지만 시도하기 전에 데이터를 백업하십시오. 그리고 큰 따옴표가없는'system (filename)'이어야합니다. –

+0

@BasileStarynkevitch'system()'에 따옴표를 지적 해 주셔서 감사합니다. 만약 누군가 정말로'rm -rf $ HOME'을 실행해야한다면 왜 당신이 제안한 방법일까요? 왜 아래 표를 얻었습니까? – iqstatic