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?
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?
Risposte:
A partire da Cygwin 1.7.34 , il modo consigliato per farlo è aggiungere un'impostazione personalizzata db_home
a /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' windows
opzione più molti altri %
token che puoi usare al posto %H
o in aggiunta ad essa. Vedere la nsswitch.conf
descrizione 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/passwd
file, 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 HOME
variabile d'ambiente venga impostata durante l'avvio della shell.²
Vedi questo articolo delle domande frequenti per ulteriori informazioni sull'argomento.
Note:
Considera l'idea di spostarti /etc/passwd
e di /etc/group
allontanarti per utilizzare il nuovo meccanismo basato su SAM / AD .
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
.
ssh
non funzionava correttamente fino alla modifica /etc/passwd
come descritto.
/etc/passwd
file. Vedi la mia risposta qui per evitare tali problemi.
db_home: /%H
potrebbe 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/%U
ha fatto quello che volevo.
db_home: windows
, ci vogliono da sh
2,5 a 3,5 secondi per iniziare. Quando lo uso db_home: /cygdrive/c/Users/%U
, ci vogliono da sh
0,9 a 1,0 secondi per iniziare. Quando elimino la db_home
riga o inserisco il codice nella home directory di Windows, l' sh
avvio 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 sh
comando, ad esempio sh foo.sh
e diventa scomodo aspettare più di 2 secondi.
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/passwd
o /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.conf
del 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.%H
Directory 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.
windows
La 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.
cygwin
Solo 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" .
unix
Solo 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" .
desc
La 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
Per coloro che utilizzano Cygwin 1.7.33 o precedenti, aggiornare all'ultima versione Cygwin e rimuovere i file utilizzati in precedenza /etc/passwd
e/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:
HOME
%USERPROFILE%
Ora aggiorneremo il /etc/passwd
file Cygwin con la %HOME%
variabile Windows che abbiamo appena creato. Gli accessi alla shell e gli accessi remoti tramite ssh
si baseranno su /etc/passwd
per indicare loro la posizione del $HOME
percorso 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 -d
switch dice a mkpasswd di includere gli utenti DOMINIO, mentre -l
serve 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
mkgroup
sopra.
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.
%HOME%
posizione di Windows , mentre Cygwin vim utilizza il nuovo $HOME
percorso che hai dichiarato.
Cygwin mount
ora 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
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
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.
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.
db_home:
per deselezionarlo e farlo funzionare.