Come posso cambiare la mia cartella home di Cygwin dopo l'installazione?


121

Ho appena installato Cygwin e sembra che la directory home nel prompt di bash sia sul mio disco Z :. Non è dove lo voglio.

Come posso cambiarlo?


1
Per coloro che utilizzano Cygwin 1.7.34 o versioni successive, utilizzare i metodi spiegati negli altri post, ma non dimenticare di rimuovere il # prima db_home:per deselezionarlo e farlo funzionare.
Maieul

Risposte:


180

A partire da Cygwin 1.7.34 , il modo consigliato per farlo è aggiungere un'impostazione personalizzata db_homea /etc/nsswitch.conf. Un desiderio comune quando si esegue questa operazione è rendere la directory home di Cygwin uguale alla directory del profilo utente di Windows. Questa impostazione lo farà:

db_home: windows

Oppure, equivalentemente:

db_home: /%H

È necessario utilizzare quest'ultimo modulo se si desidera qualche variazione su questo schema, come separare i file home di Cygwin in una sottodirectory della directory del profilo utente di Windows:

db_home: /%H/cygwin

Ci sono molti altri schemi alternativi per l' windowsopzione più molti altri %token che puoi usare al posto %Ho in aggiunta ad essa. Vedere la nsswitch.confdescrizione della sintassi nella Guida per l' utente di Cygwin per i dettagli.

Se hai installato Cygwin prima della 1.7.34 o hai eseguito il suo mkpasswd utilità in modo da avere un /etc/passwdfile, puoi cambiare la tua home directory di Cygwin modificando la voce dell'utente in quel file. La directory home è il penultimo elemento della riga dell'utente in /etc/passwd

In qualunque modo tu lo faccia, questo fa sì che la HOMEvariabile d'ambiente venga impostata durante l'avvio della shell.²

Vedi questo articolo delle domande frequenti per ulteriori informazioni sull'argomento.


Note:

  1. Considera l'idea di spostarti /etc/passwde di /etc/groupallontanarti per utilizzare il nuovo meccanismo basato su SAM / AD .

  2. Sebbene sia possibile impostare semplicemente %HOME%tramite il pannello di controllo, è ufficialmente sconsigliato . Non solo ignora senza tante cerimonie i meccanismi di cui sopra, ma non funziona sempre, come quando si eseguono script di shell tramite cron.


3
Nota che se hai installato la shell bash Git da git-scm.com/download/win , potresti avere problemi con l'installazione di cygwin (a seconda delle opzioni che hai scelto). Il mio cygwin ~ è finito nella mia directory utente Win7 e sshnon funzionava correttamente fino alla modifica /etc/passwdcome descritto.
Allan

I problemi che @Allan menziona qui con le installazioni git vengono risolti impostando la variabile di ambiente Windows per HOME e quindi ricreando il /etc/passwdfile. Vedi la mia risposta qui per evitare tali problemi.
Christopher,

11
db_home: /%Hpotrebbe risolversi per un nome utente di dominio (invece del nome utente locale), che potrebbe non essere quello che vorresti avere. db_home: /cygdrive/c/Users/%Uha fatto quello che volevo.
Abdull

2
Vedo una differenza di prestazioni tra i vari metodi. Quando lo uso db_home: windows, ci vogliono da sh2,5 a 3,5 secondi per iniziare. Quando lo uso db_home: /cygdrive/c/Users/%U, ci vogliono da sh0,9 a 1,0 secondi per iniziare. Quando elimino la db_homeriga o inserisco il codice nella home directory di Windows, l' shavvio richiede da 0,2 a 0,3 secondi. Vado con la soluzione hardcoded, ad esempio db_home: /cygdrive/c/Users/susam, perché spesso eseguo script di shell dal prompt dei comandi utilizzando il shcomando, ad esempio sh foo.she diventa scomodo aspettare più di 2 secondi.
Susam Pal

1
Grazie @abdull, db_home: / cygdrive / c / Users /% U è la risposta di cui avevo bisogno. db_home: windows usa "/ home /% U", che non esiste nella mia configurazione.
Jeff

74

Cygwin 1.7.34+

Per coloro che utilizzano Cygwin 1.7.34 o versioni successive, Cygwin supporta la configurazione di come recuperare la directory home, la shell di login e le informazioni gecos in /etc/nsswitch.conf. Questo è dettagliato nella sezione Cygwin User Guide:

Se hai già creato un file /etc/passwdo /etc/group, ti consigliamo di rimuoverli e configurare Cygwin utilizzando il nuovo modello di sicurezza di Windows per le mappature POSIX.

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

L' impostazione /etc/nsswitch.confdel file db_home:definisce come Cygwin recupera la directory home dell'utente. L'impostazione predefinita per db_home:è

db_home: /home/%U

Quindi, per impostazione predefinita, Cygwin imposta solo la directory home su /home/$USERNAME. Puoi modificarlo in modo che punti a qualsiasi altro percorso personalizzato che desideri. I caratteri jolly supportati sono:

  • %u Il nome utente Cygwin (che è u minuscola).
  • %U Il nome utente di Windows (che è la U maiuscola).
  • %D Dominio Windows in stile NetBIOS.
  • %HDirectory home di Windows in stile POSIX. Nota che, per l' db_home:impostazione, questo ha senso solo subito dopo la barra precedente, come indb_home: /%H/cygwin
  • %_Poiché i caratteri spazio e TAB vengono utilizzati per separare gli schemi, è necessario fornire uno spazio nel nome del file %_(che è un trattino basso).
  • %% Un carattere per cento.

Al posto di un percorso, è possibile specificare uno dei quattro schemi di percorso denominati predefiniti.

  1. windowsLa directory home dell'utente è impostata sulla stessa directory utilizzata come directory home di Windows, in genere qualcosa sulla falsariga di %USERPROFILE%o C:\Users\$USERNAME. Ovviamente, la directory di Windows viene convertita in stile POSIX da Cygwin.

  2. cygwinSolo AD: la directory home dell'utente è impostata sul percorso POSIX fornito nell'attributo cygwinHome dalla classe ausiliaria cygwinUser. Vedere anche la sezione chiamata "Lo schema cygwin" .

  3. unixSolo AD: la directory home dell'utente è impostata sul percorso POSIX fornito nell'attributo unixHomeDirectory dalla classe ausiliaria posixAccount. Vedere anche la sezione chiamata "Lo schema unix" .

  4. descLa directory home dell'utente è impostata sul percorso POSIX fornito nell'impostazione home = "..." simile a XML nell'attributo di descrizione dell'utente in SAM o AD. Vedere la sezione chiamata "Lo schema desc" per una descrizione dettagliata.

Quanto segue renderà la directory home dell'utente in Cygwin la stessa utilizzata per la directory home di Windows.

db_home: windows

Cygwin 1.7.33 o versioni precedenti

Per coloro che utilizzano Cygwin 1.7.33 o precedenti, aggiornare all'ultima versione Cygwin e rimuovere i file utilizzati in precedenza /etc/passwde/etc/group file , quindi consulta i passaggi precedenti.

Altrimenti, segui questi passaggi precedenti di seguito.

Innanzitutto, imposta una variabile di ambiente Windows per HOME che punta al tuo profilo utente:

  1. Apri Sistema nel pannello di controllo
  2. Nella scheda Avanzate fare clic su Variabili d'ambiente (verso il basso)
  3. Nell'area Variabili utente fare clic su "Nuovo ..."
  4. In Nome variabile immettere HOME
  5. Per Valore variabile immettere %USERPROFILE%
  6. Fare clic su OK in tutte le finestre di dialogo aperte per applicare questa nuova impostazione

Ora aggiorneremo il /etc/passwdfile Cygwin con la %HOME%variabile Windows che abbiamo appena creato. Gli accessi alla shell e gli accessi remoti tramite sshsi baseranno su /etc/passwdper indicare loro la posizione del $HOMEpercorso dell'utente .

Al prompt dei comandi di Cygwin bash digitare quanto segue:

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

Lo -dswitch dice a mkpasswd di includere gli utenti DOMINIO, mentre -lserve solo agli utenti della macchina LOCALE. Questo è importante se utilizzi un PC al lavoro in cui le informazioni sull'utente vengono ottenute da un controller di dominio di Windows.

Ora puoi fare lo stesso anche per i gruppi, anche se non è necessario a meno che tu non stia utilizzando un computer che fa parte di un dominio Windows. Cygwin legge le informazioni sui gruppi dai database degli account di Windows, ma puoi aggiungere un file/etc/group file se la tua macchina è spesso disconnessa dal suo controller di dominio.

Al prompt bash di Cygwin digitare quanto segue:

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

Ora, esci da Cygwin e riavvialo. Dovresti scoprire che il tuo percorso HOME punta alla stessa posizione del tuo profilo utente di Windows, ad es/cygdrive/c/Users/username


7
-d è molto lento. Se hai bisogno solo dell'utente corrente, puoi usare -c invece: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor

Ben ha ragione, puoi semplicemente aggiungere una voce per l'utente corrente specificando invece -c. Se lo fai, tuttavia, Cygwin mostrerà ????? per l'utente e il gruppo quando si elencano i file su file system condivisi, poiché non avrà record per altri utenti e gruppi sul dominio o sul computer locale.
Christopher

1
Posso suggerire una piccola modifica nel testo: invece di 'Ora, aggiorna il tuo file Cygwin / etc / passwd con un nuovo percorso $ HOME', suggerirei 'Ora aggiorneremo il file Cygwin / etc / passwd con il Variabile HOME che abbiamo appena creato. " Molte grazie
Robert

Con -d ci vogliono minuti (ho ucciso dopo 5) minuti per completare. Quindi ho rieseguito con -c. Tutto bene per le mie esigenze.
bartosz.r

1
@Samuel ho aggiunto una spiegazione per chiarire lo scopo di cui mkgroupsopra.
Christopher,

30

Ho fatto qualcosa di abbastanza semplice. Non volevo cambiare la variabile d'ambiente di Windows 7. Quindi ho modificato direttamente il file Cygwin.bat.

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

Questo avvia semplicemente la shell locale con questa directory home; questo è quello che volevo. Non ho intenzione di accedervi da remoto, quindi per me ha funzionato.


Secondo, perché non posso cambiare la mia variabile d'ambiente home nella mia macchina di sviluppo.
Deqing

@WernerCD Vorrei solo avvertire che questo può avere conseguenze indesiderate quando si interagisce con le applicazioni Windows native. Le tue applicazioni Windows continueranno a cercare HOME nella vecchia posizione. Un esempio potrebbe essere Gvim, che manterrà una configurazione separata di vim nella vecchia %HOME%posizione di Windows , mentre Cygwin vim utilizza il nuovo $HOMEpercorso che hai dichiarato.
Christopher,

Questo è fantastico ... 5 anni dopo e mi piace perché l '"ingegneria" è abbastanza semplice da usare e capire per un parente newb di Cygwin (come me). Per inciso, inserire un collegamento al file .bat in C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo significa che puoi andare su Invia -> Cygwin nel menu sensibile al contesto (tasto destro) in Explorer (e apri un terminale ovunque, con ~ / set dove vuoi).
mike rodent

19

Cygwin mountora supporta il metodo bind che consente di montare una directory. Quindi puoi semplicemente aggiungere la seguente riga a /etc/fstab, quindi riavviare la shell:

c:/Users /home none bind 0 0

Questo è al giorno d'oggi il modo corretto. Le altre risposte sono obsolete.
Ceving

@ceving È documentato da qualche parte?
Asad Saeeduddin

10

Cambia la tua variabile d'ambiente HOME.

su XP, fare clic con il pulsante destro del mouse su Risorse del computer >> Proprietà >> Avanzate >> Variabili d'ambiente >> Variabili utente per >> [selezionare la variabile HOME] >> modifica


1
Questo cambierà anche la tua variabile d'ambiente HOME per tutte le tue applicazioni Windows.
mafia

Verissimo. Ma quali applicazioni Windows hai che usano la variabile HOME? Ho EmacsW32 e .... Cygwin. Da quando ho installato prima Emacs, è lì che si trova anche la mia casa Cygwin.
Michael Paulukonis,

1
Non sarà in qualche modo in conflitto con / etc / passwd? Il valore predefinito sarà HOME di / etc / passwd se la variabile d'ambiente non è impostata? Se non ci sono conflitti e il valore predefinito è / etc / passwd, sembra la configurazione perfetta: sto eseguendo Cygwin da una pen drive, sia per evitare di dover chiedere il permesso di installare al lavoro, e quindi ho un Unix- come l'ambiente in tasca che posso usare quando è disponibile solo una scatola di Windows. Al lavoro avrò la home directory del mio computer di lavoro e altrove posso avere una home directory sulla thumbdrive.
iconoclasta

6

Vorrei aggiungere una correzione / aggiornamento al bit su $ HOME che ha la precedenza. La directory home in / etc / passwd ha la precedenza su tutto.

Sono un utente Cygwin da molto tempo e ho appena eseguito un'installazione pulita di Windows 7 x64 e Cygwin V1.126. Stavo impazzendo cercando di capire perché ogni volta che eseguivo ssh continuavo a ricevere:

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

Ho aggiunto la definizione HOME = c: \ users \ dhaynes nell'ambiente Windows, ma ho continuato a provare a creare "/ home / dhaynes". Ho provato tutte le combinazioni che potevo, inclusa l'impostazione di HOME su / cygdrive / c / users / dhaynes. Ho cercato su Google il messaggio di errore, non è stato possibile trovare nulla, non è stato possibile trovare nulla sul sito di cygwin. Uso cygwin da cmd.exe, non bash.exe ma il problema era presente in entrambi.

Alla fine ho capito che la directory home in / etc / passwd aveva la precedenza sulla variabile d'ambiente $ HOME. Ho semplicemente rieseguito 'mkpasswd -l> / etc / passwd' e ho aggiornato la directory home, ora tutto va bene con ssh.

Questo può essere ovvio per i tipi di Linux con esperienza di amministratore di sistema, ma per quelli di noi che usano principalmente Windows è un po 'oscuro.


1
La directory home in / etc / passwd NON ha la precedenza su tutto. Tuttavia, viene utilizzato come fonte primaria per il percorso della directory HOME quando si accede da remoto o si utilizza ssh. Vedi questo dalle FAQ di Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher

2

Mi capita di usare cwRsync (Cygwin + Rsync per Windows) dove cygwin viene fornito in bundle e non sono riuscito a trovare / etc / passwd.

E continuava a dire

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

Quindi ho scritto un file batch che ha cambiato la variabile HOME prima di eseguire rsync. Qualcosa di simile a:

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

E viola! La cartella .ssh è apparsa nella directory di lavoro corrente e rsync ha smesso di infastidire con le impronte digitali rsa.

È un rapido hotfix, ma in seguito dovresti cambiare HOME in una posizione più sicura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.