以 root 身分強制更改使用者的 cwd

以 root 身分強制更改使用者的 cwd

我希望更改用戶的進程,以便我可以設定它的 cwd。

相關的,以及中學對於這個問題,我有一個想要卸載的檔案系統,但使用者正在使用 bash 進程坐在它上面。我不想終止該用戶的進程,但我想在卸載磁碟時輕輕地將它們重定向到.../tmp。

我顯然是root。

答案1

沒有辦法從進程外部更改其工作目錄,無論是否為 root。這會對受害進程造成極大的干擾,而且沒有對應的 API。

現在你可以使用骯髒的伎倆了。其中之一是將偵錯器附加到目標進程,並強制執行chdir- 請參閱Stack Overflow 上的這個問題。某些作業系統可能會提供其他 API 來執行此類任務(在毫無戒心的進程中註入系統呼叫)。

至於您從某人下重新安裝文件系統的目標,這基本上是沒有希望的,即使您在技術上設法破解它- 很可能該進程將在“舊”安裝上打開文件描述符,並且沒有可移植的方法來正確地重新安裝- 將它們附加到“新”安裝上的文件,即使相應的文件仍然存在。
理論上似乎可行的方法是休眠您想要的進程,以使其不妨礙維護。但這存在很多問題,特別是不僅考慮到普通文件,還考慮到網路套接字。 (看這另一個問題一些有趣的觀點。

簡而言之,你最好有禮貌kill(有寬限期),沒有人知道在cwd隨機過程中玩遊戲會產生什麼意想不到的後果。

答案2

進程負責管理自己的目前目錄。沒有辦法從外部改變它。

您可以透過讓進程更改自己的目錄來作弊。如果您以 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

相關內容