2012-06-21 4 views
2

나는 간단한 C 프로그램을 작성하지있을 경우에도 성공) (getlogin이된다. 나는 제어 터미널이 없다는 것을 확인함으로써 getlogin()을 만들지 못하게 만들었지 만 여전히 로그인 이름을 얻고 그것을 인쇄하고 있습니다. 설명의 방식으로는 왜 제어 터미널

#!/bin/bash 
for i in $(env | grep -vP ^PATH\\b | awk -F= \{print \$1\}); do 
    unset $i; 
done; 
(tty; perl -e 'setpgrp; sleep(1); exec(qw(getlogin_test));') & 

: 가장 극단적 인 예는이를 입증 할 않은 세트 PATH 제외한 모든 환경 변수를하고 나서 펄 인스턴스 'TTY'을 실행하는 서브 셀을 실행; 하위 셸이 백그라운드로 설정됩니다. setpgrp를 호출하여 프로세스 그룹을 사용하여 부모의 제어 터미널을 찾지 못하게합니다 (나는 그렇게하지 않는다고 생각하지만, 가정이 잘못되었을 때를 대비해 넣습니다).

이 시점에서, 나는 손실에 처해있다. 여전히 사용자 이름이 인쇄됩니다. 나는 꽤 많은 소스에서 본 것보다 간단한 예는 동일한 동작이 있습니다

sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' &' 
sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' & wait' 

이 모두 여전히 펄의 서로 다른 버전의 솔라리스 10과 레드햇 (6) 모두에서 사용자 이름을 인쇄, 배쉬, 쉬, 및 tcsh.

+0

getlogin이은() 가능성이 확보되지 않은 사용자 이름을 알아 내기 위해 무엇이든 그것을 할 수있는 노력하고있다. –

+0

당신의 프로세스는 여전히 제어 터미널을 가지고 있습니다. 당신이 어떤 단계를 거쳐야하는지 확실하지 않습니다. – nos

+0

@nos 나는 백그라운드에서 던지면 제어 터미널을 제거해야한다는 인상 아래에있었습니다. –

답변

1

닫기 또는 파일에 STDIN을 리디렉션하는 트릭을 수행합니다.

$ perl -wE'say getlogin()' 
eric 

$ perl -wE'open STDIN, "<", "/dev/null" or die $!; say getlogin()' 
Use of uninitialized value in say at -e line 1. 

는 데비안 상자에 자체 내장 된 펄 (기본 옵션)입니다.

+0

hm. 펄 5.10.1 : perl -wE open (STDIN, "<", "/ dev/null") 또는 죽는 "$! \ n"; 내 $ 사용자 = getlogin(); print ("$ user \ n"); ''...하지만 여전히 내 사용자 이름을 출력합니다. glibc에/리눅스에서 –

+0

getlogin이()는 그 실패하지 않는 한 정말 제어 터미널에 대해 상관하지 않는다 "은/proc/셀프/loginuid"주위 찌른다 및 getpwuid_r를 호출합니다. – nos

+0

분명히 Redhat의 결과를 설명하지만, Solaris perl에서는 glibc를 사용하지 않습니다. 소켓, nsl, dl, m 및 c 만로드합니다. –