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?
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?
Antworten:
Ab Cygwin 1.7.34 wird empfohlen, eine benutzerdefinierte db_home
Einstellung 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 windows
Option sowie mehrere andere %
Token, die Sie anstelle %H
oder zusätzlich dazu verwenden können. Weitere Informationen finden Sie in der nsswitch.conf
Syntaxbeschreibung im Cygwin-Benutzerhandbuch .
Wenn Sie Cygwin vor 1.7.34 installiert haben oder das mkpasswd
Dienstprogramm so ausgeführt haben, dass Sie über eine /etc/passwd
Datei 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 HOME
Umgebungsvariable beim Start der Shell festgelegt.²
Weitere Informationen zum Thema finden Sie in diesem FAQ-Artikel .
Fußnoten:
Ziehen Sie in Betracht, sich zu bewegen /etc/passwd
und /etc/group
aus dem Weg zu gehen, um stattdessen den neuen SAM / AD-basierten Mechanismus zu verwenden.
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
.
ssh
funktionierte erst richtig, wenn er /etc/passwd
wie beschrieben bearbeitet wurde .
/etc/passwd
Datei anschließend neu erstellt wird. Siehe meine Antwort hier , um solche Probleme zu vermeiden.
db_home: /%H
Möglicherweise wird ein Domänenbenutzername (anstelle des lokalen Benutzernamens) aufgelöst, der möglicherweise nicht Ihren Wünschen entspricht. db_home: /cygdrive/c/Users/%U
tat was ich wollte.
db_home: windows
, dauert sh
der Start ungefähr 2,5 bis 3,5 Sekunden. Wenn ich benutze db_home: /cygdrive/c/Users/%U
, dauert sh
der Start ungefähr 0,9 bis 1,0 Sekunden. Wenn ich die db_home
Zeile lösche oder fest in das Windows- sh
Ausgangsverzeichnis 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/susam
weil ich häufig Shell-Skripte über die Eingabeaufforderung mit dem sh
Befehl ausführe , z. B. sh foo.sh
und es unpraktisch wird, länger als 2 Sekunden zu warten.
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/passwd
oder /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.conf
Datei 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.%H
Windows-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.
windows
Das 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.
cygwin
Nur 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“ .
unix
Nur 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“ .
desc
Das 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
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/passwd
und /etc/group
Dateien. 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:
HOME
%USERPROFILE%
Jetzt aktualisieren wir die Cygwin- /etc/passwd
Datei mit der %HOME%
soeben erstellten Windows- Variablen. Shell-Anmeldungen und Remote-Anmeldungen über ssh
geben an /etc/passwd
, wo sich der $HOME
Pfad 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 -d
Switch weist mkpasswd an, DOMAIN-Benutzer einzuschließen, während -l
nur 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/group
Datei 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
mkgroup
oben zu verdeutlichen .
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.
%HOME%
Speicherort beibehält , während Cygwin vim den von $HOME
Ihnen deklarierten neuen Pfad verwendet.
Cygwin unterstützt mount
jetzt die Bindemethode , mit der Sie ein Verzeichnis bereitstellen können. Daher können Sie einfach die folgende Zeile hinzufügen /etc/fstab
und dann Ihre Shell neu starten:
c:/Users /home none bind 0 0
Ä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
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.
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.
db_home:
zu entfernen, um das Zitat aufzuheben und es zum Laufen zu bringen.