3

C/C++ 프로그램에서 Bash 환경에서 Bash 함수를 정의해야합니다. 셸 쇼크 버그 전에, 나는 이런 식으로 함수를 정의 할 수 있습니다 : C 프로그램에서 해당환경에 Bash 함수 설정

my_func='() { echo "This is my function";}' 

또는를 :

setenv("my_func", "() { echo \"This is my function\";}", 1); 

또는

putenv("my_func=() { echo \"This is my function\";}"); 

그러나이 배쉬 버전을 사용 shellshock으로 고정되었으므로 환경에서 함수를 정의하는 방법을 관리 할 수 ​​없습니다.

이상한 점은 env을 실행하면 환경에 정의 된 함수를 볼 수 있지만 호출하면 배쉬는 존재하지 않는다고 말합니다.

미리 감사드립니다.

+1

가 이상한 : 기능을 내보내는 내부 및 문서화되지 않은 방법을 아는 사람은의와 문서화 방법을 알고하지 않습니다 'declare' 또는'export' ... – jm666

+2

@ jm666은''export -f''에 대해 이미 알고 있지만 C 프로그램을 통해 프로그래밍 할 필요가 있습니다. 나는''putenv'' 또는''setenv''없이 C 프로그램에서 환경으로 함수 정의를 내보내는 방법을 모른다.귀하의 답변을 주셔서 감사합니다 – JoseLSegura

+0

훨씬 더 휴대용 같은 방식으로, 어떻게 작동 할 수 있습니다 예. 'bash'가없는 환경에서는 plain-old-shell, dash, ksh, zsh 등이 있습니다. 따라서 @ starrify가 이미 알려준대로 소스를 원할 것입니다 ... – jm666

답변

2

을 (당신이 한 번만 호출되도록) 당신이 execvbash를 호출하는 경우 (설명을 위해 execl 사용) 대체 할 수있다 :

execl("/bin/bash", "bash", "file_to_run", "arg1", "arg2", 0); 

으로
execl("/bin/bash", "bash", "-c", "f() {...} g() {...}\n. $0", 
        "file_to_run", "arg1", "arg2", 0); 

그런 다음 기능을 정의하기 위해 내부 bash 인터페이스로 게임을 할 필요가 없습니다. (실행중인 bash 스크립트에도 이유가 무엇이든간에 내보낼 함수가 필요한 경우 -c 뒤에 오는 인수에 export -f <func> 행을 추가하십시오.

이렇게하면 패치 된 패치 된 패치와 패치되지 않은 샘플 모두에서 작업 할 수 있다는 장점이 있습니다.

는 (I는 다양한 프로그램과 비슷한 패치를 만드는 데, 그래서 나는 당신의 고통을 공유 할 수 있습니다.)

6

정보 제공 용도로만 사용하십시오. 함수를 환경에 내보내는 방법이 문서화되어 있지 않으므로이 API는 향후 버전 bash에서 변경 될 수있는 비공개 API의 악용으로 간주해야합니다.

환경 문자열의 함수 이름을 사용하여 더 이상 함수를 내보낼 수 없습니다. 환경에서 사용되는 이름이 더 이상 유효 bash 식별자이기 때문에

$ my_func() { echo "foo"; } 
$ export -f my_func 
$ env | grep -A1 'my_func' 
BASH_FUNC_my_func%%=() { echo "foo" 
} 

를 실행하지,이 문제를 확인하려면, 당신은 새로운 프로세스의 환경을 수정할 수 env 명령을 사용해야합니다.

env 'BASH_FUNC_my_func%%=() { echo "This is my function"; }' bash 

C에서, 당신은 단지 이름을 조정해야합니다.

setenv("BASH_FUNC_my_func%%", "() { echo \"This is my function\";}", 1); 
+0

관련이있을 수 있습니다 : [특수 제작 된 환경 변수를 통한 Bash 코드 삽입 취약점] (https://access.redhat.com/articles/1200223) – anishsane

+0

Java에서 가져온 것 programa, 제공된 구문을 사용하여 함수 정의를 설정할 수 없습니다 .' env '를 사용하면 작동합니다. –