Bezpiecznie zmień katalog domowy


82

Próbuję bezpiecznie zaktualizować katalog domowy, jak określono w /etc/passwd, ale standardowe narzędzia Linuksa - usermod i vipw - do tego nie są dostarczane przez Cygwin.

Czy ktoś mógłby mi powiedzieć, jak zmienili to w Cygwin?


4
Duplikat pytania na stackoverflow.com/q/1494658/923560 zawiera odpowiedzi dla najnowszych wersji Cygwin zaczynających się od 1.7.34.
— Abdull

Odpowiedzi:


96

EDYCJA: W przypadku najnowszych wersji Cygwin (1.7.34 i nowszych) zobacz to nowsze pytanie .

Podobnie jak w przypadku odpowiedzi Sblundy'ego, zawsze możesz edytować ręcznie.

Ale jeśli chcesz to zrobić w "oficjalny" sposób, użyj mkpasswdpolecenia specyficznego dla cygwin . Poniżej znajduje się fragment oficjalnej dokumentacji na temat mkpasswd:

Na przykład to polecenie:

Przykład 3.11. Korzystanie z alternatywnego katalogu głównego

$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

umieści katalogi domowe użytkowników lokalnych w katalogu „Profile” systemu Windows.

Istnieje wiele innych naprawdę przydatnych poleceń opisanych na stronie dokumentacji Cygwin Utilities (która obejmuje mkpasswd). Użycie cygpathw powyższym przykładzie jest kolejnym z tych narzędzi specyficznych dla cygwin.

Skoro już to robisz, prawdopodobnie zechcesz również przeczytać dokumentację Używanie Cygwin skutecznie z systemem Windows . Jest kilka naprawdę dobrych rad.


10
Jeśli jesteś w domenie, możesz rozważyć to alternatywne polecenie: ( -ddla domeny) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd To nie zadziałało dla mnie - w zasadzie zawiesiło się. Ponieważ jestem jedynym, za pomocą tego urządzenia, mogę skorzystać z tej alternatywy, które powinny być bezpieczne, czy nie jesteś w domenie (the -cto za „bieżącego użytkownika) $ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
— Ryan Pavlik

1
Po wykonaniu tej czynności plik .bashrc nie wydaje się być czytany, nawet jeśli skopiuję go do nowego $HOME. Jakiś pomysł jak to naprawić?
— Jeff

1
Dane wyjściowe należy dołączyć (>>) do / etc / passwd (dla scenariuszy korporacyjnych z kilkoma użytkownikami). To zadziałało! :)
— Andre

1
użyj uname -r, aby zobaczyć, na której wersji cygwin jesteś
— martin jakubik

19

Skończyło się na tym, że opuściłem wszystkie moje powłoki Cygwin i edytowałem je ręcznie w edytorze tekstu. Jak na razie dobrze.

Uwaga: nie zmieniaj znaczenia spacji w katalogu „Documents and Settings”. Wpis będzie wyglądał

user:...:/cygdrive/c/Documents and Settings/user:/bin/bash

Linia jest tokenizowana na :znaku.


Działa to również w przypadku ścieżek UNC, dzięki był
— zastępowany

Co muszę edytować ręcznie? Nie wiem, dlaczego mój katalog domowy cygwin to /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6 Chcę, aby był to C: / Users / MyName /

16

Najprostszą odpowiedzią, jaką znalazłem, jest utworzenie / home jako miękkiego łącza do katalogu Home / UserProfile systemu Windows

cd /
mv home oldhome
ln -s "$(cygpath -H)" home

Użyłem cygpath, ponieważ uzyska prawidłową lokalizację katalogu HOME w bieżącej wersji systemu Windows. Na moim pudełku cygpath -Hwraca/cygdrive/c/Users


Po zrobieniu tego przez jakiś czas jest jedna wada: muszę go uruchamiać za każdym razem, gdy aktualizuję cygwin za pomocą ich setup.exe. Nic wielkiego, ale coś do zapamiętania.
— M Smith

To najlepsza odpowiedź. Zastanawiam się, dlaczego cygwin nie jest domyślnie cygwin -Hustawiony. Jest to najrozsądniejsza lokalizacja, a ponieważ Windows 7 nie ma też miejsca na jego drodze.
— kreska

z drugiej strony, to nie zadziała. Nagle postanowił zignorować dowiązanie symboliczne!
— dashesy

Musisz go ponownie zastosować po ponownym uruchomieniu instalacji. To jedyny raz, kiedy mi się nie udało. Nie próbowałem jeszcze tego
— M Smith

Działa zgodnie z oczekiwaniami w systemie Windows 10. Nadal muszę ponownie aplikować za każdym razem, gdy aktualizuję cygwin.
— M Smith

8

Dla obecnego użytkownika działały dla mnie:

  1. Zamknij Cygwin.
  2. Ustaw zmienną środowiskową użytkownika HOME Windows.
  3. Uruchom Cygwin.
  4. uruchom "mkpasswd -c -p" $ (cygpath -H) "> / etc / passwd".
  5. Uruchom ponownie Cygwin.

Potwierdziłem, że zadziałało, uruchamiając ssh-keygen bez żadnych argumentów. Po wprowadzeniu tej zmiany aplikacja domyślnie zapisuje klucz w / cygdrive / c / Users / user zamiast / home / user.

Nie wiem, czy ustawienie HOME jest wymagane, ale i tak zrobiłem to zgodnie z instrukcjami konfiguracji TortoiseGit z Cygwin, używając oficjalnej dokumentacji Tortoise dla nieoficjalnego wsparcia Cygwin tutaj . Ustawienie samego HOME nie wystarczyło, aby ssh-keygen rozpoznał zmianę katalogu domowego.

Zwróć również uwagę, że oficjalną dokumentację Cygwin dotyczącą tego problemu można znaleźć tutaj .

Potwierdzone w Windows 7 przy użyciu 64-bitowego Cygwin v1.7.35.


W przypadku Cygwin 1.7.35+ używanie mkpasswd jest odradzane na korzyść /etc/nsswitch.conf
— Christopher

4

Zawsze ustawiam HOME jako zmienną środowiskową specyficzną dla użytkownika we Właściwościach komputera.


Próbuję tego uniknąć, ponieważ jest ustawiony na firmowy dysk sieciowy. Wygląda na to, że to zadziała.
— sblundy

6
Zauważ, że to nie zadziała dla ssh, jawnie ignoruje HOME i zawsze używa / etc / passwd. Zobacz ostatnie zdanie cygwin.com/faq/faq-nochunks.html#faq.setup.home .
— studgeek

3

Aby uniknąć problemów spowodowanych spacjami w ścieżce do katalogu domowego, użyj skróconej formy katalogu „Profile” systemu Windows - tj /cygdrive/c/DOCUME~1/user.

Możesz to zrobić wpisując polecenie:

mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd

3

Oryginalny odpowiedź przez Christopher z innym

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/passwd/etc/group plik lub , 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

/etc/nsswitch.confPlik jestdb_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 Windows (to wielkie litery U).
  • %D Domena Windows w stylu NetBIOS.
  • %HKatalog domowy Windows w stylu POSIX. Zwróć uwagę, ż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 TAB, 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 w katalogu domowym 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 powyższe kroki.

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 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 nakazuje mkpasswd obejmować użytkowników domeny, natomiast-l jest 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


Ponieważ ścieżki podążają za predefiniowanym schematem z najnowszym Cygwinem zamiast "przenosić" katalog domowy, polecam użycie dowiązań symbolicznych (w tym natywnych Windows) do określonych katalogów z HOMEkatalogu.
— gavenkoa

2

Lubię, gdy moja instalacja cygwin jest zsynchronizowana z pendrive i innym komputerem, więc nienawidzę twardego kodowania katalogu domowego. Używam następującego cygwin.bat:

echo off
SETLOCAL
set SHELL=\\bin\\bash
set HOME=%~dp0..\..\doc\unix
bin\bash --login -i
ENDLOCAL

SETLOCAL i ENDLOCAL zapewniają, że SHELL i HOME nie blokują istniejących zmiennych env dla innych programów. HOME=%~dp0..\..\doc\unixustawia HOME na dwa katalogi wyżej, w podkatalogu doc ​​/ unix. Następnie w .... \ doc \ unix.bashrc dołączam PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin". Nie start /wait %CD%\bin\bashuruchamiałem basha, ponieważ używam Console2 , więc nie potrzebuję dodatkowego okna cmd.


2

Korzystanie ze zmiennej środowiskowej systemu Windows: HOME

To działa dla mnie w przypadku stałego, nieprzenośnego, niesieciowego rozwiązania; tj. ustawienie zmiennej środowiskowej HOME na stałe w systemie Windows.

Zauważ, że nie ma to wpływu na sesje ssh lub telnet , które zawsze odwołują się do / etc / passwd

ref: Konfiguracja Cygwin - Moja zmienna środowiskowa HOME nie jest tym, czego chcę.

CMD

Dla bieżącego użytkownika (należy uruchomić raz na użytkownika):

reg add HKCU\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Dla nowych użytkowników:

reg add HKU\.DEFAULT\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Uwaga: Carets ^ przed znakami procentu%

IMPORTUJ PLIK REG

Importuj ten plik reg ( bieżący użytkownik):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

Dla nowych użytkowników:

Windows Registry Editor Version 5.00

[HKU\.DEFAULT\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

REGEDIT

W Regedit pod:

Dla aktualnego użytkownika:

HKEY_CURRENT_USER\Environment

Dla nowych użytkowników:

HKU\.DEFAULT\Environment

Utwórz HOME jako nową rozszerzalną wartość ciągu (* REG_EXPAND_SZ *) i wstaw % USERPROFILE%


Niezależnie od informacji, na których opierała się ta odpowiedź, nie są one już aktualne. Ref: łącze jest również uszkodzony. Nie próbowałbym tego w domu.
— Christopher

1
cd /home
rm -rf chris
ln -s /cygdrive/z chris

Nie jestem pewien, czy jest to najbezpieczniejsze rozwiązanie, ale jest to możliwe rozwiązanie, które działa dla mnie;)


0

Edytowałem mój plik / etc / passwd bezpośrednio (upewniając się, że nic innego nie będzie do niego dostęp) i zmieniłem wszystkie odniesienia do / home na / Users (w Windows 7). Okazało się, że aby wszystko działało poprawnie, musiałem usunąć wszelkie katalogi w katalogu / home (lub przenieść je w odpowiednie inne miejsce). W przeciwnym razie cygwin rozwinąłby rozdwojoną osobowość, w której, na przykład, „bash -l” zaczynałoby się w / home / Pablo, ale $ HOME byłoby / Users / Pablo, a emacs wyglądałby na odwrotnie. Po usunięciu / home / Pablo wszystko działało dobrze.


0

Musiałem być tylko C:\Users\usernamewtedy, gdy zacząłem cygwin. Więc dodałem tylko .bashrci.profile

cd ${HOMEPATH}

Jeśli wolisz używać ~/.zamiast $HOMEPATH, możesz również dodać:

export HOME=${HOMEPATH}

W ten sposób nie przeszkadzam w instalacji cygwin.

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.