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?

sblundy
źródło
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.

netjeff
źródło
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.

sblundy
źródło
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

M Smith
źródło
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.

Samuel
źródło
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.

JesperE
źródło
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
Steven Penny
źródło
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

Krzysztof
źródło
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.

P. Myer Nore
źródło
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%

wyrdR
źródło
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;)

kitingChris
źródło
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.

Pablo Halpern
źródło
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.

user123456789
źródło