Czy można przedefiniować tyldę („~”, katalog domowy)?

13

Czy można przedefiniować katalog domowy? na przykład aby /ext1/usernamezamiast /home/username, czyli rozszerzania ~do innego katalogu (w przeciwieństwie do zmieniających się rzeczywisty katalog domowy w którym znajdują się pliki domowe użytkowników).

(To pytanie jest w większości akademickie, ponieważ wydaje się, że jest to zła praktyka. Nie mam również wyboru w kwestii korzystania csh, pomimo przeczytania pierwszej dziesiątki).

Andrew Cheong
źródło
11
Czy masz na myśli zmianę rzeczywistego katalogu domowego, czy masz na myśli rozszerzenie powłoki ~do czegoś innego niż rzeczywisty katalog domowy?
derobert
Miałem na myśli rozszerzenie ~do innego katalogu (nie, jeśli dobrze rozumiem twoją alternatywę, zmianę miejsca, w którym powinny znajdować się katalogi domowe wszystkich użytkowników). Nie zdawałem sobie sprawy, że ~interpretowano to jako krótką formę $HOME, jak opisał @michas w swojej odpowiedzi.
Andrew Cheong,
2
Nie wszystkie katalogi domowe użytkowników mogą zmienić tylko jeden, jak pokazuje slm w swojej odpowiedzi.
derobert,

Odpowiedzi:

28

Tylda ~jest interpretowana przez twoją powłokę. Twoja powłoka będzie interpretowana ~jako krótka forma $HOME.

Spróbować (echo ~; HOME=foo; echo ~). Powinno to najpierw wydrukować twój prawdziwy katalog domowy, a następnie „foo”, kiedy to ustawisz $HOME.

Domyślna wartość $HOMEpochodzi od konfiguracji systemu. Służy getent passwddo wyświetlania listy wszystkich znanych użytkowników i ich katalogów domowych. W zależności od konfiguracji systemu wpisy te mogą pochodzić z /etc/passwddowolnej zdalnej usługi katalogowej.

Jeśli chcesz tylko tymczasowo przedefiniować swój katalog domowy, po prostu ustaw inny $HOME.

Jeśli chcesz go na stałe zmienić, musisz zmienić hasło, np. Ręcznie edytując /etc/passwd.

michas
źródło
Dzięki, @michas. Nie mogę uwierzyć, że przegapiłem tę zmienną. (BTW, okazuje się, cshże odpowiednia zmienna to $home(małe litery), a ty nie setenv HOME /ext1/acheongmożesz - możesz tylko set home=/ext1/acheongi to działało dla mnie.)
Andrew Cheong,
2
Aby go zmienić na stałe, możesz również użyćusermod -d
user606723
1
Użyj vipw(lub dowolnego interfejsu GUI, który udostępnia Twój system operacyjny) zamiast /etc/passwdbezpośrednio edytować . Bezpośrednia edycja grozi uszkodzeniem pliku, co może być trudne do odzyskania.
Keith Thompson,
11

Wartość, która jest używana, ~jest określana na podstawie wartości uzyskanej z administracyjnej bazy danych ( getent passwd), zwykle w /etc/passwdpliku, dla zdefiniowanego tam katalogu domowego każdego użytkownika.

$ 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

Szósta kolumna w tym pliku to miejsce, z którego pochodzi wartość, gdy ktoś cd ~pisze.

nsswitch

Możesz zobaczyć, czego system użyłby do katalogu domowego użytkownika za pomocą polecenia 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

„Baza danych”, która je udostępnia, jest kontrolowana przez system rozpoznawania nazw systemu zdefiniowany w /etc/nsswitch.conf.

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

Pliki powyżej oznaczają /etc/passwd, ale „baza danych” może pochodzić na przykład z LDAP, NIS lub innych lokalizacji w sieci.

Przeprowadzka / nowa definicja?

Wykonanie tej operacji jest trochę trudne po utworzeniu kont. Jeśli tworzysz konta od zera, przedefiniowanie lokalizacji użytkownika w katalogu domowym jest trywialne. Po uruchomieniu useraddpolecenia możesz określić lokalizację, która ma być używana dla katalogu domowego użytkownika.

Przykład

$ useradd -d /ext1/acheong ...

fragment strony man

-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.

Dla istniejących kont?

Staje się to bardziej operacją chirurgiczną, ponieważ często ścieżka katalogu domowego użytkownika jest włączana statycznie do plików konfiguracyjnych, co utrudnia.

Przykład

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

Będą też muszą być stałe, albo będziesz musiał podać link od /home/samdo nowej lokalizacji /ext1/sam.

Przenoszenie, gdy „baza danych” nie jest /etc/passwd

Jeśli system pobiera katalogi domowe z LDAP, NIS itp., Musisz wykonać relokację w tych systemach i skoordynować przenoszenie plików z /home/samdo /ext1/sam.

Bibliografia

slm
źródło
Oczywiście zmiana tego wymaga przeniesienia plików użytkownika. I prawdopodobnie pozostawiając dowiązanie symboliczne na starym miejscu (w przeciwnym razie wiele rzeczy się
zepsuje
@derobert - tak, robiąc to kilka razy, staram się tego unikać jak zarazy.
slm
@slm - Dziękujemy za tak szczegółową odpowiedź (i odrobinę historii). Obawiam się, że chciałem zrobić coś znacznie prostszego - i nie byłem świadomy istnienia zmiennej środowiskowej reprezentującej katalog domowy sesji. Jestem jednak pewien, że twoja odpowiedź pomoże innym czytelnikom w przyszłości. Dzięki jeszcze raz.
Andrew Cheong,
1

Jeśli powodem jest rozłożenie użytkowników na wiele systemów plików, możesz również użyć automounter. I nawet pozwalają mieć inny katalog „podstawowy” dla użytkowników.

Sleepyweasel
źródło