Ist es möglich, die Tilde neu zu definieren ('~', Ausgangsverzeichnis)?

13

Ist es möglich, das Home-Verzeichnis neu zu definieren? ZB zu /ext1/usernameanstatt /home/username, dh ~zu einem anderen Verzeichnis zu erweitern (im Gegensatz zum Ändern des tatsächlichen Ausgangsverzeichnisses, in dem sich die Ausgangsdateien der Benutzer befinden).

(Diese Frage ist größtenteils akademisch, da dies eine schlechte Praxis zu sein scheint. Ich habe auch keine andere Wahl in Bezug auf die Verwendung csh, obwohl ich die Top 10 gelesen habe.)

Andrew Cheong
quelle
11
Meinen Sie damit , das eigentliche Basisverzeichnis zu ändern , oder wollen Sie die Shell ~auf etwas anderes als das eigentliche Basisverzeichnis erweitern ?
Derobert
Ich wollte das ~auf ein anderes Verzeichnis erweitern (nicht, wenn ich Ihre Alternative richtig verstehe, ändern, wo sich die Home-Verzeichnisse aller Benutzer befinden sollen). Mir war nicht klar, dass dies ~als Kurzform von interpretiert wurde $HOME, wie @michas in seiner Antwort beschrieben hat.
Andrew Cheong
2
Nicht bei allen Benutzerverzeichnissen können Sie nur eines ändern, wie slm in seiner Antwort zeigt.
Derobert

Antworten:

27

Die Tilde ~wird von Ihrer Shell interpretiert. Ihre Muschel wird ~als Kurzform von interpretiert $HOME.

Versuchen Sie es (echo ~; HOME=foo; echo ~). Dies sollte zuerst Ihr echtes Home-Verzeichnis und danach "foo" ausgeben, wie Sie dies eingestellt haben $HOME.

Der Standardwert von $HOMEstammt aus Ihrer Systemkonfiguration. Verwenden Sie getent passwddiese Option, um alle bekannten Benutzer und ihre Home-Verzeichnisse aufzulisten. Abhängig von Ihrer Systemkonfiguration können diese Einträge von einem /etc/passwdbeliebigen Remote-Verzeichnisdienst stammen.

Wenn Sie Ihr Home-Verzeichnis nur vorübergehend neu definieren möchten, legen Sie einfach ein anderes fest $HOME.

Wenn Sie es dauerhaft ändern möchten, müssen Sie den passwd-Eintrag ändern, z /etc/passwd. B. durch manuelles Bearbeiten .

michas
quelle
Danke, @michas. Ich kann nicht glauben, dass ich diese Variable verpasst habe. (Übrigens stellt sich heraus, dass cshdie relevante Variable $home(Kleinbuchstaben) ist, und Sie können nicht setenv HOME /ext1/acheong- Sie können nur set home=/ext1/acheong, und das hat bei mir funktioniert.)
Andrew Cheong
2
Um es dauerhaft zu ändern, können Sie auchusermod -d
user606723
1
Verwenden Sie vipw(oder eine andere GUI, die Ihr Betriebssystem bereitstellt), anstatt sie /etc/passwddirekt zu bearbeiten . Bei der direkten Bearbeitung besteht das Risiko, dass die Datei beschädigt wird, und es kann schwierig sein, sie wiederherzustellen.
Keith Thompson
11

Der Wert, für den verwendet ~wird, wird aus dem Wert bestimmt, den Sie aus der Verwaltungsdatenbank ( getent passwd) (normalerweise in der /etc/passwdDatei) für das dort definierte Basisverzeichnis jedes Benutzers erhalten.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

Die sechste Spalte in dieser Datei enthält den Wert, der verwendet wird, wenn jemand etwas eingibt cd ~.

nsswitch

Mit dem folgenden Befehl können Sie sehen, was ein System für das Basisverzeichnis des Benutzers verwenden würde getent passwd:

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

Die "Datenbank", die diese bereitstellt, wird über den in definierten System-Resolver gesteuert /etc/nsswitch.conf.

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

Dateien oben bedeuten /etc/passwd, aber die "Datenbank" könnte zum Beispiel von LDAP, NIS oder anderen Standorten über das Netzwerk stammen.

Umzug / Neudefinition?

Die Durchführung dieser Operation ist nach dem Erstellen der Konten etwas kompliziert. Wenn Sie Konten von Grund auf neu erstellen, ist es trivial, den Speicherort des Basisverzeichnisses eines Benutzers neu zu definieren. Wenn Sie den useraddBefehl ausführen, können Sie den Speicherort angeben, der für das Basisverzeichnis eines Benutzers verwendet werden soll.

Beispiel

$ useradd -d /ext1/acheong ...

Auszug aus der Manpage

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the users 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

Für bestehende Konten?

Dies wird eher zu einem chirurgischen Eingriff, da der Pfad des Basisverzeichnisses eines Benutzers häufig statisch in Konfigurationsdateien eingeschlossen wird, was ihn schwieriger macht.

Beispiel

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

Diese müssen entweder repariert werden oder Sie müssen einen Link /home/samzum neuen Speicherort angeben /ext1/sam.

Verschieben, wenn "Datenbank" nicht ist /etc/passwd

Wenn das System die Basisverzeichnisse von LDAP, NIS usw. erhält, müssen Sie die Verlagerung in diesen Systemen durchführen und das Verschieben der Dateien von /home/samnach koordinieren /ext1/sam.

Verweise

slm
quelle
Um dies zu ändern, müssen natürlich die Dateien des Benutzers verschoben werden. Und wahrscheinlich einen Symlink an der alten Stelle hinterlassen (da sonst vieles kaputt geht ...)
derobert
@derobert - ja, nachdem ich das ein paar Mal gemacht habe, versuche ich, es wie die Pest zu vermeiden.
slm
@slm - Danke für eine so ausführliche Antwort (und das bisschen Geschichte). Ich fürchte, ich wollte etwas viel Einfacheres tun - und wusste nichts von der Existenz einer Umgebungsvariablen, die das Basisverzeichnis der Sitzung darstellt. Ich bin mir jedoch sicher, dass Ihre Antwort einem anderen Leser in Zukunft helfen wird. Danke noch einmal.
Andrew Cheong
1

Wenn der Grund darin besteht, Benutzer auf mehrere Dateisysteme zu verteilen, können Sie auch die verwenden automounter. Und Sie können sogar ein anderes "Basis" -Verzeichnis für Ihre Benutzer einrichten.

Schlafwiesel
quelle