fth*_*ker 6 process root directory cd-command
我希望更改用户的进程,以便我可以将其设置为 cwd。
与问题相关且次要问题,我有一个我想卸载的文件系统,但用户正在使用 bash 进程坐在它上面。我不想终止该用户的进程,但我想在卸载磁盘时轻轻地将它们重定向为 ... /tmp。
我明明是root。
Mat*_*Mat 10
无法从外部更改进程的工作目录,无论是否为 root。这对受害者进程来说会非常令人不安,而且它没有 API。
现在你可以使用肮脏的把戏。其中之一是将调试器附加到您的目标进程,并对其强制执行chdir- 请参阅Stack Overflow 上的这个问题。某些操作系统可能会提供其他 API 来执行此类任务(在毫无戒心的进程中注入系统调用)。
至于您从某人下面重新挂载文件系统的目标,这基本上是无望的,即使您在技术上设法破解它 - 该进程可能会在“旧”挂载上打开文件描述符,并且没有可移植的方法来正确地重新安装- 将它们附加到“新”安装上的文件,即使相应的文件仍然存在。
一种在理论上似乎可行的方法是让您想要的进程休眠以进行维护。但是这有很多问题,尤其是不仅要考虑普通文件,还要考虑网络套接字。(有关一些有趣的观点,请参阅其他问题。)
简而言之,你最好有礼貌kill(有一个宽限期),不知道cwd在随机过程中玩游戏会产生什么意想不到的后果。
一个进程负责管理它自己的当前目录。没有办法从外面改变它。
您可以通过使进程更改其自己的目录来作弊。如果您以 root 身份运行,或者作为进程的同一用户运行,则可以使用ptrace系统调用对进程执行各种侵入性操作,包括更改其鼻子下的内存和执行系统调用。这是调试器使用的。
将此视为实验性外科手术。患者可能会毫发无伤地醒来或死亡。如果进程并不真正关心它的当前目录是什么,这应该可以工作。与其当前目录有密切关系的程序(例如 shell)不太可能存活下来。
这是我过去用来将进程从挂起的 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
Run Code Online (Sandbox Code Playgroud)