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ć?


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.


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


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.


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

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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.