¿Cómo puedo cambiar mi carpeta de inicio Cygwin después de la instalación?

121

Acabo de instalar Cygwin, y parece que el directorio de inicio en el indicador de bash está en mi unidad Z :. Ahí no es donde lo quiero.

¿Cómo puedo cambiar esto?

Nathan Long
fuente
1
Para aquellos que usan Cygwin 1.7.34 o superior, use los métodos explicados en las otras publicaciones, pero no olvide quitar el # antes db_home:para quitarlo de comillas y hacerlo funcionar.
Mayo

Respuestas:

180

A partir de Cygwin 1.7.34 , la forma recomendada de hacer esto es agregar una db_homeconfiguración personalizada a /etc/nsswitch.conf. Un deseo común al hacer esto es hacer que su directorio de inicio de Cygwin sea igual al directorio de su perfil de usuario de Windows. Esta configuración hará eso:

db_home: windows

O equivalente:

db_home: /%H

Debe utilizar la última forma si desea alguna variación en este esquema, como segregar sus archivos de inicio de Cygwin en un subdirectorio de su directorio de perfil de usuario de Windows:

db_home: /%H/cygwin

Hay varios otros esquemas alternativos para la windowsopción más varios otros %tokens que puede usar en lugar %Ho además de él. Consulte la nsswitch.confdescripción de la sintaxis en la Guía del usuario de Cygwin para obtener más detalles.

Si instaló Cygwin antes de 1.7.34 o ha ejecutado su mkpasswdutilidad para tener un /etc/passwdarchivo, puede cambiar su directorio de inicio de Cygwin editando la entrada de su usuario en ese archivo. Su directorio de inicio es el penúltimo elemento en la línea de su usuario en /etc/passwd

De cualquier forma que lo haga, esto hace que la HOMEvariable de entorno se establezca durante el inicio del shell.²

Consulte este artículo de preguntas frecuentes para obtener más información sobre el tema.


Notas al pie:

  1. Considere mudarse /etc/passwdy /etc/groupapartarse para poder utilizar el nuevo mecanismo basado en SAM / AD .

  2. Si bien es posible configurarlo simplemente a %HOME%través del Panel de control, oficialmente no se recomienda . No solo anula sin ceremonias los mecanismos anteriores, sino que no siempre funciona, como cuando se ejecutan scripts de shell a través de cron.

Warren Young
fuente
3
Tenga en cuenta que si instaló el shell de Git bash desde git-scm.com/download/win , es posible que tenga problemas con la instalación de cygwin (según las opciones que elija). Mi cygwin ~ terminó en mi directorio de usuario de Win7 y sshno funcionaría correctamente hasta editarlo /etc/passwdcomo se describe.
Allan
Los problemas que @Allan menciona aquí con las instalaciones de git se abordan configurando la variable de entorno de Windows para HOME y luego recreando el /etc/passwdarchivo. Vea mi respuesta aquí para evitar tales problemas.
Christopher
11
db_home: /%Hpuede resolverse para un nombre de usuario de dominio (en lugar de un nombre de usuario local), que puede no ser el que le gustaría tener. db_home: /cygdrive/c/Users/%UHice lo que quería tener.
Abdull
2
Veo una diferencia de rendimiento entre los distintos métodos. Cuando lo uso db_home: windows, tarda shentre 2,5 y 3,5 segundos en comenzar. Cuando lo uso db_home: /cygdrive/c/Users/%U, tarda shentre 0,9 y 1,0 segundos en comenzar. Cuando elimino la db_homelínea o la codifico en el directorio de inicio de Windows, shtarda entre 0,2 y 0,3 segundos en comenzar. Voy con la solución codificada, por ejemplo db_home: /cygdrive/c/Users/susam, porque a menudo ejecuto scripts de shell desde el símbolo del sistema usando el shcomando, por ejemplo, sh foo.shy se vuelve inconveniente esperar más de 2 segundos.
Susam Pal
1
Gracias @abdull, db_home: / cygdrive / c / Users /% U es la respuesta que necesitaba. db_home: Windows usa "/ home /% U", que no existe en mi configuración.
Jeff
74

Cygwin 1.7.34+

Para aquellos que usan Cygwin 1.7.34 o superior, Cygwin admite la configuración de cómo obtener el directorio de inicio, el shell de inicio de sesión y la información de gecos en formato /etc/nsswitch.conf. Esto se detalla en la sección de la Guía del usuario de Cygwin:

Si ha creado anteriormente un archivo /etc/passwdo /etc/group, querrá eliminarlos y configurar Cygwin utilizando el nuevo modelo de seguridad de Windows para las asignaciones POSIX.

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

La configuración /etc/nsswitch.confdel archivo db_home:define cómo Cygwin obtiene el directorio de inicio del usuario. La configuración predeterminada para db_home:es

db_home: /home/%U

Entonces, de manera predeterminada, Cygwin simplemente establece el directorio de inicio en /home/$USERNAME. Sin embargo, puede cambiar eso para apuntar a cualquier otra ruta personalizada que desee. Los caracteres comodín admitidos son:

  • %u El nombre de usuario de Cygwin (que es u minúscula).
  • %U El nombre de usuario de Windows (que es U mayúscula).
  • %D Dominio de Windows en estilo NetBIOS.
  • %HDirectorio de inicio de Windows en estilo POSIX. Tenga en cuenta que, para la db_home:configuración, esto solo tiene sentido justo después de la barra anterior, como endb_home: /%H/cygwin
  • %_Dado que el espacio y los caracteres TAB se utilizan para separar los esquemas, se debe dar un espacio en el nombre del archivo como %_(que es un guión bajo).
  • %% Un carácter de porcentaje.

En lugar de una ruta, puede especificar uno de los cuatro esquemas de ruta con nombre que están predefinidos.

  1. windowsEl directorio de inicio del usuario se establece en el mismo directorio que se utiliza como directorio de inicio de Windows, normalmente algo similar a %USERPROFILE%o C:\Users\$USERNAME. Por supuesto, Cygwin convierte el directorio de Windows al estilo POSIX.

  2. cygwinSolo AD: el directorio de inicio del usuario se establece en la ruta POSIX proporcionada en el atributo cygwinHome de la clase auxiliar cygwinUser. Consulte también la sección denominada "El esquema cygwin" .

  3. unixSolo AD: el directorio de inicio del usuario se establece en la ruta POSIX dada en el atributo unixHomeDirectory de la clase auxiliar posixAccount. Consulte también la sección denominada "El esquema de Unix" .

  4. descEl directorio de inicio del usuario se establece en la ruta POSIX dada en la configuración similar a XML home = "..." en el atributo de descripción del usuario en SAM o AD. Vea la sección llamada "El esquema desc" para una descripción detallada.

Lo siguiente hará que el directorio de inicio del usuario en Cygwin sea el mismo que se usa para el directorio de inicio de Windows.

db_home: windows

Cygwin 1.7.33 o anterior

Para aquellos que usan Cygwin 1.7.33 o anterior, actualice a la última versión de Cygwin y elimine los archivos /etc/passwdy usados ​​anteriormente /etc/group, luego vea los pasos anteriores.

De lo contrario, siga estos pasos anteriores a continuación.

En primer lugar, configure una variable de entorno de Windows para HOME que apunte a su perfil de usuario:

  1. Sistema abierto en el panel de control
  2. En la pestaña Avanzado, haga clic en Variables de entorno (hacia la parte inferior)
  3. En el área de Variables de usuario, haga clic en "Nuevo ..."
  4. Para el nombre de la variable, ingrese HOME
  5. Para Valor variable, ingrese %USERPROFILE%
  6. Haga clic en Aceptar en todos los cuadros de diálogo abiertos para aplicar esta nueva configuración

Ahora vamos a actualizar el /etc/passwdarchivo Cygwin con la %HOME%variable de Windows que acabamos de crear. Los inicios de sesión de Shell y los inicios de sesión remotos vía sshdependerán /etc/passwdpara indicarles la ubicación de la $HOMEruta del usuario .

En el símbolo del sistema de Cygwin bash, escriba lo siguiente:

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

El -dconmutador le dice a mkpasswd que incluya a los usuarios de DOMINIO, mientras -lque solo genera usuarios de máquinas LOCALES. Esto es importante si está utilizando una PC en el trabajo donde la información del usuario se obtiene de un controlador de dominio de Windows.

Ahora, también puede hacer lo mismo con los grupos, aunque esto no es necesario a menos que utilice una computadora que sea parte de un dominio de Windows. Cygwin lee la información del grupo de las bases de datos de la cuenta de Windows, pero puede agregar un /etc/grouparchivo si su máquina a menudo se desconecta de su controlador de dominio.

En el indicador de Cygwin bash, escriba lo siguiente:

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

Ahora, salga de Cygwin y vuelva a iniciarlo. Debería encontrar que su ruta de INICIO apunta a la misma ubicación que su perfil de usuario de Windows, es decir/cygdrive/c/Users/username

Christopher
fuente
7
-d es muy lento. Si solo necesita el usuario actual, puede usar -c en su lugar: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben tiene razón, en que puede agregar una entrada para el usuario actual especificando -c en su lugar. Sin embargo, si lo hace, Cygwin mostrará ????? para el Usuario y el Grupo al enumerar archivos en sistemas de archivos compartidos, ya que no tendrá registros para otros usuarios y grupos en su Dominio o computadora local.
Christopher
1
¿Puedo sugerir un pequeño cambio en la redacción: en lugar de 'Ahora, actualice su archivo Cygwin / etc / passwd con una nueva ruta $ HOME', sugeriría 'Ahora vamos a actualizar el archivo Cygwin / etc / passwd con el Variable HOME que acabamos de crear. Muchas gracias
Robert
Con -d Tarda minutos (he matado después de 5) minutos para completar. Así que he vuelto a ejecutar con -c. Todo bien para mis necesidades.
bartosz.r
1
@Samuel He agregado una explicación para aclarar el propósito de lo mkgroupanterior.
Christopher
30

Hice algo bastante simple. No quería cambiar la variable de entorno de Windows 7. Así que edité directamente el archivo Cygwin.bat.

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

Esto simplemente inicia el shell local con este directorio de inicio; eso es lo que quería. No voy a acceder a esto de forma remota, así que esto funcionó para mí.

Ajay
fuente
En segundo lugar, esto ya que no puedo cambiar la variable de entorno de mi hogar en mi máquina de desarrollo.
Deqing
@WernerCD Solo advierto que esto puede tener consecuencias no deseadas al interactuar con aplicaciones nativas de Windows. Sus aplicaciones de Windows continuarán buscando HOME en la ubicación anterior. Un ejemplo sería Gvim, que mantendrá una configuración de vim separada en la %HOME%ubicación anterior de Windows , mientras que Cygwin vim usa la nueva $HOMEruta que ha declarado.
Christopher
Esto es genial ... 5 años después y me gusta porque la "ingeniería" es lo suficientemente simple como para que un novato de Cygwin (como yo) la use y comprenda. Por cierto, poner un acceso directo a su archivo .bat en C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo significa que puede ir a Enviar -> Cygwin en su menú contextual (clic derecho) en Explorer (y abre una terminal en cualquier lugar, con ~ / set donde quieras).
Mike Rodent
19

Cygwin mountahora admite el método de enlace que le permite montar un directorio. Por lo tanto, puede simplemente agregar la siguiente línea y /etc/fstabluego reiniciar su shell:

c:/Users /home none bind 0 0
Jihem
fuente
Esta es hoy en día la forma correcta. Las otras respuestas son obsoletas.
hasta el
@ceving ¿Está esto documentado en alguna parte?
Asad Saeeduddin
10

Cambie su variable de entorno HOME.

en XP, haga clic con el botón derecho en Mi PC >> Propiedades >> Avanzado >> Variables de entorno >> Variables de usuario para >> [seleccione la variable INICIO] >> editar

Michael Paulukonis
fuente
1
Esto también cambiará su variable de entorno HOME para todas sus aplicaciones de Windows.
mafia
Muy cierto. Pero, ¿qué aplicaciones de Windows tienes que usen la variable HOME? Tengo EmacsW32 y .... Cygwin. Desde que instalé Emacs primero, ahí es donde se encuentra mi hogar cygwin también.
Michael Paulukonis
1
¿No entrará en conflicto con / etc / passwd de alguna manera? ¿Estará predeterminado en el INICIO de / etc / passwd si la variable de entorno no está configurada? Si no hay ningún conflicto y se establecerá de forma predeterminada en / etc / passwd, parece la configuración perfecta: estoy ejecutando Cygwin desde una memoria USB, tanto para evitar tener que pedir permiso para instalar en el trabajo, por lo que tengo un Unix- como un entorno en mi bolsillo que puedo usar cuando solo hay una caja de Windows disponible. En el trabajo tendré el directorio personal de mi computadora del trabajo, y en otros lugares puedo tener un directorio personal en la memoria USB.
iconoclasta
6

Me gustaría agregar una corrección / actualización al bit sobre $ HOME que tiene prioridad. El directorio de inicio en / etc / passwd tiene prioridad sobre todo.

Soy un usuario de Cygwin desde hace mucho tiempo y acabo de hacer una instalación limpia de Windows 7 x64 y Cygwin V1.126. Me estaba volviendo loco tratando de averiguar por qué cada vez que ejecutaba ssh seguía obteniendo:

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

Agregué la definición de HOME = c: \ users \ dhaynes en el entorno de Windows, pero seguía intentando crear '/ home / dhaynes'. Probé todos los combo que pude, incluida la configuración de HOME en / cygdrive / c / users / dhaynes. Busqué en Google el mensaje de error, no pude encontrar nada, no pude encontrar nada en el sitio cygwin. Utilizo cygwin de cmd.exe, no bash.exe pero el problema estaba presente en ambos.

Finalmente me di cuenta de que el directorio de inicio en / etc / passwd tenía prioridad sobre la variable de entorno $ HOME. Simplemente volví a ejecutar 'mkpasswd -l> / etc / passwd' y eso actualizó el directorio de inicio, ahora todo está bien con ssh.

Eso puede ser obvio para los tipos de Linux con experiencia en administradores de sistemas, pero para aquellos de nosotros que usamos principalmente Windows es un poco oscuro.

Dan Haynes
fuente
1
El directorio de inicio en / etc / passwd NO tiene prioridad sobre todo. Sin embargo, se utiliza como fuente principal para la ruta del directorio HOME al iniciar sesión de forma remota o mediante ssh. Vea esto en Cygwin FAQ cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Sucede que uso cwRsync (Cygwin + Rsync para Windows) donde cygwin viene incluido, y no pude encontrar / etc / passwd.

Y seguía diciendo

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

Así que escribí un archivo por lotes que cambió la variable HOME antes de ejecutar rsync. Algo como:

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

¡Y viola! La carpeta .ssh apareció en el directorio de trabajo actual y rsync dejó de molestar con las huellas dactilares de rsa.

Es una revisión rápida, pero luego debería cambiar HOME a una ubicación más segura.

TEHEK
fuente