사용자의 cwd를 루트로 강제 변경

사용자의 cwd를 루트로 강제 변경

cwd를 설정할 수 있도록 사용자 프로세스를 변경하고 싶습니다.

관련성이 있고,중학교이 질문의 경우 마운트 해제하려는 파일 시스템이 있지만 사용자는 bash 프로세스를 사용하여 그 위에 앉아 있습니다. 해당 사용자의 프로세스를 종료하고 싶지는 않지만 디스크가 마운트 해제될 때 프로세스를 .../tmp로 부드럽게 리디렉션하고 싶습니다.

나는 분명히 루트입니다.

답변1

루트 여부에 관계없이 프로세스 외부에서 작업 디렉터리를 변경할 수 있는 방법은 없습니다. 이로 인해 피해자 프로세스에 큰 간섭이 발생하며 해당 API가 없습니다.

이제 더러운 트릭을 사용할 수 있습니다. 그 중 하나는 대상 프로세스에 디버거를 연결하고 강제 실행하는 것입니다 chdir.스택 오버플로에 대한 이 질문. 일부 운영 체제에서는 이러한 작업(의심하지 않는 프로세스에 시스템 호출 삽입)을 수행하기 위해 추가 API를 제공할 수 있습니다.

누군가로부터 파일 시스템을 재설치하려는 목표는 기술적으로 해킹하더라도 기본적으로 절망적입니다. 프로세스가 "이전" 설치에서 파일 설명자를 열 가능성이 높으며 이식 가능한 방법이 없습니다. 제대로 다시 설치하는 방법 - 해당 파일이 아직 존재하더라도 이를 "새" 설치의 파일에 추가합니다.
이론적으로 가능해 보이는 것은 유지 관리에 방해가 되지 않도록 원하는 프로세스를 최대 절전 모드로 전환하는 것입니다. 그러나 특히 일반 파일뿐만 아니라 네트워크 소켓을 고려하면 많은 문제가 있습니다. (바라보다이것은 또 다른 질문입니다몇 가지 흥미로운 점. )

간단히 말해서, 예의를 갖추는 것이 좋으며 (유예 기간을 가짐), 임의의 프로세스로 게임을 플레이함으로써 의도하지 않은 결과가 발생할 수 있는지 kill아무도 모릅니다 .cwd

답변2

프로세스는 자신의 현재 디렉터리를 관리하는 역할을 담당합니다. 외부에서 변경할 수 있는 방법은 없습니다.

프로세스가 자체 디렉터리를 변경하도록 하여 속임수를 쓸 수 있습니다. 루트 또는 프로세스와 동일한 사용자로 실행 중인 경우 다음을 사용할 수 있습니다.ptrace시스템 호출은 메모리 변경, 프로세스 바로 앞에서 시스템 호출 실행 등 프로세스에 대한 다양한 침입 작업을 수행합니다. 이것이 디버거가 사용하는 것입니다.

실험적인 수술이라고 생각해보세요. 환자는 상처 없이 깨어나거나 사망할 수도 있습니다. 프로세스가 현재 디렉터리가 무엇인지 실제로 신경 쓰지 않는다면 이것이 작동할 것입니다. 현재 디렉터리와 밀접하게 관련된 프로그램(예: 셸)은 살아남을 가능성이 없습니다.

다음은 정지된 NFS 마운트에서 프로세스를 이동하기 위해 과거에 사용한 스크립트입니다. 자신의 책임하에 사용하십시오.

#!/bin/sh
if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF

관련 정보