2014-10-21 4 views
1

다음 바이너리에서 사용할 환경 변수를 수정하는 간단한 bash 스크립트가 있습니다. 기본 스크립트 :쉘 shock 고정 bash 버전이있는 임포트되지 않은 환경 변수

#!/bin/bash 
export DBROOT="NEW_DIRECTORY" 
export TERM=xterm 
su -c " <test_process> " - omni 

"test_process"는 환경 변수로 DBROOT 변수를 사용합니다. 또한 DBROOT는 글로 z 환경 변수로 다른 값 "OLD_DIRECTORY"로 정의됩니다. 스크립트의 목표는 "test_process"가 NEW_DIRECTORY 값 (내 보낸 값)을 사용하도록 강제하는 것입니다.

비 패치 bash 버전에서는 테스트가 효과적이었습니다. 그러나 bash에서 shellshock 버그를 패치 한 후에 test_process는 글로벌 환경 변수가 아닌 DBROOT의 내 보낸 값을 읽지 않습니다. 마치 "test_process"가 내 보낸 변수와 전역 변수를 무시하는 것과 같습니다.

"test_process"소스 코드가 없습니다. 배쉬 버전 (bash는-2.05b-41.7.i386.rpm이다 RPM 버전)을 -release (1) 버전 2.05b.0 내가 릴리스 3

AS 은 Red Hat Enterprise Linux에서 실행 해요

업데이트 : 컴파일 시간을 정의에게

#define NON_INTERACTIVE_LOGIN_SHELLS

을 설정하여 bash는 2.05b 마지막으로 소스를 컴파일 한 후 스크립트를 다시했다. 이 정의가 없으면 bash는 su 명령 뒤에 - 문자를 잘못 해석했습니다.

+0

포탄 이동을위한 최종 승인 패치는 함수를 자체 네임 스페이스로 내 보낸 (그리고 파서 버그를 수정합니다). 물론 RHEL3의 고대 쉘로 백 포팅 한 사람이라면 실수를 저지를 수 있었을 지 모르지만 여기에 코드에 영향을 줄 것이라고 믿는 것이 다소 어렵습니다. 또한 'su'는 일반적으로 움직이는 부분이 많습니다. 쉘 외부에서 잘못 될 수있는 부분이 없습니다. –

+1

아무튼 - 만약'su'가 문제가 아니라는 것을 확실하게 알고 싶다면 그냥 꺼내서 재현 할 수 있는지 확인하십시오; ('su' 명령 대신)'bash'를 마지막으로 실행하여 문제를 일으킬 수 있다면'DBROOT'가 설정되어 있는지 확인하십시오. 실제로 그 시점에서 설정되어 있지 않다면, 시스템의 다른 곳에서 발생하는 것이 아니라 배포판의 쉘 샷 패치의 버그라는 것을 알게됩니다. –

+2

'su'는 일반적으로 pre-su 환경 변수를 의도적으로 덤프합니다. 그렇지 않으면 보안 문제가됩니다. 플래그는 실제로는 두 개입니다 :'-m'. 고대 버전 AS 3이 사용하고있는 모든 것이 사실인지 전혀 모르겠지만. –

답변

4

사용중인 꽤 오래된 소프트웨어입니다.

내가 노력 제안 :

su -c "DBROOT='NEW_DIRECTORY' TERM='xterm' <test_process> " - omni 

이 오히려 환경을 릴레이 su에 의존하지 않고, su 운영하는 쉘에 환경 설정으로 이동합니다.

+0

제안대로 'DBROOT'을 설정하면' '가 값을 상속합니다. 그러나 다른 env 변수가 상속되지 않기 때문에 다른 문제가 나타납니다. 'su -c ""를 시도함으로써 명령은 전역 변수와 내 보낸 변수를 상속 받았다. bash 코드를 조사해 보면'su -c' 명령으로'-bash'가 시작된다는 것을 알게되었습니다. 그래서''가 문제였습니다. 배쉬 코드에서'#define NON_INTERACTIVE_LOGIN_SHELLS'을 설정함으로써, 문제가 해결되었습니다. – Mou