Wie kann ich meinen Cygwin-Home-Ordner nach der Installation ändern?

121

Ich habe gerade Cygwin installiert und es sieht so aus, als ob sich das Home-Verzeichnis in der Bash-Eingabeaufforderung auf meinem Z: -Laufwerk befindet. Dort will ich es nicht.

Wie kann ich das ändern?

Nathan Long
quelle
1
Verwenden Sie für Benutzer von Cygwin 1.7.34 oder höher die in den anderen Beiträgen erläuterten Methoden. Vergessen Sie jedoch nicht, das # vorher db_home:zu entfernen, um das Zitat aufzuheben und es zum Laufen zu bringen.
Maieul

Antworten:

180

Ab Cygwin 1.7.34 wird empfohlen, eine benutzerdefinierte db_homeEinstellung hinzuzufügen /etc/nsswitch.conf. Ein häufiger Wunsch dabei ist es, Ihr Cygwin-Ausgangsverzeichnis Ihrem Windows-Benutzerprofilverzeichnis anzupassen. Diese Einstellung bewirkt Folgendes:

db_home: windows

Oder gleichwertig:

db_home: /%H

Sie müssen das letztere Formular verwenden, wenn Sie eine Variation dieses Schemas wünschen, z. B. um Ihre Cygwin-Home-Dateien in ein Unterverzeichnis Ihres Windows-Benutzerprofilverzeichnisses zu trennen :

db_home: /%H/cygwin

Es gibt mehrere andere alternative Schemata für die windowsOption sowie mehrere andere %Token, die Sie anstelle %Hoder zusätzlich dazu verwenden können. Weitere Informationen finden Sie in der nsswitch.confSyntaxbeschreibung im Cygwin-Benutzerhandbuch .

Wenn Sie Cygwin vor 1.7.34 installiert haben oder das mkpasswdDienstprogramm so ausgeführt haben, dass Sie über eine /etc/passwdDatei verfügen , können Sie Ihr Cygwin- Ausgangsverzeichnis ändern, indem Sie den Eintrag Ihres Benutzers in dieser Datei bearbeiten. Ihr Home-Verzeichnis ist das vorletzte Element in der Zeile Ihres Benutzers in /etc/passwd

Unabhängig davon, wie Sie dies tun, wird die HOMEUmgebungsvariable beim Start der Shell festgelegt.²

Weitere Informationen zum Thema finden Sie in diesem FAQ-Artikel .


Fußnoten:

  1. Ziehen Sie in Betracht, sich zu bewegen /etc/passwdund /etc/groupaus dem Weg zu gehen, um stattdessen den neuen SAM / AD-basierten Mechanismus zu verwenden.

  2. Es ist zwar möglich, einfach %HOME%über die Systemsteuerung einzustellen , es wird jedoch offiziell davon abgeraten . Es überschreibt nicht nur kurzerhand die oben genannten Mechanismen, es funktioniert auch nicht immer, beispielsweise wenn Shell-Skripte über ausgeführt werden cron.

Warren Young
quelle
3
Beachten Sie, dass , wenn Sie die Git - Bash - Shell aus installiert git-scm.com/download/win , Sie könnten Probleme haben mit der Cygwin installieren (je nachdem , was Optionen , die Sie gewählt haben). Mein cygwin ~ landete in meinem Win7-Benutzerverzeichnis und sshfunktionierte erst richtig, wenn er /etc/passwdwie beschrieben bearbeitet wurde .
Allan
Die Probleme, die @Allan hier bei Git-Installationen erwähnt, werden behoben, indem die Windows-Umgebungsvariable für HOME festgelegt und die /etc/passwdDatei anschließend neu erstellt wird. Siehe meine Antwort hier , um solche Probleme zu vermeiden.
Christopher
11
db_home: /%HMöglicherweise wird ein Domänenbenutzername (anstelle des lokalen Benutzernamens) aufgelöst, der möglicherweise nicht Ihren Wünschen entspricht. db_home: /cygdrive/c/Users/%Utat was ich wollte.
Abdull
2
Ich sehe einen Leistungsunterschied zwischen den verschiedenen Methoden. Wenn ich benutze db_home: windows, dauert shder Start ungefähr 2,5 bis 3,5 Sekunden. Wenn ich benutze db_home: /cygdrive/c/Users/%U, dauert shder Start ungefähr 0,9 bis 1,0 Sekunden. Wenn ich die db_homeZeile lösche oder fest in das Windows- shAusgangsverzeichnis codiere, dauert der Start etwa 0,2 bis 0,3 Sekunden. Ich gehe mit der fest codierten Lösung, z. B. db_home: /cygdrive/c/Users/susamweil ich häufig Shell-Skripte über die Eingabeaufforderung mit dem shBefehl ausführe , z. B. sh foo.shund es unpraktisch wird, länger als 2 Sekunden zu warten.
Susam Pal
1
Vielen Dank an @abdull, db_home: / cygdrive / c / Users /% U ist die Antwort, die ich brauchte. db_home: Windows verwendet "/ home /% U", das in meiner Konfiguration nicht vorhanden ist.
Jeff
74

Cygwin 1.7.34+

Für Benutzer von Cygwin 1.7.34 oder höher unterstützt Cygwin die Konfiguration des Abrufs von Home-Verzeichnis-, Anmeldeshell- und Gecos-Informationen in /etc/nsswitch.conf. Dies wird im Abschnitt Cygwin-Benutzerhandbuch beschrieben:

Wenn Sie zuvor eine /etc/passwdoder /etc/group-Datei erstellt haben, möchten Sie diese entfernen und Cygwin mithilfe des neuen Windows-Sicherheitsmodells für POSIX-Zuordnungen konfigurieren.

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

Die Einstellung der /etc/nsswitch.confDatei db_home:definiert, wie Cygwin das Home-Verzeichnis des Benutzers abruft. Die Standardeinstellung für db_home:ist

db_home: /home/%U

Standardmäßig setzt Cygwin nur das Ausgangsverzeichnis auf /home/$USERNAME. Sie können dies jedoch ändern, um auf einen beliebigen anderen benutzerdefinierten Pfad zu verweisen. Die unterstützten Platzhalterzeichen sind:

  • %u Der Cygwin-Benutzername (das ist u in Kleinbuchstaben).
  • %U Der Windows-Benutzername (das ist U in Großbuchstaben).
  • %D Windows-Domäne im NetBIOS-Stil.
  • %HWindows-Ausgangsverzeichnis im POSIX-Stil. Beachten Sie, dass dies für die db_home:Einstellung nur direkt nach dem vorhergehenden Schrägstrich sinnvoll ist, wie indb_home: /%H/cygwin
  • %_Da Leerzeichen und TAB-Zeichen zum Trennen der Schemata verwendet werden, muss ein Leerzeichen im Dateinamen als %_(das ist ein Unterstrich) angegeben werden.
  • %% Ein Prozentzeichen.

Anstelle eines Pfads können Sie eines von vier vordefinierten benannten Pfadschemata angeben.

  1. windowsDas Ausgangsverzeichnis des Benutzers wird auf dasselbe Verzeichnis festgelegt, das als Windows-Ausgangsverzeichnis verwendet wird, normalerweise in Anlehnung an %USERPROFILE%oder C:\Users\$USERNAME. Natürlich wird das Windows-Verzeichnis von Cygwin in den POSIX-Stil konvertiert.

  2. cygwinNur AD: Das Home-Verzeichnis des Benutzers wird auf den POSIX-Pfad festgelegt, der im Attribut cygwinHome der Hilfsklasse cygwinUser angegeben ist. Siehe auch den Abschnitt „Das Cygwin-Schema“ .

  3. unixNur AD: Das Basisverzeichnis des Benutzers wird auf den POSIX-Pfad festgelegt, der im Attribut unixHomeDirectory der Hilfsklasse posixAccount angegeben ist. Siehe auch den Abschnitt „Das Unix-Schema“ .

  4. descDas Home-Verzeichnis des Benutzers wird auf den POSIX-Pfad gesetzt, der in der XML-ähnlichen Einstellung home = "..." im Beschreibungsattribut des Benutzers in SAM oder AD angegeben ist. Eine ausführliche Beschreibung finden Sie im Abschnitt „Das Desc-Schema“.

Im Folgenden wird das Basisverzeichnis des Benutzers in Cygwin mit dem für das Windows-Basisverzeichnis verwendeten identisch.

db_home: windows

Cygwin 1.7.33 oder früher

Wenn Sie Cygwin 1.7.33 oder früher verwenden, aktualisieren Sie auf die neueste Version von Cygwin und entfernen Sie zuvor verwendete Dateien /etc/passwdund /etc/groupDateien. Führen Sie dann die obigen Schritte aus.

Befolgen Sie andernfalls die folgenden älteren Schritte.

Legen Sie zunächst eine Windows-Umgebungsvariable für HOME fest, die auf Ihr Benutzerprofil verweist:

  1. Öffnen Sie das System in der Systemsteuerung
  2. Klicken Sie auf der Registerkarte Erweitert auf Umgebungsvariablen (unten).
  3. Klicken Sie im Bereich Benutzervariablen auf "Neu ...".
  4. Geben Sie als Variablennamen ein HOME
  5. Geben Sie als Variablenwert ein %USERPROFILE%
  6. Klicken Sie in allen geöffneten Dialogfeldern auf OK, um diese neue Einstellung anzuwenden

Jetzt aktualisieren wir die Cygwin- /etc/passwdDatei mit der %HOME%soeben erstellten Windows- Variablen. Shell-Anmeldungen und Remote-Anmeldungen über sshgeben an /etc/passwd, wo sich der $HOMEPfad des Benutzers befindet .

Geben Sie an der Cygwin-Bash-Eingabeaufforderung Folgendes ein:

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

Der -dSwitch weist mkpasswd an, DOMAIN-Benutzer einzuschließen, während -lnur LOCAL-Maschinenbenutzer ausgegeben werden sollen. Dies ist wichtig, wenn Sie bei der Arbeit einen PC verwenden, auf dem die Benutzerinformationen von einem Windows-Domänencontroller abgerufen werden.

Jetzt können Sie dasselbe auch für Gruppen tun, obwohl dies nur erforderlich ist, wenn Sie einen Computer verwenden, der Teil einer Windows-Domäne ist. Cygwin liest Gruppeninformationen aus den Windows-Kontodatenbanken. Sie können jedoch eine /etc/groupDatei hinzufügen , wenn Ihr Computer häufig von seinem Domänencontroller getrennt wird.

Geben Sie an der Cygwin-Bash-Eingabeaufforderung Folgendes ein:

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

Beenden Sie nun Cygwin und starten Sie es erneut. Sie sollten feststellen, dass Ihr HOME-Pfad auf denselben Speicherort wie Ihr Windows-Benutzerprofil verweist - d. H./cygdrive/c/Users/username

Christopher
quelle
7
-d ist sehr langsam. Wenn Sie nur den aktuellen Benutzer benötigen, können Sie stattdessen -c verwenden: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben hat Recht, dass Sie einfach einen Eintrag für den aktuellen Benutzer hinzufügen können, indem Sie stattdessen -c angeben. Wenn Sie dies jedoch tun, zeigt Cygwin ????? für den Benutzer und die Gruppe beim Auflisten von Dateien in gemeinsam genutzten Dateisystemen, da keine Datensätze für andere Benutzer und Gruppen auf Ihrer Domäne oder Ihrem lokalen Computer vorhanden sind.
Christopher
1
Kann ich eine kleine Änderung im Wortlaut vorschlagen: Anstatt "Jetzt aktualisieren Sie Ihre Cygwin / etc / passwd-Datei mit einem neuen $ HOME-Pfad", würde ich vorschlagen, "Jetzt werden wir die Cygwin / etc / passwd-Datei mit dem aktualisieren." HOME-Variable, die wir gerade erstellt haben. ' Vielen Dank
Robert
Mit -d Es dauert Minuten (ich habe nach 5 getötet) Minuten, um abzuschließen. Also habe ich mit -c wiederholt. Alles gut für meine Bedürfnisse.
Bartosz.r
1
@ Samuel Ich habe eine Erklärung hinzugefügt, um den Zweck von mkgroupoben zu verdeutlichen .
Christopher
30

Ich habe etwas ganz Einfaches gemacht. Ich wollte die Windows 7-Umgebungsvariable nicht ändern. Also habe ich die Datei Cygwin.bat direkt bearbeitet.

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

Dies startet nur die lokale Shell mit diesem Home-Verzeichnis; das wollte ich. Ich werde nicht remote darauf zugreifen, daher hat dies für mich funktioniert.

Ajay
quelle
Zweitens, da ich meine Heimumgebungsvariable auf meinem Entwicklungscomputer nicht ändern kann.
Deqing
@WernerCD Ich möchte nur darauf hinweisen, dass dies unbeabsichtigte Folgen bei der Interaktion mit nativen Windows-Anwendungen haben kann. Ihre Windows-Anwendungen suchen weiterhin am alten Speicherort nach HOME. Ein Beispiel wäre Gvim, das eine separate vim-Konfiguration am alten Windows- %HOME%Speicherort beibehält , während Cygwin vim den von $HOMEIhnen deklarierten neuen Pfad verwendet.
Christopher
Das ist großartig ... 5 Jahre später und ich mag es, weil das "Engineering" für einen Cygwin-Neuling (wie mich) einfach genug ist, um es zu verwenden und zu verstehen. Wenn Sie eine Verknüpfung zu Ihrer .bat-Datei in C: \ Benutzer \ <Ihr_Benutzername> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo einfügen, können Sie in Ihrem kontextsensitiven Menü (Rechtsklick) unter Senden -> Cygwin auswählen Explorer (und öffnen Sie ein Terminal an einer beliebigen Stelle mit ~ / set, wo immer Sie möchten).
Mike Nagetier
19

Cygwin unterstützt mountjetzt die Bindemethode , mit der Sie ein Verzeichnis bereitstellen können. Daher können Sie einfach die folgende Zeile hinzufügen /etc/fstabund dann Ihre Shell neu starten:

c:/Users /home none bind 0 0
Jihem
quelle
Dies ist heutzutage der richtige Weg. Die anderen Antworten sind veraltet.
Ceving
@ceving Ist das irgendwo dokumentiert?
Asad Saeeduddin
10

Ändern Sie Ihre HOME-Umgebungsvariable.

Klicken Sie unter XP mit der rechten Maustaste auf Arbeitsplatz >> Eigenschaften >> Erweitert >> Umgebungsvariablen >> Benutzervariablen für >> [Variable HOME auswählen] >> Bearbeiten

Michael Paulukonis
quelle
1
Dadurch wird Ihre HOME-Umgebungsvariable auch für alle Windows-Anwendungen geändert.
Mob
Sehr richtig. Aber welche Windows-Anwendungen verwenden die Variable HOME? Ich habe EmacsW32 und ... Cygwin. Seit ich Emacs zuerst installiert habe, liegt dort auch mein Cygwin-Zuhause.
Michael Paulukonis
1
Wird dieser Konflikt nicht irgendwie mit / etc / passwd? Wird standardmäßig / etc / passwds HOME verwendet, wenn die Umgebungsvariable nicht festgelegt ist? Wenn es keinen Konflikt gibt und standardmäßig / etc / passwd verwendet wird, scheint dies die perfekte Einrichtung zu sein: Ich führe Cygwin von einem USB-Stick aus, um zu vermeiden, dass ich um Erlaubnis zur Installation bei der Arbeit bitten muss, und daher habe ich ein Unix- wie eine Umgebung in meiner Tasche, die ich verwenden kann, wenn nur eine Windows-Box verfügbar ist. Bei der Arbeit habe ich das Home-Verzeichnis meines Arbeitscomputers, und an anderer Stelle kann ich ein Home-Verzeichnis auf dem USB-Stick haben.
Bilderstürmer
6

Ich möchte dem Bit über $ HOME eine Korrektur / Aktualisierung hinzufügen, die Vorrang hat. Das Home-Verzeichnis in / etc / passwd hat Vorrang vor allem.

Ich bin ein langjähriger Cygwin-Benutzer und habe gerade eine Neuinstallation von Windows 7 x64 und Cygwin V1.126 durchgeführt. Ich war verrückt, um herauszufinden, warum ich jedes Mal, wenn ich ssh lief, immer wieder Folgendes bekam:

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

Ich füge die Definition HOME = c: \ users \ dhaynes in der Windows-Umgebung hinzu, aber es wurde immer wieder versucht, '/ home / dhaynes' zu erstellen. Ich habe jede mögliche Kombination ausprobiert, einschließlich der Einstellung von HOME auf / cygdrive / c / users / dhaynes. Nach der Fehlermeldung gegoogelt, konnte nichts finden, konnte nichts auf der Cygwin-Site finden. Ich benutze cygwin von cmd.exe, nicht bash.exe, aber das Problem war in beiden vorhanden.

Endlich wurde mir klar, dass das Home-Verzeichnis in / etc / passwd Vorrang vor der Umgebungsvariablen $ HOME hat. Ich habe einfach 'mkpasswd -l> / etc / passwd' erneut ausgeführt und das Home-Verzeichnis aktualisiert, jetzt ist alles in Ordnung mit ssh.

Das mag für Linux-Typen mit Sysadmin-Erfahrung offensichtlich sein, aber für diejenigen von uns, die hauptsächlich Windows verwenden, ist es etwas dunkel.

Dan Haynes
quelle
1
Das Home-Verzeichnis in / etc / passwd hat NICHT Vorrang vor allem. Es wird jedoch als primäre Quelle für Ihren HOME-Verzeichnispfad verwendet, wenn Sie sich remote anmelden oder ssh verwenden. Siehe dies aus den Cygwin FAQ cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Ich verwende zufällig cwRsync (Cygwin + Rsync für Windows), wo Cygwin gebündelt geliefert wird, und ich konnte / etc / passwd nicht finden.

Und es sagte immer wieder

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

Also habe ich eine Batch-Datei geschrieben, die die HOME-Variable geändert hat, bevor ich rsync ausgeführt habe. Etwas wie:

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

Und Bratsche! Der Ordner .ssh wurde im aktuellen Arbeitsverzeichnis angezeigt und rsync hat aufgehört, mit rsa-Fingerabdrücken zu nerven.

Es ist ein schneller Hotfix, aber später sollten Sie HOME an einen sichereren Ort ändern.

TEHEK
quelle