에 C에서받은 인수를 물려 내가 한 인수와 함께 호출되는 C 코드의 다음 조각 : 나는 모든 인수가 script.sh 아래로받은 통과 어떻게bash는 스크립트
int main(int argc, char *argv[])
{
system("/home/user/script.sh");
return 0;
}
?
에 C에서받은 인수를 물려 내가 한 인수와 함께 호출되는 C 코드의 다음 조각 : 나는 모든 인수가 script.sh 아래로받은 통과 어떻게bash는 스크립트
int main(int argc, char *argv[])
{
system("/home/user/script.sh");
return 0;
}
?
나는 execv 기능을 찾고 있다고 생각합니다. 선택적인 인수를 전달하는 특정 파일을 실행하도록 권한을 부여합니다.
system(3)에 대해 일부 문자열 (Shell related utility functions of Glib처럼 필요에 따라 인용 부호 또는 공백 같은 장난 문자를 이스케이프 처리)을 합성 할 수 있습니다.
하지만 당신이 정말로 사용하지 않고 execv(3)를 호출 할 (리눅스 및 POSIX에)
system(3) 당신은 (내가 위의 링크 된 사람 페이지 추가) 읽을 수 있습니다아니, 위에서 링크 된 맨 페이지 나 책을 읽을 수 있어야한다. –
다음 뭔가를보십시오 :
#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);
}
당신은'perror ("execve");를 잊어 버렸습니다. exit (EXIT_FAILURE);'마지막'}'바로 전에 –
@BasileStarynkevitch 맞다! 편집 : – jm666
문자열을 프레임하는 데 snprintf()
함수를 사용할 수 있습니다. 예 : snprintf(filename, sizeof(char) * 64, "/home/user/script.sh %s", argv[1]);
및 사용 system(filename);
그런 다음 원본 프로그램을'./a.out "foo; rm -rf $ HOME"cc'로 실행 해보십시오.하지만 시도하기 전에 데이터를 백업하십시오. 그리고 큰 따옴표가없는'system (filename)'이어야합니다. –
@BasileStarynkevitch'system()'에 따옴표를 지적 해 주셔서 감사합니다. 만약 누군가 정말로'rm -rf $ HOME'을 실행해야한다면 왜 당신이 제안한 방법일까요? 왜 아래 표를 얻었습니까? – iqstatic
['snprintf'] (http://en.cppreference.com/w/c/io/fprintf)를 사용하여 문자열을 설정하면? –
쉘 스크립트를 호출하는 C 프로그램을 작성하는 이유는 무엇입니까? 그냥 바보 같은 짓을하는 것 같아. –