다른 프로세스에서 구문 분석되지 않은 쉘의 비밀번호를 가져옵니다.

다른 프로세스에서 구문 분석되지 않은 쉘의 비밀번호를 가져옵니다.

그래요문제 발생쉘 프로세스의 해결되지 않은 심볼릭 링크를 가져와야 합니다. 예를 들어, 심볼릭 링크 ~/link-> 가 주어지면 ~/actualbash가 를 사용하여 시작되면 bash 프로세스 외부에서 가져와야 합니다.$PWD~/link

얻다해결하다cwd는 lsof또는를 사용하여 /proc호출 할 수 있습니다.https://unix.stackexchange.com/a/94359/115410그러나 나는 그것을 얻는 것이 불가능하다고 생각하기 시작했습니다.결정하지 않았다길.

lsof -b없이 사용해 보았지만 readlink로깅에는 경로가 어쨌든 시도되지 않았음을 나타냅니다 readlink. /proc/.../environ로 환경을 읽고 구문 분석하는 것이 가능해 보이지만 PWD속도가 느리고 /proc시스템에 존재하지 않을 수 있으며 프로세스 환경을 읽으려고 하면 보안에 영향을 미칠 수 있다고 생각합니다.

제가 고치려고 하는 문제가 있는 코드는 다음과 같습니다.

lsofmacOS에서:

exec('lsof -OPln -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => {
  ...
});

/proc리눅스에서:

Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`);

답변1

현재 작업 디렉토리의 논리값(논리적 cwd, "분석되지 않은 pwd"라고 부르는 것)은 커널이 아닌 쉘의 내부 개념입니다. 커널은 완전히 확인된 경로(물리적 cwd)만 기억합니다. 따라서 공통 시스템 인터페이스를 통해서는 필요한 정보를 얻을 수 없습니다. 쉘의 협조를 얻어야 합니다.

환경 PWD변수는 쉘이 논리적 cwd를 하위 프로세스로 전송하는 방법입니다. 쉘이 다른 쉘을 실행하면 부모는 PWD논리적 cwd로 설정되고(프로그램이 실행될 때마다 수행됨) 자식은 PWD값이 PWD합리적인지 확인하고, 그렇다면 이를 논리적 cwd로 사용하여 다음으로 돌아갑니다. 물리적 CWD. $PWD누락되었거나 잘못된 경우 cwd입니다 .

관찰하다:

#!/bin/sh
mkdir /tmp/dir
ln -sf dir /tmp/link
cd /tmp/link
sh -c 'echo Default behavior: "$PWD"'
env -u PWD sh -c 'echo Unset PWD: "$PWD"'
PWD=/something/fishy sh -c 'echo Wrong PWD: "$PWD"'
rm /tmp/link
rmdir /tmp/dir

산출:

Default behavior: /tmp/link
Unset PWD: /tmp/dir
Wrong PWD: /tmp/dir

프로세스 환경을 읽는 것은 특정 보안 관련 의미를 갖지 않지만 PWD프로세스가 시작되었을 때의 값이 무엇인지 알려줍니다. 처리 후 다른 디렉터리로 변경하면 환경의 값은 더 이상 관련이 없습니다. 쉘이 이제 다른 프로세스를 실행 중인 경우 필요한 것은 환경의 값입니다. 그러나 이것이 발생하는 유일한 방법은 실제로 쉘이 다른 프로세스를 실행하도록 하는 것입니다.

GUI가 실행 중인 셸의 cwd를 찾는 일반적인 방법은 셸에서 이를 인쇄하도록 하는 것입니다. 때때로 이 정보가 필요하고 쉘 구성에 대한 최대 제어권을 사용자에게 맡기고 싶다면 쉘이 프롬프트를 표시하고 명령을 실행하는지 확인하십시오 pwd. 이는 간단하고 csh 및 Fish와 같은 "이국적인" 쉘에서도 작동하지만 특수한 경우(예: 개행 문자가 포함된 디렉토리 이름)에서는 모호합니다. 쉘 구성을 조정할 수 있는 경우 프롬프트가 표시될 때마다( PS1많은 쉘의 경우, 현재 디렉토리를 포함하도록 만드는 방법은 다양함) 또는 디렉토리를 변경할 때( chpwd_functionszsh에서) 쉘이 이스케이프 시퀀스를 인쇄하도록 할 수 있습니다. 더 침입적인 방식으로 다른 껍질을 제거합니다).

논리적 cwd의 구성 요소가 이동 또는 삭제되었거나 기호 링크가 다른 곳을 가리키도록 변경된 경우 이 값이 잘못될 수 있습니다. 반면에 물리적 cwd는 항상 정확합니다. (디렉터리가 삭제된 경우 and와 같은 모든 프로그램이 정보를 얻는 Linux는 대상이 Report로 끝나는 깨진 기호 링크로 표시됩니다.) 논리적 cwd를 찾으면 아마도 물리적 cwd와 일치하는지 확인하고 일치하지 않으면 물리적 cwd로 대체합니다./proc/PID/cwdpslsof(deleted)lsof

관련 정보