Erzwingen Sie die Änderung des cwd eines Benutzers als Root

Erzwingen Sie die Änderung des cwd eines Benutzers als Root

Ich möchte den Prozess eines Benutzers so ändern, dass ich seinen cwd festlegen kann.

Verwandte undsekundärZur Frage: Ich habe ein Dateisystem, das ich aushängen möchte, aber ein Benutzer sitzt mit einem Bash-Prozess darauf. Ich möchte den Prozess dieses Benutzers nicht beenden, aber ich möchte ihn sanft umleiten, beispielsweise auf ... /tmp, während ich die Festplatte aushänge.

Ich bin offensichtlich Root.

Antwort1

Es gibt keine Möglichkeit, das Arbeitsverzeichnis eines Prozesses von außerhalb zu ändern, egal ob man Root ist oder nicht. Das wäre für den betroffenen Prozess äußerst störend und es gibt einfach keine API dafür.

Jetzt könnten Sie schmutzige Tricks anwenden. Einer davon besteht darin, einen Debugger an Ihren Zielprozess anzuhängen und chdirihm ein aufzuzwingen - siehediese Frage auf Stack Overflow. Einige Betriebssysteme bieten möglicherweise andere APIs für solche Aufgaben (Einschleusen von Systemaufrufen in ahnungslose Prozesse).

Was Ihr Ziel angeht, ein Dateisystem von jemandem neu zu mounten, ist das im Grunde aussichtslos, selbst wenn Sie es technisch schaffen, es zu hacken – es besteht die Möglichkeit, dass der Prozess offene Dateideskriptoren auf dem „alten“ Mount hat, und es gibt keine portable Möglichkeit, sie korrekt wieder an Dateien auf dem „neuen“ Mount anzuhängen, selbst wenn die entsprechenden Dateien noch da sind.
Ein Ansatz, der theoretisch funktionieren würde, wäre, die Prozesse, die Sie für diese Wartung aus dem Weg haben möchten, sozusagen in den Ruhezustand zu versetzen. Aber das bringt viele Probleme mit sich, insbesondere wenn man nicht nur einfache Dateien, sondern auch Netzwerk-Sockets berücksichtigt. (Siehediese andere Fragefür einige interessante Punkte.)

Kurz gesagt, Sie sind mit einer höflichen Art kill(mit einer Schonfrist) besser dran; man kann nie wissen, welche unerwarteten Konsequenzen sich aus dem Spielchen mit cwdeinem zufälligen Prozess ergeben könnten.

Antwort2

Ein Prozess ist für die Verwaltung seines eigenen aktuellen Verzeichnisses verantwortlich. Es gibt keine Möglichkeit, es von außen zu ändern.

Sie können schummeln, indem Sie den Prozess sein eigenes Verzeichnis wechseln lassen. Wenn Sie als Root oder als derselbe Benutzer wie der Prozess arbeiten, können Sie denptraceSystemaufruf, um alle möglichen invasiven Dinge an einem Prozess durchzuführen, einschließlich der Änderung des Speichers unter der Nase des Prozesses und der Ausführung von Systemaufrufen. Dies wird von Debuggern verwendet.

Behandeln Sie dies wie eine experimentelle Operation. Der Patient kann unverletzt aufwachen oder sterben. Dies sollte funktionieren, wenn es dem Prozess egal ist, in welchem ​​Verzeichnis er sich gerade befindet. Ein Programm, das eine enge Beziehung zu seinem aktuellen Verzeichnis hat, wie etwa eine Shell, wird wahrscheinlich nicht überleben.

Hier ist ein Skript, das ich in der Vergangenheit verwendet habe, um Prozesse aus hängenden NFS-Mounts zu verschieben. Die Verwendung erfolgt auf eigene Gefahr.

#!/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

verwandte Informationen