Cambiar el directorio de inicio de forma segura

82

Estoy tratando de actualizar de forma segura el directorio de inicio como se especifica en /etc/passwd, pero Cygwin no proporciona las utilidades estándar de Linux (usermod y vipw) para hacerlo.

¿Alguien podría decirme cómo cambiaron esto en Cygwin?

sblundy
fuente
4
La pregunta duplicada en stackoverflow.com/q/1494658/923560 proporciona respuestas para las versiones recientes de Cygwin que comienzan con 1.7.34.
Abdull

Respuestas:

96

EDITAR: Para versiones recientes de Cygwin (1.7.34 y posteriores), consulte esta pregunta más reciente .

Como la respuesta de sblundy, siempre puedes editar a mano.

Pero si desea hacerlo de la forma "oficial", utilice el mkpasswdcomando específico de cygwin . A continuación se muestra un fragmento de los documentos oficiales sobre mkpasswd:

Por ejemplo, este comando:

Ejemplo 3.11. Usar una raíz casera alternativa

$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

pondría los directorios de inicio de los usuarios locales en el directorio "Perfiles" de Windows.

Hay un montón de otros comandos realmente útiles descritos en la página de documentación de Cygwin Utilities (que incluye mkpasswd). El uso de cygpathen el ejemplo anterior es otra de estas herramientas específicas de cygwin.

Mientras lo hace, probablemente también desee leer la documentación de Uso eficaz de Cygwin con Windows . Hay un montón de buenos consejos.

Netjeff
fuente
10
Si está en un dominio, puede considerar este comando alternativo: ( -dpara el dominio) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd Esto no funcionó para mí, básicamente se colgó. Como soy el único que usa esta máquina, podría usar esta alternativa, que debería ser segura ya sea que esté o no en un dominio ( -ces para "usuario actual") $ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
Ryan Pavlik
1
Después de hacer esto, parece que el .bashrc no se lee, incluso si lo copio a mi nuevo $HOME. ¿Algúna idea de cómo arreglar esto?
Jeff
1
La salida debe adjuntarse (>>) a / etc / passwd (para escenarios corporativos con varios usuarios). ¡Esto funcionó! :)
Andre
1
usa uname -r para ver en qué versión de cygwin estás
martin jakubik
19

Terminé saliendo de todos mis shells cygwin y editándolos a mano en un editor de texto. Hasta ahora tan bueno.

Nota: no escapes de los espacios en el directorio "Documentos y configuraciones". La entrada se verá como

user:...:/cygdrive/c/Documents and Settings/user:/bin/bash

La línea está tokenizada en el :personaje.

sblundy
fuente
Esto también funciona para las rutas UNC, gracias se anuló con la variable HOME antes
HaveAGuess
¿Qué tengo que editar a mano? No sé por qué mi directorio de inicio cygwin es /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6 Quiero que sea C: / Users / MyName /
16

La respuesta más simple que he encontrado es hacer que / home sea un enlace suave a su directorio Windows Home / UserProfile

cd /
mv home oldhome
ln -s "$(cygpath -H)" home

Usé cygpath ya que obtendrá la ubicación adecuada para el directorio HOME en la versión actual de Windows. En mi caja cygpath -Hregresa/cygdrive/c/Users

M Smith
fuente
Después de hacer esto durante algún tiempo, hay un inconveniente: tengo que ejecutarlo cada vez que actualizo cygwin usando su setup.exe. No es gran cosa, pero es algo para recordar.
M Smith
Esta es la mejor respuesta. Me pregunto por qué cygwin no lo hace cygwin -Hpor defecto. Es la ubicación más sensata y, desde Windows 7, tampoco hay espacio en su camino.
Dashesy
en otra nota, esto no funcionará. ¡De repente decidió ignorar el enlace simbólico!
Dashesy
Debe volver a aplicarlo cuando vuelva a ejecutar el programa de instalación. Esa es la única vez que me ha fallado. Sin embargo, todavía no lo he probado en Windows 10
M Smith
Funciona como se esperaba en Windows 10. Todavía tengo que volver a aplicar cada vez que actualizo cygwin.
M Smith
8

Para el usuario actual, lo siguiente funcionó para mí:

  1. Cierre Cygwin.
  2. Configure la variable de entorno de usuario HOME de Windows.
  3. Inicie Cygwin.
  4. ejecute "mkpasswd -c -p" $ (cygpath -H) "> / etc / passwd".
  5. Reinicie Cygwin.

Confirmé que funcionaba ejecutando ssh-keygen sin ningún argumento. Después de realizar este cambio, la aplicación ahora tiene como valor predeterminado guardar la clave en / cygdrive / c / Users / user en lugar de / home / user.

No sé si es necesario configurar HOME, pero lo hice de todos modos según las instrucciones para configurar TortoiseGit con Cygwin usando la documentación oficial de Tortoise para soporte no oficial de Cygwin aquí . Sin embargo, configurar HOME solo no fue suficiente para que ssh-keygen reconociera el cambio del directorio de inicio.

Además, tenga en cuenta que la documentación oficial de Cygwin sobre este tema se puede encontrar aquí .

Confirmado en Windows 7 usando Cygwin v1.7.35 de 64 bits.

Samuel
fuente
Para Cygwin 1.7.35+, se desaconseja el uso de mkpasswd en favor de /etc/nsswitch.conf
Christopher
4

Siempre configuro HOME como una variable de entorno específica del usuario en Propiedades del equipo.

JesperE
fuente
Estoy tratando de evitar eso, ya que está configurado en una unidad de red corporativa. Aunque parece que funcionaría.
sblundy
6
Tenga en cuenta que esto no funcionará para ssh, ignora explícitamente HOME y siempre usa / etc / passwd. Consulte la última oración de cygwin.com/faq/faq-nochunks.html#faq.setup.home .
studgeek
3

Para evitar problemas causados ​​por tener espacios en la ruta a su directorio de inicio, use la forma abreviada del directorio 'Perfiles' de Windows, es decir /cygdrive/c/DOCUME~1/user.

Puede hacer esto escribiendo el comando:

mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd
Steven Penny
fuente
2

Me gusta mantener mi instalación de cygwin sincronizada con un pendrive y otra computadora, así que odio codificar el directorio de inicio. Yo uso el siguiente cygwin.bat:

echo off
SETLOCAL
set SHELL=\\bin\\bash
set HOME=%~dp0..\..\doc\unix
bin\bash --login -i
ENDLOCAL

SETLOCAL y ENDLOCAL se aseguran de que SHELL y HOME no superen las variables env existentes para otros programas. HOME=%~dp0..\..\doc\unixestablece HOME para que esté dos directorios arriba, en el subdirectorio doc / unix. Luego, en .... \ doc \ unix.bashrc, incluyo PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin". No uséstart /wait %CD%\bin\bash para iniciar bash, porque estoy usando Console2 , por lo que no necesito una ventana de cmd adicional.

P. Myer Nore
fuente
2

Uso de la variable de entorno de Windows: INICIO

Esto me funciona para una solución permanente, no portátil y sin red; es decir, establecer la variable de entorno HOME de forma permanente en Windows.

Tenga en cuenta que esto no afecta a las sesiones ssh o telnet que siempre se refieren a / etc / passwd

ref: Configuración de Cygwin- Mi variable de entorno HOME no es lo que quiero.

CMD

Para el usuario actual (debe ejecutarse una vez por usuario):

reg add HKCU\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Para nuevos usuarios:

reg add HKU\.DEFAULT\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Nota: intercalaciones ^ antes de los signos de porcentaje%

IMPORTAR ARCHIVO REG

Importe este archivo de registro ( usuario actual ):

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

Para nuevos usuarios:

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

REGÉDITO

En Regedit, bajo:

Para el usuario actual :

HKEY_CURRENT_USER\Environment

Para nuevos usuarios:

HKU\.DEFAULT\Environment

Cree HOME como un nuevo valor de cadena expandible (* REG_EXPAND_SZ *) y coloque % USERPROFILE%

wyrdR
fuente
Cualquiera que sea la información en la que se basó esta respuesta, ya no es actual. El enlace ref: también está roto. No probaría esto en casa.
Christopher
2

Respuesta original de Christopher de otro lugar.

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 forma 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 la 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 dada 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. Vea también la sección llamada "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. Consulte la sección llamada "El esquema desc" para obtener una descripción detallada.

Lo siguiente hará que el directorio de inicio del usuario en Cygwin sea el mismo que se utiliza 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 consulte 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 para 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
1
cd /home
rm -rf chris
ln -s /cygdrive/z chris

No estoy realmente seguro de si es la solución más segura, pero es una posible solución que funciona para mí;)

hacer kitesurf
fuente
0

Edité mi archivo / etc / passwd directamente (asegurándome de que nada más accedería a él) y cambié todas las referencias a / home a / Users (en Windows 7). Descubrí que, para que todo funcionara correctamente, tenía que eliminar todos los directorios del directorio / home (o moverlos a la otra ubicación adecuada). De lo contrario, cygwin desarrollaría una personalidad dividida donde, por ejemplo, 'bash -l' comenzaría en / home / Pablo pero $ HOME sería / Users / Pablo y emacs parecería hacer lo contrario. Una vez que borré / home / Pablo, todo funcionó bien.

Pablo Halpern
fuente
0

Solo necesitaba estar C:\Users\usernamecuando comenzara con cygwin. Entonces, solo agregué .bashrcy.profile

cd ${HOMEPATH}

Si prefiere usar en ~/.lugar de $HOMEPATH, también puede agregar lo siguiente:

export HOME=${HOMEPATH}

De esta forma no interrumpo la instalación de cygwin.

usuario123456789
fuente