Bagaimana cara mengubah folder home Cygwin saya setelah instalasi?

121

Saya baru saja menginstal Cygwin, dan sepertinya direktori home di prompt bash ada di drive Z: saya. Bukan itu yang kuinginkan.

Bagaimana saya bisa mengubah ini?

Nathan Long
sumber
1
Untuk mereka yang menggunakan Cygwin 1.7.34 atau lebih tinggi, gunakan metode yang dijelaskan di posting lain, tetapi jangan lupa untuk menghapus # sebelum membatalkan db_home:kutipan dan membuatnya berfungsi.
Maieul

Jawaban:

180

Dimulai dengan Cygwin 1.7.34 , cara yang disarankan untuk melakukannya adalah dengan menambahkan db_homepengaturan khusus ke /etc/nsswitch.conf. Keinginan umum saat melakukan ini adalah membuat direktori home Cygwin Anda sama dengan direktori profil pengguna Windows Anda. Pengaturan ini akan melakukannya:

db_home: windows

Atau, dengan kata lain:

db_home: /%H

Anda perlu menggunakan formulir terakhir jika Anda menginginkan variasi pada skema ini, seperti memisahkan file home Cygwin Anda ke dalam subdirektori dari direktori profil pengguna Windows Anda:

db_home: /%H/cygwin

Ada beberapa skema alternatif lain untuk windowsopsi tersebut ditambah beberapa %token lain yang dapat Anda gunakan sebagai pengganti %Hatau sebagai tambahan. Lihat yang nsswitch.confdeskripsi sintaks di Cygwin Panduan Pengguna untuk rincian.

Jika Anda menginstal Cygwin sebelum 1.7.34 atau telah menjalankan mkpasswdutilitasnya sehingga Anda memiliki /etc/passwdfile, Anda dapat mengubah direktori home Cygwin Anda dengan mengedit entri pengguna Anda di file itu. Direktori beranda Anda adalah elemen kedua hingga terakhir pada baris pengguna Anda di /etc/passwd

Apa pun cara Anda melakukannya, ini menyebabkan HOMEvariabel lingkungan disetel selama startup shell.²

Lihat item FAQ ini untuk mengetahui lebih lanjut tentang topik tersebut.


Catatan kaki:

  1. Pertimbangkan bergerak /etc/passwddan /etc/groupkeluar dari jalan untuk menggunakan SAM baru / mekanisme berbasis AD sebagai gantinya.

  2. Meskipun dimungkinkan untuk hanya mengatur %HOME%melalui Panel Kontrol, secara resmi tidak disarankan . Tidak hanya menggantikan mekanisme di atas begitu saja, itu tidak selalu berfungsi, seperti saat menjalankan skrip shell melalui cron.

Warren Young
sumber
3
Perhatikan bahwa jika Anda menginstal Git bash shell dari git-scm.com/download/win , Anda mungkin mengalami masalah dengan instalasi cygwin (bergantung pada opsi yang Anda pilih). Cygwin ~ saya berakhir di direktori pengguna Win7 saya dan sshtidak akan berfungsi dengan benar sampai pengeditan /etc/passwdseperti yang dijelaskan.
Allan
Masalah yang disebutkan @Allan di sini dengan penginstalan git diatasi dengan menyetel variabel lingkungan Windows untuk HOME dan kemudian membuat ulang /etc/passwdfile tersebut. Lihat jawaban saya di sini untuk menghindari masalah seperti itu.
Christopher
11
db_home: /%Hmungkin menyelesaikan untuk nama pengguna domain (bukan nama pengguna lokal), yang mungkin bukan yang Anda inginkan. db_home: /cygdrive/c/Users/%Umelakukan apa yang saya inginkan.
Abdull
2
Saya melihat perbedaan kinerja antara berbagai metode. Saat saya gunakan db_home: windows, dibutuhkan shsekitar 2,5 hingga 3,5 detik untuk memulai. Saat saya menggunakan db_home: /cygdrive/c/Users/%U, dibutuhkan shsekitar 0,9 hingga 1,0 detik untuk memulai. Ketika saya menghapus db_homebaris atau kode keras ke direktori home Windows, shmembutuhkan waktu sekitar 0,2 hingga 0,3 detik untuk memulai. Saya akan menggunakan solusi hard-coded, misalnya db_home: /cygdrive/c/Users/susam, karena saya sering menjalankan skrip shell dari Command Prompt menggunakan shperintah, misalnya sh foo.shdan menunggu lebih dari 2 detik menjadi tidak nyaman.
Susam Pal
1
Terima kasih @abdull, db_home: / cygdrive / c / Users /% U adalah jawaban yang saya butuhkan. db_home: windows menggunakan "/ home /% U", yang tidak ada di konfigurasi saya.
Jeff
74

Cygwin 1.7.34+

Bagi mereka yang menggunakan Cygwin 1.7.34 atau lebih tinggi, Cygwin mendukung konfigurasi cara mengambil direktori home, shell login, dan informasi gecos di /etc/nsswitch.conf. Ini dirinci di bagian Panduan Pengguna Cygwin:

Jika sebelumnya Anda telah membuat file /etc/passwdatau, /etc/groupAnda ingin menghapusnya dan mengkonfigurasi Cygwin menggunakan model Keamanan Windows baru untuk pemetaan POSIX.

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

Pengaturan /etc/nsswitch.conffile db_home:menentukan bagaimana Cygwin mengambil direktori home pengguna. Pengaturan default untuk db_home:adalah

db_home: /home/%U

Jadi secara default, Cygwin hanya menyetel direktori home ke /home/$USERNAME. Anda dapat mengubahnya meskipun untuk menunjuk ke jalur kustom lain yang Anda inginkan. Karakter wildcard yang didukung adalah:

  • %u Nama pengguna Cygwin (huruf kecil u).
  • %U Nama pengguna Windows (huruf besar U).
  • %D Domain Windows dalam gaya NetBIOS.
  • %HDirektori beranda Windows dengan gaya POSIX. Perhatikan bahwa, untuk db_home:pengaturan, ini hanya masuk akal tepat setelah garis miring sebelumnya, seperti padadb_home: /%H/cygwin
  • %_Karena spasi dan karakter TAB digunakan untuk memisahkan skema, spasi dalam nama file harus diberikan sebagai %_(itu garis bawah).
  • %% Karakter persen.

Sebagai ganti jalur, Anda bisa menentukan salah satu dari empat skema jalur bernama yang sudah ditentukan sebelumnya.

  1. windowsDirektori home pengguna diatur ke direktori yang sama yang digunakan sebagai direktori home Windows, biasanya sesuatu di sepanjang baris %USERPROFILE%atau C:\Users\$USERNAME. Tentu saja, direktori Windows diubah menjadi gaya POSIX oleh Cygwin.

  2. cygwinHanya AD: Direktori home pengguna disetel ke jalur POSIX yang diberikan dalam atribut cygwinHome dari kelas bantu cygwinUser. Lihat juga bagian bernama "The cygwin schema" .

  3. unixHanya IKLAN: Direktori beranda pengguna disetel ke jalur POSIX yang diberikan dalam atribut unixHomeDirectory dari kelas tambahan posixAccount. Lihat juga bagian yang disebut "Skema unix" .

  4. descDirektori beranda pengguna disetel ke jalur POSIX yang diberikan dalam setelan mirip-XML home = "..." di atribut deskripsi pengguna di SAM atau AD. Lihat bagian bernama "The desc schema" untuk penjelasan mendetail.

Berikut ini akan membuat direktori home pengguna di Cygwin sama dengan yang digunakan untuk direktori home Windows.

db_home: windows

Cygwin 1.7.33 atau yang lebih lama

Bagi mereka yang menggunakan Cygwin 1.7.33 atau sebelumnya, perbarui ke versi terbaru Cygwin dan hapus file /etc/passwddan yang sebelumnya digunakan /etc/group, kemudian lihat langkah-langkah di atas.

Lain, ikuti langkah-langkah lama di bawah ini.

Pertama, tetapkan variabel lingkungan Windows untuk HOME yang mengarah ke profil pengguna Anda:

  1. Buka Sistem di Panel Kontrol
  2. Pada tab Advanced , klik Variabel Lingkungan (mengarah ke bawah)
  3. Di area Variabel Pengguna, klik "Baru…"
  4. Untuk nama Variabel masukkan HOME
  5. Untuk nilai Variabel masukkan %USERPROFILE%
  6. Klik OK di semua kotak dialog yang terbuka untuk menerapkan pengaturan baru ini

Sekarang kita akan memperbarui /etc/passwdfile Cygwin dengan %HOME%variabel Windows yang baru kita buat. Shell login dan remote login via sshakan mengandalkan /etc/passwduntuk memberi tahu mereka lokasi jalur pengguna $HOME.

Pada prompt perintah Cygwin bash ketik yang berikut ini:

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

The -dberalih memberitahu mkpasswd untuk memasukkan pengguna DOMAIN, sementara -luntuk pengguna mesin LOKAL hanya output. Ini penting jika Anda menggunakan PC di tempat kerja tempat informasi pengguna diperoleh dari Pengontrol Domain Windows.

Sekarang, Anda juga dapat melakukan hal yang sama untuk grup, meskipun ini tidak perlu kecuali Anda akan menggunakan komputer yang merupakan bagian dari Domain Windows. Cygwin membaca informasi grup dari database akun Windows, tetapi Anda dapat menambahkan /etc/groupfile jika komputer Anda sering terputus dari Kontroler Domainnya.

Pada prompt Cygwin bash ketik yang berikut ini:

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

Sekarang, keluar dari Cygwin dan mulai lagi. Anda harus menemukan bahwa jalur HOME Anda menunjuk ke lokasi yang sama dengan Profil Pengguna Windows Anda - yaitu/cygdrive/c/Users/username

Christopher
sumber
7
-d sangat lambat. Jika Anda hanya membutuhkan pengguna saat ini, Anda dapat menggunakan -c sebagai gantinya: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben benar, Anda bisa menambahkan entri untuk pengguna saat ini dengan menentukan -c. Jika Anda melakukannya, Cygwin akan menampilkan ????? untuk Pengguna dan Grup saat membuat daftar file di sistem file bersama, karena tidak akan memiliki catatan untuk pengguna dan grup lain di Domain atau komputer lokal Anda.
Christopher
1
Dapatkah saya menyarankan perubahan kecil pada kata-kata: daripada 'Sekarang, perbarui file Cygwin / etc / passwd Anda dengan jalur $ HOME baru', saya sarankan 'Sekarang kita akan memperbarui file Cygwin / etc / passwd dengan Variabel HOME baru saja kita buat. ' Terima kasih banyak
Robert
Dengan -d Butuh beberapa menit (saya telah membunuh setelah 5) menit untuk menyelesaikannya. Jadi saya telah menjalankan ulang dengan -c. Semua baik untuk kebutuhan saya.
bartosz.r
1
@Samuel Saya telah menambahkan penjelasan untuk memperjelas tujuan di mkgroupatas.
Christopher
30

Saya melakukan sesuatu yang sangat sederhana. Saya tidak ingin mengubah variabel lingkungan windows 7. Jadi saya langsung mengedit file Cygwin.bat.

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

Ini baru memulai shell lokal dengan direktori home ini; itulah yang saya inginkan. Saya tidak akan mengakses ini dari jarak jauh, jadi ini berhasil untuk saya.

Ajay
sumber
Kedua ini karena saya tidak dapat mengubah variabel lingkungan rumah saya di mesin dev saya.
Deqing
@WernerCD Saya hanya akan memperingatkan bahwa ini dapat memiliki konsekuensi yang tidak diinginkan saat berinteraksi dengan aplikasi Windows asli. Aplikasi Windows Anda akan terus mencari HOME di lokasi lama. Contohnya adalah Gvim, yang akan mempertahankan konfigurasi vim terpisah di %HOME%lokasi Windows lama , sementara Cygwin vim menggunakan $HOMEjalur baru yang Anda nyatakan.
Christopher
Ini luar biasa ... 5 tahun kemudian dan saya menyukainya karena "rekayasa" cukup sederhana untuk digunakan dan dipahami oleh seorang Cygwin relatif newb (seperti saya). Secara tidak sengaja, menempatkan pintasan ke file .bat Anda di C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo berarti Anda dapat membuka Send -> Cygwin pada menu konteks-sensitif (klik kanan) di Explorer (dan buka terminal di mana saja, dengan ~ / set dimanapun Anda inginkan).
mike rodent
19

Cygwin mountsekarang mendukung metode bind yang memungkinkan Anda memasang direktori. Karenanya Anda cukup menambahkan baris berikut ke /etc/fstab, lalu restart shell Anda:

c:/Users /home none bind 0 0
Jihem
sumber
Sekarang ini adalah cara yang benar. Jawaban lainnya sudah usang.
ceving
@ceving Apakah ini didokumentasikan di mana saja?
Asad Saeeduddin
10

Ubah variabel lingkungan HOME Anda.

di XP, klik kanan My Computer >> Properties >> Advanced >> Variabel Lingkungan >> Variabel Pengguna untuk >> [pilih variabel HOME] >> edit

Michael Paulukonis
sumber
1
Ini akan mengubah variabel lingkungan HOME Anda untuk semua aplikasi Windows Anda juga.
mafia
Sangat benar. Tetapi aplikasi Windows apa yang Anda miliki yang menggunakan variabel HOME? Saya memiliki EmacsW32 dan .... Cygwin. Sejak saya menginstal Emacs terlebih dahulu, di situlah letak rumah cygwin saya juga.
Michael Paulukonis
1
Bukankah ini akan bertentangan dengan / etc / passwd? Akankah default ke / etc / passwd's HOME jika variabel lingkungan tidak disetel? Jika tidak ada konflik dan itu akan default ke / etc / passwd, sepertinya pengaturan yang sempurna: Saya menjalankan Cygwin dari thumbdrive, keduanya untuk menghindari keharusan meminta izin untuk menginstal di tempat kerja, jadi saya memiliki Unix- seperti lingkungan di saku saya yang dapat saya gunakan ketika hanya kotak Windows yang tersedia. Di tempat kerja saya akan memiliki direktori home komputer kerja saya, dan di tempat lain saya dapat memiliki direktori home di thumbdrive.
iconoclast
6

Saya ingin menambahkan koreksi / pembaruan sedikit tentang $ HOME yang diutamakan. Direktori home di / etc / passwd didahulukan dari segalanya.

Saya adalah pengguna Cygwin lama dan saya baru saja menginstal Windows 7 x64 dan Cygwin V1.126 dengan bersih. Saya menjadi gila mencoba mencari tahu mengapa setiap kali saya berlari ssh saya terus mendapatkan:

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

Saya menambahkan definisi HOME = c: \ users \ dhaynes di lingkungan Windows tetapi tetap mencoba membuat '/ home / dhaynes'. Saya mencoba setiap kombo yang saya bisa termasuk pengaturan HOME ke / cygdrive / c / users / dhaynes. Mencari pesan kesalahan di Google, tidak dapat menemukan apa pun, tidak dapat menemukan apa pun di situs cygwin. Saya menggunakan cygwin dari cmd.exe, bukan bash.exe tetapi masalahnya ada di keduanya.

Saya akhirnya menyadari bahwa direktori home di / etc / passwd lebih diutamakan daripada variabel lingkungan $ HOME. Saya dengan sederhana menjalankan ulang 'mkpasswd -l> / etc / passwd' dan itu memperbarui direktori home, sekarang semuanya baik-baik saja dengan ssh.

Itu mungkin jelas untuk tipe linux dengan pengalaman sysadmin tetapi bagi kita yang terutama menggunakan Windows itu agak tidak jelas.

Dan Haynes
sumber
1
Direktori home di / etc / passwd TIDAK didahulukan dari semuanya. Namun ini digunakan sebagai sumber utama untuk jalur direktori HOME Anda saat masuk dari jarak jauh, atau menggunakan ssh. Lihat ini dari FAQ Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Saya kebetulan menggunakan cwRsync (Cygwin + Rsync untuk Windows) di mana cygwin dibundel, dan saya tidak dapat menemukan / etc / passwd.

Dan itu terus berkata

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

Jadi saya menulis file batch yang mengubah variabel HOME sebelum menjalankan rsync. Sesuatu seperti:

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

Dan biola! Folder .ssh muncul di direktori yang berfungsi saat ini dan rsync berhenti mengganggu dengan sidik jari rsa.

Ini hotfix cepat, tetapi nanti Anda harus mengubah HOME ke lokasi yang lebih aman.

TEHEK
sumber