system()에서 IFS 변수가 무시됩니다.

system()에서 IFS 변수가 무시됩니다.

저는 대학교 과정의 권한 승격을 위해 노력하고 있습니다. 나는 단순히 ls비트의 출력을 복사하고 설정하는 간단한 코드를 가지고 있습니다 SUID.

int main(void){
  system("/bin/ls");
  return 0;
}

또한 쉘 역할을 할 스크립트를 홈 디렉토리에 추가했습니다.

#!/bin/bash
/bin/sh

또한 첫 번째 변수인 .변수를 추가했습니다 . $PATH따라서 C에서 코드를 실행할 때마다 bin홈 디렉터리의 스크립트가 호출되어야 하지만 변수가 대신 IFS실행되기 때문에 변수가 완전히 무시됩니다 . 이유는 무엇입니까?/bin/lsbin ls

답변1

프로그램이 실행되지 않습니다"binscript"를 홈 디렉토리에 저장합니다. 를 실행합니다 "/bin/ls". 시스템 호출은 쉘을 사용하지만 절대 경로 이름도 사용합니다(실제로는POSIX수행 방식은 구현에 따라 정의됩니다.) 쉘의 선택에 PATH영향을 미칠 수 있는 방법은 없습니다 .ls

POSIX행동에 대해 다음과 같이 IFS말합니다.

구현이 무시할 수 있는 값IFS환경에 있든 없든IFS환경에서 쉘을 호출할 때 쉘은 다음을 설정해야 합니다.IFS<space> <tab> <newline>호출될 때 까지 .

구현에 대해 문의하는 경우아니요이런 식으로 행동하면 (POSIX는 이러한 관행이 눈에 띌 만큼 자주 발생한다는 것을 암시하기 때문에) 특정 구현이 관련이 있을 것입니다.

답변2

system명령을 실행하기 위해 호출된 셸이 환경의 값을 /bin/ls존중 하더라도 해당 명령줄의 구문 분석에는 영향을 미치지 않습니다.IFS

  1. IFS쉘 명령을 구문 분석하는 데 사용되지 않습니다. 명령은 행 표시 방법을 정확하게 지정하는 쉘 구문을 사용하여 단어로 분할됩니다. (메타 문자는 태그를 종료합니다. 일부 메타 문자도 태그입니다.)

  2. 토큰화, 존중은 인용 IFS되지 않은 입력에서만 수행됩니다.어떤 형태로든 대체를 경험합니다.따라서 명령이 이고 $cmd변수 값이 cmd이면 /bin/ls대체 IFS텍스트를 토큰화하는 데 사용됩니다. 하지만:

  3. /bin/ls단어 분할에 in을 사용한 /결과 IFS는 다음과 같습니다.성격. 첫 번째는 비어 있습니다. 빈 단어는 명령으로 사용할 수 없으므로 실행을 시도하는 대신 일종의 오류가 발생합니다 bin.

관련 정보