Comment puis-je changer mon dossier de départ Cygwin après l'installation?

121

Je viens d'installer Cygwin, et il semble que le répertoire personnel de l'invite bash se trouve sur mon lecteur Z :. Ce n'est pas là que je le veux.

Comment puis-je changer cela?

Nathan Long
la source
1
Pour ceux qui utilisent Cygwin 1.7.34 ou supérieur, utilisez les méthodes expliquées dans les autres articles, mais n'oubliez pas de supprimer le # avant db_home:de le retirer et de le faire fonctionner.
Maieul

Réponses:

180

À partir de Cygwin 1.7.34 , la méthode recommandée pour ce faire est d'ajouter un db_homeparamètre personnalisé à /etc/nsswitch.conf. Un souhait commun lors de cette opération est de rendre votre répertoire de base Cygwin égal à votre répertoire de profil utilisateur Windows. Ce paramètre fera cela:

db_home: windows

Ou équivalent:

db_home: /%H

Vous devez utiliser ce dernier formulaire si vous souhaitez une variante de ce schéma, par exemple pour séparer vos fichiers personnels Cygwin dans un sous - répertoire de votre répertoire de profil utilisateur Windows:

db_home: /%H/cygwin

Il existe plusieurs autres schémas alternatifs pour l' windowsoption ainsi que plusieurs autres %jetons que vous pouvez utiliser à sa place %Hou en plus. Voir la nsswitch.confdescription de la syntaxe dans le Guide de l'utilisateur Cygwin pour plus de détails.

Si vous avez installé Cygwin avant la 1.7.34 ou si vous avez exécuté son mkpasswdutilitaire pour avoir un /etc/passwdfichier, vous pouvez changer votre répertoire personnel Cygwin en éditant l'entrée de votre utilisateur dans ce fichier. Votre répertoire personnel est l'avant-dernier élément sur la ligne de votre utilisateur /etc/passwd

Quelle que soit la manière dont vous le faites, cela entraîne la HOMEdéfinition de la variable d'environnement lors du démarrage du shell .²

Consultez cet article de la FAQ pour en savoir plus sur le sujet.


Notes de bas de page:

  1. Pensez à vous déplacer /etc/passwdet à vous /etc/groupécarter afin d'utiliser le nouveau mécanisme basé sur SAM / AD à la place.

  2. Bien qu'il soit possible de configurer simplement %HOME%via le panneau de configuration, il est officiellement déconseillé . Non seulement il remplace sans cérémonie les mécanismes ci-dessus, mais il ne fonctionne pas toujours, comme lors de l'exécution de scripts shell via cron.

Warren Young
la source
3
Notez que si vous avez installé le shell Git bash à partir de git-scm.com/download/win , vous pourriez avoir des problèmes avec l'installation de cygwin (selon les options que vous avez choisies). Mon cygwin ~ s'est retrouvé dans mon répertoire utilisateur Win7 et sshne fonctionnait pas correctement avant de le modifier /etc/passwdcomme décrit.
Allan
Les problèmes que @Allan mentionne ici avec les installations git sont résolus en définissant la variable d'environnement Windows pour HOME, puis en recréant le /etc/passwdfichier. Voir ma réponse ici pour éviter de tels problèmes.
Christopher
11
db_home: /%Hpeut résoudre pour un nom d'utilisateur de domaine (au lieu d'un nom d'utilisateur local), qui peut ne pas être ce que vous aimeriez avoir. db_home: /cygdrive/c/Users/%Ufait ce que je voulais.
Abdull
2
Je vois une différence de performance entre les différentes méthodes. Lorsque j'utilise db_home: windows, il faut shenviron 2,5 à 3,5 secondes pour démarrer. Lorsque j'utilise db_home: /cygdrive/c/Users/%U, il faut shenviron 0,9 à 1,0 seconde pour démarrer. Lorsque je supprime la db_homeligne ou que je la code en dur dans le répertoire de base de Windows, le démarrage shprend environ 0,2 à 0,3 seconde. Je vais avec la solution codée en dur, par exemple db_home: /cygdrive/c/Users/susam, parce que j'exécute souvent des scripts shell à partir de l'invite de commande en utilisant la shcommande, par exemple sh foo.shet il devient gênant d'attendre plus de 2 secondes.
Susam Pal
1
Merci @abdull, db_home: / cygdrive / c / Users /% U est la réponse dont j'avais besoin. db_home: windows utilise "/ home /% U", qui n'existe pas sur ma config.
Jeff
74

Cygwin 1.7.34+

Pour ceux qui utilisent Cygwin 1.7.34 ou supérieur, Cygwin prend en charge la configuration de la manière de récupérer le répertoire personnel, le shell de connexion et les informations gecos dans /etc/nsswitch.conf. Ceci est détaillé dans la section Guide de l'utilisateur Cygwin:

Si vous avez déjà créé un fichier /etc/passwdou /etc/group, vous voudrez les supprimer et configurer Cygwin en utilisant le nouveau modèle de sécurité Windows pour les mappages POSIX.

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

Le paramètre /etc/nsswitch.confdu fichier db_home:définit la manière dont Cygwin récupère le répertoire personnel de l'utilisateur. Le paramètre par défaut pour db_home:est

db_home: /home/%U

Donc, par défaut, Cygwin définit simplement le répertoire home sur /home/$USERNAME. Vous pouvez changer cela pour pointer vers n'importe quel autre chemin personnalisé que vous souhaitez. Les caractères génériques pris en charge sont:

  • %u Le nom d'utilisateur Cygwin (c'est un u minuscule).
  • %U Le nom d'utilisateur Windows (c'est U majuscule).
  • %D Domaine Windows dans le style NetBIOS.
  • %HRépertoire de base Windows dans le style POSIX. Notez que, pour le db_home:paramètre, cela n'a de sens que juste après la barre oblique précédente, comme dansdb_home: /%H/cygwin
  • %_Étant donné que des espaces et des caractères TAB sont utilisés pour séparer les schémas, un espace dans le nom de fichier doit être indiqué %_(c'est un trait de soulignement).
  • %% Un caractère pour cent.

Au lieu d'un chemin, vous pouvez spécifier l'un des quatre schémas de chemin nommé prédéfinis.

  1. windowsLe répertoire de base de l'utilisateur est défini sur le même répertoire que celui utilisé comme répertoire de base de Windows, généralement quelque chose du genre %USERPROFILE%ou C:\Users\$USERNAME. Bien entendu, le répertoire Windows est converti en style POSIX par Cygwin.

  2. cygwinAD uniquement: le répertoire personnel de l'utilisateur est défini sur le chemin POSIX indiqué dans l'attribut cygwinHome de la classe auxiliaire cygwinUser. Voir aussi la section intitulée «Le schéma cygwin» .

  3. unixAD uniquement: le répertoire personnel de l'utilisateur est défini sur le chemin POSIX indiqué dans l'attribut unixHomeDirectory de la classe auxiliaire posixAccount. Voir aussi la section intitulée «Le schéma unix» .

  4. descLe répertoire de base de l'utilisateur est défini sur le chemin POSIX indiqué dans le paramètre de type XML home = "..." dans l'attribut de description de l'utilisateur dans SAM ou AD. Voir la section intitulée «Le schéma desc» pour une description détaillée.

Ce qui suit rendra le répertoire personnel de l'utilisateur dans Cygwin le même que celui utilisé pour le répertoire personnel Windows.

db_home: windows

Cygwin 1.7.33 ou version antérieure

Pour ceux qui utilisent Cygwin 1.7.33 ou une version antérieure, mettez à jour vers la dernière version de Cygwin et supprimez les fichiers /etc/passwdet /etc/groupfichiers précédemment utilisés , puis reportez-vous aux étapes ci-dessus.

Sinon, suivez ces étapes plus anciennes ci-dessous.

Tout d'abord, définissez une variable d'environnement Windows pour HOME qui pointe vers votre profil utilisateur:

  1. Système ouvert sur le panneau de commande
  2. Dans l' onglet Avancé, cliquez sur Variables d'environnement (vers le bas)
  3. Dans la zone Variables utilisateur, cliquez sur "Nouveau…"
  4. Pour le nom de la variable, entrez HOME
  5. Pour Valeur variable, entrez %USERPROFILE%
  6. Cliquez sur OK dans toutes les boîtes de dialogue ouvertes pour appliquer ce nouveau paramètre

Nous allons maintenant mettre à jour le /etc/passwdfichier Cygwin avec la %HOME%variable Windows que nous venons de créer. Les connexions Shell et les connexions à distance via sshs'appuieront /etc/passwdpour leur indiquer l'emplacement du $HOMEchemin de l'utilisateur .

À l'invite de commande Cygwin bash, tapez ce qui suit:

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

Le -dcommutateur indique à mkpasswd d'inclure les utilisateurs DOMAIN, alors -lqu'il ne doit afficher que les utilisateurs de machine LOCAL. Ceci est important si vous utilisez un PC au travail où les informations utilisateur sont obtenues à partir d'un contrôleur de domaine Windows.

Désormais, vous pouvez également faire de même pour les groupes, bien que ce ne soit pas nécessaire, sauf si vous utilisez un ordinateur faisant partie d'un domaine Windows. Cygwin lit les informations de groupe à partir des bases de données des comptes Windows, mais vous pouvez ajouter un /etc/groupfichier si votre machine est souvent déconnectée de son contrôleur de domaine.

À l'invite Cygwin bash, tapez ce qui suit:

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

Maintenant, quittez Cygwin et redémarrez-le. Vous devriez constater que votre chemin HOME pointe vers le même emplacement que votre profil utilisateur Windows - c.-à-d./cygdrive/c/Users/username

Christophe
la source
7
-d est vraiment lent. Si vous n'avez besoin que de l'utilisateur actuel, vous pouvez utiliser -c à la place: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben a raison, vous pouvez simplement ajouter une entrée pour l'utilisateur actuel en spécifiant -c à la place. Si vous le faites cependant, Cygwin affichera ????? pour l'utilisateur et le groupe lors de la liste des fichiers sur des systèmes de fichiers partagés, car il n'aura pas d'enregistrements pour d'autres utilisateurs et groupes sur votre domaine ou votre ordinateur local.
Christopher
1
Puis-je suggérer un petit changement dans la formulation: plutôt que `` Maintenant, mettez à jour votre fichier Cygwin / etc / passwd avec un nouveau chemin $ HOME '', je suggérerais `` Maintenant, nous allons mettre à jour le fichier Cygwin / etc / passwd avec le HOME variable que nous venons de créer. ' Merci beaucoup
Robert
Avec -d Cela prend quelques minutes (j'ai tué après 5) minutes pour terminer. J'ai donc relancé avec -c. Tout va bien pour mes besoins.
bartosz.r
1
@Samuel J'ai ajouté une explication pour clarifier l'objectif mkgroupci - dessus.
Christopher
30

J'ai fait quelque chose d'assez simple. Je ne voulais pas changer la variable d'environnement Windows 7. J'ai donc directement édité le fichier Cygwin.bat.

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

Cela démarre simplement le shell local avec ce répertoire personnel; c'est ce que je voulais. Je ne vais pas y accéder à distance, donc cela a fonctionné pour moi.

Ajay
la source
Deuxièmement, car je ne peux pas changer ma variable d'environnement domestique dans ma machine de développement.
Deqing
@WernerCD Je voudrais juste avertir que cela peut avoir des conséquences inattendues lors de l'interaction avec des applications Windows natives. Vos applications Windows continueront de rechercher HOME à l'ancien emplacement. Un exemple serait Gvim, qui maintiendra une configuration vim séparée à l'ancien %HOME%emplacement Windows , tandis que Cygwin vim utilise le nouveau $HOMEchemin que vous avez déclaré.
Christopher
C'est génial ... 5 ans plus tard et je l'aime bien car "l'ingénierie" est assez simple pour qu'un newb relatif Cygwin (comme moi) puisse l'utiliser et le comprendre. Incidemment, mettre un raccourci vers votre fichier .bat dans C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo signifie que vous pouvez aller Envoyer -> Cygwin sur votre menu contextuel (clic droit) dans Explorer (et ouvrez un terminal n'importe où, avec ~ / défini où vous voulez).
mike rodent
19

Cygwin prend mountdésormais en charge la méthode bind qui vous permet de monter un répertoire. Par conséquent, vous pouvez simplement ajouter la ligne suivante à /etc/fstab, puis redémarrer votre shell:

c:/Users /home none bind 0 0
Jihem
la source
C'est aujourd'hui la bonne manière. Les autres réponses sont obsolètes.
ceving
@ceving Est-ce documenté quelque part?
Asad Saeeduddin
10

Modifiez votre variable d'environnement HOME.

sous XP, cliquez avec le bouton droit sur Poste de travail >> Propriétés >> Avancé >> Variables d'environnement >> Variables utilisateur pour >> [sélectionnez la variable HOME] >> modifier

Michael Paulukonis
la source
1
Cela modifiera également votre variable d'environnement HOME pour toutes vos applications Windows.
mob
Très vrai. Mais quelles applications Windows avez-vous qui utilisent la variable HOME? J'ai EmacsW32 et .... Cygwin. Depuis que j'ai installé Emacs pour la première fois, c'est là que se trouve ma maison cygwin.
Michael Paulukonis le
1
Ce conflit avec / etc / passwd n'est-il pas en quelque sorte en conflit? Sera-t-il par défaut le HOME de / etc / passwd si la variable d'environnement n'est pas définie? S'il n'y a pas de conflit et qu'il sera par défaut / etc / passwd, cela semble être la configuration parfaite: j'exécute Cygwin depuis une clé USB, à la fois pour éviter d'avoir à demander la permission d'installer au travail, et j'ai donc un Unix- comme un environnement dans ma poche que je peux utiliser lorsque seule une boîte Windows est disponible. Au travail, j'aurai le répertoire personnel de mon ordinateur de travail, et ailleurs je peux avoir un répertoire personnel sur la clé USB.
iconoclaste
6

Je voudrais ajouter une correction / mise à jour au bit sur la priorité de $ HOME. Le répertoire personnel dans / etc / passwd a priorité sur tout.

Je suis un utilisateur de longue date de Cygwin et je viens de faire une installation propre de Windows 7 x64 et Cygwin V1.126. J'étais fou d'essayer de comprendre pourquoi chaque fois que je courais ssh, je continuais à obtenir:

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

J'ajoute la définition HOME = c: \ users \ dhaynes dans l'environnement Windows mais j'essayais toujours de créer '/ home / dhaynes'. J'ai essayé tous les combos que je pouvais, y compris la définition de HOME sur / cygdrive / c / users / dhaynes. Google a recherché le message d'erreur, n'a rien trouvé, n'a rien trouvé sur le site cygwin. J'utilise cygwin de cmd.exe, pas bash.exe mais le problème était présent dans les deux.

J'ai finalement réalisé que le répertoire home dans / etc / passwd prenait le pas sur la variable d'environnement $ HOME. J'ai simplement relancé 'mkpasswd -l> / etc / passwd' et cela a mis à jour le répertoire personnel, maintenant tout va bien avec ssh.

Cela peut être évident pour les types Linux avec une expérience sysadmin, mais pour ceux d'entre nous qui utilisent principalement Windows, c'est un peu obscur.

Dan Haynes
la source
1
Le répertoire de base dans / etc / passwd N'EST PAS prioritaire sur tout. Il est cependant utilisé comme source principale pour le chemin de votre répertoire HOME lors de la connexion à distance ou en utilisant ssh. Voir ceci dans la FAQ Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Il se trouve que j'utilise cwRsync (Cygwin + Rsync pour Windows) où cygwin est fourni, et je n'ai pas pu trouver / etc / passwd.

Et ça n'arrêtait pas de dire

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

J'ai donc écrit un fichier batch qui a changé la variable HOME avant d'exécuter rsync. Quelque chose comme:

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

Et alto! Le dossier .ssh est apparu dans le répertoire de travail actuel et rsync a cessé d'être ennuyeux avec les empreintes digitales rsa.

C'est un correctif rapide, mais plus tard, vous devriez changer HOME pour un emplacement plus sûr.

TEHEK
la source