Jak mogę zmienić folder domowy Cygwin po instalacji?

121

Właśnie zainstalowałem Cygwin i wygląda na to, że katalog domowy w zachęcie bash znajduje się na moim dysku Z:. Nie tego chcę.

Jak mogę to zmienić?

Nathan Long
źródło
1
Dla tych, którzy używają Cygwin 1.7.34 lub nowszego, użyj metod wyjaśnionych w innych postach, ale nie zapomnij usunąć znaku # przed usunięciem db_home:cudzysłowu i sprawić, by działał.
Maieul

Odpowiedzi:

180

Począwszy od Cygwin 1.7.34 , zalecanym sposobem jest dodanie niestandardowego db_homeustawienia do /etc/nsswitch.conf. Powszechnym życzeniem podczas robienia tego jest uczynienie katalogu domowego Cygwin równym katalogowi profilu użytkownika Windows. To ustawienie zrobi to:

db_home: windows

Lub równoważnie:

db_home: /%H

Musisz użyć tego drugiego formularza, jeśli chcesz zmienić ten schemat, na przykład posegregować pliki domowe Cygwin do podkatalogu katalogu profilu użytkownika systemu Windows:

db_home: /%H/cygwin

Istnieje kilka innych alternatywnych schematów tej windowsopcji oraz kilka innych %tokenów, których można użyć zamiast niej %Hlub oprócz niej. Patrz na nsswitch.confopis składni w Użytkownikowi Cygwin przewodnik dla szczegółów.

Jeśli zainstalowałeś Cygwin przed 1.7.34 lub uruchomiłeś jego mkpasswdnarzędzie , aby mieć /etc/passwdplik, możesz zmienić katalog domowy Cygwin, edytując wpis użytkownika w tym pliku. Twój katalog domowy jest przedostatnim elementem w wierszu użytkownika w /etc/passwd

Niezależnie od tego, jak to zrobisz, spowoduje to ustawienie HOMEzmiennej środowiskowej podczas uruchamiania powłoki.²

Zobacz ten artykuł FAQ, aby uzyskać więcej informacji na ten temat.


Przypisy:

  1. Rozważ przeniesienie się /etc/passwdi /etc/groupzejście z drogi, aby zamiast tego użyć nowego mechanizmu opartego na SAM / AD .

  2. Chociaż można to po prostu ustawić %HOME%za pośrednictwem Panelu sterowania, oficjalnie jest to odradzane . Nie tylko bezceremonialnie przesłania powyższe mechanizmy, ale nie zawsze działa, na przykład podczas uruchamiania skryptów powłoki za pośrednictwem cron.

Warren Young
źródło
3
Zauważ, że jeśli zainstalowano powłoki bash Git z git-scm.com/download/win , to może mieć problemy z Cygwin zainstalować (w zależności od opcji wybranych). Mój cygwin ~ trafił do mojego katalogu użytkownika Win7 i sshnie działałby poprawnie, dopóki nie został zmodyfikowany /etc/passwdzgodnie z opisem.
Allan
Problemy, o których @Allan wspomina tutaj z instalacjami git, rozwiązuje się przez ustawienie zmiennej środowiskowej Windows dla HOME, a następnie ponowne utworzenie /etc/passwdpliku. Zobacz moją odpowiedź tutaj, aby uniknąć takich problemów.
Christopher,
11
db_home: /%Hmoże rozwiązać nazwę użytkownika domeny (zamiast nazwy użytkownika lokalnego), która może nie być taka, jaką chciałbyś mieć. db_home: /cygdrive/c/Users/%Uzrobił, co chciałem.
Abdull
2
Widzę różnicę w wydajności między różnymi metodami. Kiedy używam db_home: windows, shuruchomienie zajmuje około 2,5 do 3,5 sekundy. Kiedy używam db_home: /cygdrive/c/Users/%U, shuruchomienie zajmuje około 0,9 do 1,0 sekundy. Po usunięciu db_homelinii lub zakodowaniu go na stałe w katalogu domowym systemu Windows, shuruchomienie zajmuje około 0,2 do 0,3 sekundy. Idę z rozwiązaniem zakodowanym na stałe, np. db_home: /cygdrive/c/Users/susamDlatego, że często uruchamiam skrypty powłoki z wiersza polecenia za pomocą shpolecenia, np. sh foo.shI czekanie dłużej niż 2 sekundy staje się niewygodne.
Susam Pal
1
Dziękuję @abdull, db_home: / cygdrive / c / Users /% U to odpowiedź, której potrzebowałem. db_home: Windows używa "/ home /% U", który nie istnieje w mojej konfiguracji.
Jeff
74

Cygwin 1.7.34+

Dla tych, którzy używają Cygwin 1.7.34 lub nowszego Cygwin obsługuje konfigurację sposobu pobierania katalogu domowego, powłoki logowania i informacji o gecos w plikach/etc/nsswitch.conf . Jest to szczegółowo opisane w sekcji Podręcznik użytkownika Cygwin:

Jeśli wcześniej utworzyłeś plik /etc/passwdlub /etc/group, będziesz chciał je usunąć i skonfigurować Cygwin przy użyciu nowego modelu Windows Security do mapowań POSIX.

[[ -f /etc/passwd ]] && mv /etc/passwd /etc/passwd.bak
[[ -f /etc/group ]] && mv /etc/group /etc/group.bak

Ustawienie /etc/nsswitch.confpliku db_home:definiuje sposób, w jaki Cygwin pobiera katalog domowy użytkownika. Domyślne ustawienie db_home:to

db_home: /home/%U

Więc domyślnie Cygwin po prostu ustawia katalog domowy na /home/$USERNAME. Możesz to jednak zmienić, aby wskazywać dowolną inną ścieżkę niestandardową. Obsługiwane symbole wieloznaczne to:

  • %u Nazwa użytkownika Cygwin (to małe litery u).
  • %U Nazwa użytkownika systemu Windows (to wielkie litery U).
  • %D Domena Windows w stylu NetBIOS.
  • %HKatalog domowy Windows w stylu POSIX. Zauważ, że w przypadku db_home:ustawienia ma to sens tylko zaraz po poprzedzającym go ukośniku, jak wdb_home: /%H/cygwin
  • %_Ponieważ do oddzielania schematów używane są znaki spacji i tabulacji, w nazwie pliku należy podać spację jako %_(to jest podkreślenie).
  • %% Znak procentu.

Zamiast ścieżki można określić jeden z czterech wstępnie zdefiniowanych nazwanych schematów ścieżek.

  1. windowsKatalog domowy użytkownika jest ustawiony na ten sam katalog, który jest używany jako katalog domowy systemu Windows, zwykle coś podobnego do %USERPROFILE%lub C:\Users\$USERNAME. Oczywiście katalog Windows jest konwertowany na styl POSIX przez Cygwin.

  2. cygwinTylko AD: katalog domowy użytkownika jest ustawiony na ścieżkę POSIX podaną w atrybucie cygwinHome z klasy pomocniczej cygwinUser. Zobacz także sekcję „Schemat Cygwin” .

  3. unixTylko AD: Katalog domowy użytkownika jest ustawiony na ścieżkę POSIX podaną w atrybucie unixHomeDirectory z klasy pomocniczej posixAccount. Zobacz także sekcję „Schemat unixa” .

  4. descKatalog domowy użytkownika jest ustawiony na ścieżkę POSIX podaną w ustawieniu home = "..." podobnym do XML w atrybucie opisu użytkownika w SAM lub AD. Szczegółowy opis znajduje się w sekcji „Schemat opisu”.

Poniższe sprawi, że katalog domowy użytkownika w Cygwin będzie taki sam, jak jest używany dla katalogu domowego systemu Windows.

db_home: windows

Cygwin 1.7.33 lub starszy

Dla tych, którzy używają Cygwin 1.7.33 lub wcześniejszej, zaktualizuj do najnowszej wersji Cygwin i usuń wcześniej używane pliki /etc/passwdi /etc/group, a następnie zobacz kroki powyżej.

W przeciwnym razie wykonaj te starsze kroki poniżej.

Po pierwsze, ustaw zmienną środowiskową Windows dla HOME, która wskazuje na Twój profil użytkownika:

  1. Otwórz System w Panelu sterowania
  2. Na karcie Zaawansowane kliknij Zmienne środowiskowe (u dołu)
  3. W obszarze Zmienne użytkownika kliknij „Nowy…”
  4. W polu Nazwa zmiennej wprowadź HOME
  5. W polu Wartość zmiennej wprowadź %USERPROFILE%
  6. Kliknij przycisk OK we wszystkich otwartych oknach dialogowych, aby zastosować to nowe ustawienie

Teraz zaktualizujemy /etc/passwdplik Cygwin za pomocą %HOME%właśnie utworzonej zmiennej Windows . Loginy powłoki i logowanie zdalne za pośrednictwem sshbędą polegały na /etc/passwdinformowaniu ich o lokalizacji $HOMEścieżki użytkownika .

W wierszu polecenia Cygwin bash wpisz:

cp /etc/passwd /etc/passwd.bak
mkpasswd -l -p $(cygpath -H)  > /etc/passwd 
mkpasswd -d -p $(cygpath -H)  >> /etc/passwd 

-dPrzełącznik mówi mkpasswd obejmować użytkowników domeny, a -ljest jedynie wyjściowych użytkowników maszyn lokalnych. Jest to ważne, jeśli używasz komputera w pracy, na którym informacje o użytkowniku są pobierane z kontrolera domeny systemu Windows.

Teraz możesz zrobić to samo dla grup, chociaż nie jest to konieczne, chyba że będziesz używać komputera, który jest częścią domeny Windows. Cygwin odczytuje informacje o grupie z baz danych kont Windows, ale możesz dodać /etc/groupplik, jeśli twój komputer jest często odłączony od kontrolera domeny.

Po znaku zachęty Cygwin bash wpisz:

cp /etc/group /etc/group.bak
mkgroup -l > /etc/group 
mkgroup -d >> /etc/group 

Teraz wyjdź z Cygwin i uruchom go ponownie. Powinieneś zauważyć, że twoja ścieżka HOME wskazuje tę samą lokalizację, co twój profil użytkownika Windows - tj/cygdrive/c/Users/username

Krzysztof
źródło
7
-d jest naprawdę powolny. Jeśli potrzebujesz tylko bieżącego użytkownika, możesz zamiast tego użyć -c: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben ma rację, możesz po prostu dodać wpis dla bieżącego użytkownika, podając zamiast tego opcję -c. Jeśli jednak to zrobisz, Cygwin wyświetli ????? dla użytkownika i grupy podczas wyświetlania listy plików we współdzielonych systemach plików, ponieważ nie będzie zawierał rekordów dla innych użytkowników i grup w Twojej Domenie lub komputerze lokalnym.
Christopher
1
Czy mogę zasugerować małą zmianę w sformułowaniu: zamiast `` Teraz zaktualizuj swój plik Cygwin / etc / passwd o nową ścieżkę $ HOME '', zasugerowałbym `` Teraz zaktualizujemy plik Cygwin / etc / passwd za pomocą Zmienna HOME, którą właśnie utworzyliśmy. ' Wielkie dzięki
Robert
Z -d Ukończenie zajmuje kilka minut (zabiłem po 5) minutach. Więc uruchomiłem ponownie z -c. Wszystko dobre dla moich potrzeb.
bartosz.r
1
@Samuel Dodałem wyjaśnienie, aby wyjaśnić cel mkgrouppowyższego.
Christopher,
30

Zrobiłem coś całkiem prostego. Nie chciałem zmieniać zmiennej środowiskowej systemu Windows 7. Więc bezpośrednio zredagowałem plik Cygwin.bat.

@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL

To po prostu uruchamia lokalną powłokę z tym katalogiem domowym; tego właśnie chciałem. Nie mam zamiaru uzyskać do tego zdalnego dostępu, więc to zadziałało.

Ajay
źródło
Po drugie, ponieważ nie mogę zmienić zmiennej środowiskowej mojego domu na moim komputerze deweloperskim.
Deqing
@WernerCD Ostrzegam tylko, że może to mieć niezamierzone konsekwencje podczas interakcji z natywnymi aplikacjami Windows. Twoje aplikacje Windows będą nadal szukać HOME w starej lokalizacji. Przykładem może być Gvim, który będzie utrzymywał oddzielną konfigurację vima w starej %HOME%lokalizacji Windows , podczas gdy Cygwin vim używa nowej $HOMEzadeklarowanej ścieżki.
Christopher
To jest świetne ... 5 lat później i podoba mi się to, ponieważ "inżynieria" jest na tyle prosta, że ​​krewny Cygwin (jak ja) może go używać i rozumieć. Nawiasem mówiąc, umieszczenie skrótu do pliku .bat w C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo oznacza, że ​​możesz przejść do Send -> Cygwin w menu kontekstowym (kliknięcie prawym przyciskiem myszy) w Explorer (i otwórz terminal w dowolnym miejscu, za pomocą ~ / set, gdziekolwiek chcesz).
mike gryzoń
19

Cygwin mountobsługuje teraz metodę wiązania , która pozwala zamontować katalog. Dlatego możesz po prostu dodać następujący wiersz do /etc/fstab, a następnie ponownie uruchomić powłokę:

c:/Users /home none bind 0 0
Jihem
źródło
To jest obecnie właściwy sposób. Pozostałe odpowiedzi są nieaktualne.
ceving
@ceving Czy jest to gdzieś udokumentowane?
Asad Saeeduddin
10

Zmień zmienną środowiskową HOME.

w XP, kliknij prawym przyciskiem myszy Mój komputer >> Właściwości >> Zaawansowane >> Zmienne środowiskowe >> Zmienne użytkownika dla >> [wybierz zmienną HOME] >> edytuj

Michael Paulukonis
źródło
1
Spowoduje to również zmianę zmiennej środowiskowej HOME dla wszystkich aplikacji systemu Windows.
mob
Bardzo prawdziwe. Ale jakie masz aplikacje Windows, które używają zmiennej HOME? Mam EmacsW32 i .... Cygwin. Odkąd najpierw zainstalowałem Emacsa, tam też znajduje się mój dom cygwin.
Michael Paulukonis
1
Czy nie będzie to w jakiś sposób sprzeczne z / etc / passwd? Czy domyślnie / etc / passwd's HOME, jeśli zmienna środowiskowa nie jest ustawiona? Jeśli nie ma konfliktu i domyślnie będzie to / etc / passwd, wygląda na to, że konfiguracja jest idealna: uruchamiam Cygwin z pendrive'a, zarówno po to, aby uniknąć konieczności pytania o pozwolenie na instalację w pracy, więc mam Unix- jak środowisko w mojej kieszeni, którego mogę używać, gdy dostępne jest tylko pudełko z systemem Windows. W pracy mam katalog domowy mojego komputera w pracy, a gdzie indziej mogę mieć katalog domowy na pendrive.
ikonoklast
6

Chciałbym dodać poprawkę / aktualizację do bitu o $ HOME mającym pierwszeństwo. Katalog domowy w / etc / passwd ma pierwszeństwo przed wszystkim.

Jestem długoletnim użytkownikiem Cygwin i właśnie wykonałem czystą instalację systemu Windows 7 x64 i Cygwin V1.126. Szalałem, próbując dowiedzieć się, dlaczego za każdym razem, gdy uruchamiałem ssh, otrzymywałem:

e:\>ssh foo.bar.com
Could not create directory '/home/dhaynes/.ssh'.
The authenticity of host 'foo.bar.com (10.66.19.19)' can't be established.
...

Dodałem definicję HOME = c: \ users \ dhaynes w środowisku Windows, ale nadal próbowałem utworzyć '/ home / dhaynes'. Wypróbowałem każdą kombinację, jaką mogłem, w tym ustawienie HOME na / cygdrive / c / users / dhaynes. Wyszukałem w Google komunikat o błędzie, nie mogłem nic znaleźć, nie mogłem znaleźć niczego na stronie cygwin. Używam cygwin z cmd.exe, a nie bash.exe, ale problem występował w obu.

W końcu zdałem sobie sprawę, że katalog domowy w / etc / passwd ma pierwszeństwo przed zmienną środowiskową $ HOME. Po prostu ponownie uruchomiłem 'mkpasswd -l> / etc / passwd' i zaktualizowałem katalog domowy, teraz wszystko jest w porządku z ssh.

Może to być oczywiste dla typów linuksowych z doświadczeniem sysadmin, ale dla tych z nas, którzy używają głównie systemu Windows, jest to nieco niejasne.

Dan Haynes
źródło
1
Katalog domowy w / etc / passwd NIE ma pierwszeństwa przed wszystkim. Jest on jednak używany jako główne źródło ścieżki katalogu HOME podczas zdalnego logowania lub korzystania z ssh. Zobacz to z Cygwin FAQ cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Tak się składa, że ​​używam cwRsync (Cygwin + Rsync dla Windows), gdzie cygwin jest dostarczany w pakiecie i nie mogłem znaleźć / etc / passwd.

I powtarzał

Could not create directory '/home/username/.ssh'.
...
Failed to add the host to the list of known hosts (/home/username/.ssh/known_hosts).

Więc napisałem plik wsadowy, który zmienił zmienną HOME przed uruchomieniem rsync. Coś jak:

set HOME=.
rsync /path1 user@host:/path2

I altówka! Folder .ssh pojawił się w bieżącym katalogu roboczym, a rsync przestał denerwować odciskami palców rsa.

To szybka poprawka, ale później powinieneś zmienić HOME na bezpieczniejszą lokalizację.

TEHEK
źródło