Gibt es einen symbolischen Standardlink zum Home-Verzeichnis des aktuellen Benutzers?

9

Die Shell kann ~in Ihr Home-Verzeichnis erweitert werden. $HOMEhat normalerweise das gleiche Angebot, aber häufig möchten Sie aus einem Kontext, der eine solche Erweiterung möglicherweise nicht unterstützt, auf das Home-Verzeichnis des aktuellen Benutzers verweisen.

Ich hatte Konfigurationsdateien, in denen es $HOMEfunktioniert, ~aber nicht und umgekehrt.

Ich würde vermuten, dass die Sicherung etwas in diese Richtung liefern könnte, so etwas wie /var/myself->$HOME

Damit konnte ich Werte in Konfigurationsdateien platzieren, um auf Dinge wie zu verweisen /var/myself/backdrops/pornography/wtf/yarly.jpg

Gibt es so etwas schon? Wenn nicht, gibt es gute Gründe dafür, dass es so etwas nicht gibt?

Lerc
quelle
2
Dies scheint tatsächlich eine wirklich gute Idee zu sein, und Fuse könnte dies ziemlich trivial tun, wenn ich mich richtig an die Schnittstelle erinnere
Michael Mrozek

Antworten:

6

Ich verstehe Ihre Besorgnis, aber die Antwort lautet "nein", so etwas gibt es nicht.
Die übliche Methode besteht darin, das Betriebssystem nach dem Home-Pfad des Benutzers zu fragen oder die Variable $ HOME abzurufen.

Alle diese Optionen erfordern immer eine Codierung von der Anwendung. Viele Anwendungen, wie z. B. bash, bieten den "Alias" ~ (open (2) übersetzt das nicht).

Dazu könnte natürlich ein vfs oder ein Sicherungsmodul implementiert werden. Wahrscheinlich gibt es etwas zu tun, das werde ich fragen!

Aber wird es wirklich gebraucht? Sie können eine Problemumgehung wie folgt verwenden:

Keymon
quelle
Ich frage nach dem vfs-Tool: unix.stackexchange.com/questions/1811/…
Keymon
0

Ein Trick (zumindest unter Linux) wäre, $HOMEvor dem Ausführen der App /proc/self/cwd/...in das Verzeichnis zu wechseln und dann in der Konfigurationsdatei zu verwenden.

Neil Mayhew
quelle
Ich mag die Hackigkeit davon, aber vermutlich würde es auf Probleme stoßen, wenn der Prozess das aktuelle Verzeichnis ändert. Ich möchte ein / proc / PID / iwd für das erste Arbeitsverzeichnis.
Lerc
... und für diese Angelegenheit ein / proc / PID / home
Lerc
@Lerc, wenn es in eine Konfigurationsdatei geht, muss es /proc/selfnicht sein /proc/PID, da Sie nicht im Voraus wissen können, wie die PID sein wird.
Neil Mayhew
@Lerc, ja, wenn der Prozess das Verzeichnis ändert, schlägt dies fehl, aber normalerweise lesen Programme die Konfigurationsdatei beim Start einmal und speichern dann die Werte im Speicher zwischen. Es hängt alles von dem Programm ab, mit dem Sie arbeiten, und wenn das Programm weder in der Befehlszeile noch in der Syntax der Konfigurationsdatei genügend Flexibilität bietet, stecken Sie fest.
Neil Mayhew
Ja, ich meinte / proc / PID / home, um zu bedeuten, dass alle proc / PID-Verzeichnisse dies unterstützen und daher / proc / self
Lerc
0

In den meisten Programmen können Sie in der Befehlszeile einen Pfad zur Konfigurationsdatei angeben. Sie können also einen Wrapper schreiben, der eine Standardkonfigurationsdatei verwendet, diese filtert, $HOMEum beispielsweise den aktuellen Benutzer zu ersetzen , und dann die geänderte temporäre Konfigurationsdatei an das Programm übergeben.

Neil Mayhew
quelle
Wenn Sie dies tun, haben Sie dem Benutzer effektiv die Möglichkeit genommen, einen Pfad zur Konfigurationsdatei anzugeben. Könnte machbar sein, wenn Sie Rallye-Lust mit einer Wrapper-Exe bekommen.
Lerc
0

Sie können die PID des Anforderungsbenutzers abrufen und das System nach seinem Ausgangsverzeichnis fragen. So ist es möglich.

Ich bin mir jedoch nicht sicher, ob es keine SUID-Programme gibt, die FS als statisch annehmen würden.

Bearbeiten:

struct fuse_context *ctx = fuse_get_context ();
struct passwd pwd, *ppwd;
char buffer[1024];
int status = getpwuid_r (ctx->ui, &pwd, buffer, sizeof(buffer), &ppwd);
if (status == 0) {
  if (ppwd == NULL) {
    // No record found
  } else {
    // Handle record
  }
} else {
    // Handle error
} 

Der obige Code ist nicht ideal, sollte aber für häufige Fälle funktionieren.

Maciej Piechotka
quelle
Wie würden Sie sein Home-Verzeichnis finden, nachdem Sie wissen, um welchen Benutzer es sich handelt?
WhyNotHugo
Verwenden von getpwuidoder getpwuid_r.
Maciej Piechotka