ฉันจะเปลี่ยนโฟลเดอร์หลักของ Cygwin หลังการติดตั้งได้อย่างไร?


121

ฉันเพิ่งติดตั้ง Cygwin และดูเหมือนว่าโฮมไดเร็กทอรีใน bash prompt อยู่ในไดรฟ์ Z: ของฉัน นั่นไม่ใช่ที่ที่ฉันต้องการ

ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร?


1
สำหรับผู้ที่ใช้ Cygwin 1.7.34 ขึ้นไปให้ใช้วิธีการที่อธิบายไว้ในโพสต์อื่น ๆ แต่อย่าลืมลบ # ก่อนdb_home:เพื่อยกเลิกการอ้างสิทธิ์และทำให้ใช้งานได้
Maieul

คำตอบ:


180

เริ่มต้นด้วย Cygwin 1.7.34 , วิธีที่แนะนำให้ทำเช่นนี้คือการเพิ่มที่กำหนดเองการตั้งค่าไปdb_home /etc/nsswitch.confความปรารถนาทั่วไปเมื่อทำเช่นนี้คือทำให้โฮมไดเร็กทอรี Cygwin ของคุณเท่ากับไดเร็กทอรีโปรไฟล์ผู้ใช้ Windows ของคุณ การตั้งค่านี้จะทำเช่นนั้น:

db_home: windows

หรือเทียบเท่า:

db_home: /%H

คุณต้องใช้รูปแบบหลังหากคุณต้องการรูปแบบบางอย่างในโครงร่างนี้เช่นการแยกไฟล์โฮม Cygwin ของคุณออกเป็นไดเร็กทอรีย่อยของไดเร็กทอรีโปรไฟล์ผู้ใช้ Windows ของคุณ:

db_home: /%H/cygwin

มีรูปแบบทางเลือกอื่น ๆ อีกมากมายสำหรับwindowsตัวเลือกนี้รวมทั้ง%โทเค็นอื่น ๆ ที่คุณสามารถใช้แทน%Hหรือเพิ่มเติมได้ ดูคำอธิบายไวยากรณ์ในคู่มือการใช้ Cygwinสำหรับรายละเอียดnsswitch.conf

หากคุณติดตั้ง Cygwin ก่อน 1.7.34 หรือเรียกใช้mkpasswdยูทิลิตี้เพื่อให้คุณมี/etc/passwdไฟล์คุณสามารถเปลี่ยนโฮมไดเร็กทอรี Cygwin ของคุณได้โดยแก้ไขรายการของผู้ใช้ในไฟล์นั้น โฮมไดเร็กทอรีของคุณเป็นองค์ประกอบที่สองถึงสุดท้ายในบรรทัดของผู้ใช้ใน/etc/passwd¹

ไม่ว่าคุณจะทำด้วยวิธีใดสิ่งนี้จะทำให้HOMEตัวแปรสภาพแวดล้อมถูกตั้งค่าระหว่างการเริ่มต้นเชลล์²

ดูรายการคำถามที่พบบ่อยนี้สำหรับข้อมูลเพิ่มเติมในหัวข้อ


เชิงอรรถ:

  1. พิจารณาย้าย/etc/passwdและ/etc/groupออกนอกเส้นทางเพื่อใช้กลไกที่ใช้SAM / AD ใหม่แทน

  2. ขณะที่มันเป็นไปได้ที่จะเพียงแค่ตั้งค่า%HOME%ผ่านทางแผงควบคุมก็จะท้อแท้อย่างเป็นทางการ ไม่เพียง แต่จะลบล้างกลไกข้างต้นอย่างไม่ได้cronตั้งใจเท่านั้น แต่ยังไม่ได้ผลเสมอไปเช่นเมื่อเรียกใช้เชลล์สคริปต์ผ่าน


3
โปรดทราบว่าหากคุณติดตั้ง Git bash shell จากgit-scm.com/download/winคุณอาจมีปัญหากับการติดตั้ง cygwin (ขึ้นอยู่กับตัวเลือกที่คุณเลือก) cygwin ~ ของฉันไปสิ้นสุดที่ไดเรกทอรีผู้ใช้ Win7 ของฉันและsshจะทำงานไม่ถูกต้องจนกว่าจะแก้ไข/etc/passwdตามที่อธิบายไว้
Allan

ปัญหาที่ @Allan กล่าวถึงที่นี่พร้อมกับการติดตั้ง git ได้รับการแก้ไขโดยการตั้งค่าตัวแปรสภาพแวดล้อม Windows สำหรับ HOME จากนั้นสร้าง/etc/passwdไฟล์ใหม่ ดูคำตอบของฉันที่นี่เพื่อหลีกเลี่ยงปัญหาดังกล่าว
Christopher

11
db_home: /%Hอาจแก้ไขสำหรับชื่อผู้ใช้โดเมน (แทนที่จะเป็นชื่อผู้ใช้ภายใน) ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ db_home: /cygdrive/c/Users/%Uทำในสิ่งที่ฉันอยากมี
อับดุล

2
ฉันเห็นความแตกต่างของประสิทธิภาพระหว่างวิธีการต่างๆ เมื่อฉันใช้งานdb_home: windowsจะใช้เวลาshประมาณ 2.5 ถึง 3.5 วินาทีในการเริ่มต้น เมื่อฉันใช้งานdb_home: /cygdrive/c/Users/%Uจะใช้เวลาshประมาณ 0.9 ถึง 1.0 วินาทีในการเริ่มต้น เมื่อฉันลบdb_homeบรรทัดหรือฮาร์ดโค้ดลงในโฮมไดเร็กทอรีของ Windows shจะใช้เวลาประมาณ 0.2 ถึง 0.3 วินาทีในการเริ่มต้น ฉันกำลังใช้วิธีแก้ปัญหาแบบฮาร์ดโค้ดเช่นdb_home: /cygdrive/c/Users/susamเพราะฉันมักจะเรียกใช้เชลล์สคริปต์จากพรอมต์คำสั่งโดยใช้shคำสั่งเช่นsh foo.shและไม่สะดวกที่จะรอนานกว่า 2 วินาที
Susam Pal

1
ขอบคุณ @abdull, db_home: / cygdrive / c / Users /% U คือคำตอบที่ฉันต้องการ db_home: windows ใช้ "/ home /% U" ซึ่งไม่มีอยู่ใน config ของฉัน
Jeff

74

Cygwin 1.7.34+

สำหรับผู้ที่ใช้Cygwin 1.7.34หรือสูงกว่า Cygwin รองรับการกำหนดค่าวิธีดึงข้อมูลโฮมไดเร็กทอรีเชลล์ล็อกอินและ gecos ใน/etc/nsswitch.conf. มีรายละเอียดอยู่ในส่วนคู่มือผู้ใช้ Cygwin:

หากคุณเคยสร้าง/etc/passwdหรือ/etc/groupไฟล์ไว้ก่อนหน้านี้คุณจะต้องลบไฟล์เหล่านั้นออกและกำหนดค่า Cygwin โดยใช้โมเดล Windows Security ใหม่กับการแมป POSIX

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

การตั้งค่า/etc/nsswitch.confของไฟล์db_home:กำหนดวิธีที่ Cygwin ดึงข้อมูลโฮมไดเร็กทอรีของผู้ใช้ ค่าเริ่มต้นสำหรับdb_home:คือ

db_home: /home/%U

ดังนั้นโดยค่าเริ่มต้น Cygwin เพียงชุด dir /home/$USERNAMEบ้านไป คุณสามารถเปลี่ยนให้ชี้ไปที่เส้นทางที่กำหนดเองอื่น ๆ ที่คุณต้องการได้ อักขระตัวแทนที่รองรับ ได้แก่ :

  • %u ชื่อผู้ใช้ Cygwin (นั่นคือตัวพิมพ์เล็ก u)
  • %U ชื่อผู้ใช้ Windows (ตัวพิมพ์ใหญ่ U)
  • %D โดเมน Windows ในรูปแบบ NetBIOS
  • %Hโฮมไดเร็กทอรีของ Windows ในสไตล์ POSIX โปรดทราบว่าสำหรับการdb_home:ตั้งค่านี้จะเหมาะสมหลังจากเครื่องหมายทับก่อนหน้าเช่นเดียวกับในdb_home: /%H/cygwin
  • %_เนื่องจากใช้ช่องว่างและอักขระ TAB เพื่อแยก schemata จึงต้องกำหนดช่องว่างในชื่อไฟล์เป็น%_(ซึ่งเป็นเครื่องหมายขีดล่าง)
  • %% อักขระร้อยละ

แทนเส้นทางคุณสามารถระบุหนึ่งในสี่แผนผังของเส้นทางที่มีชื่อซึ่งกำหนดไว้ล่วงหน้า

  1. windowsไดเรกทอรีของผู้ใช้จะถูกกำหนดให้ไดเรกทอรีเดียวกันซึ่งจะใช้เป็นไดเรกทอรีบ้านของ Windows โดยทั่วไปสิ่งที่ตามสายของหรือ%USERPROFILE% C:\Users\$USERNAMEแน่นอนไดเรกทอรีของ Windows ถูกแปลงเป็นสไตล์ POSIX โดย Cygwin

  2. cygwinAD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดในแอ็ตทริบิวต์ cygwinHome จากคลาสเสริมของ cygwinUser ดูเพิ่มเติมส่วนที่เรียกว่า“การ Cygwin สคี”

  3. unixAD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดในแอ็ตทริบิวต์ unixHomeDirectory จากคลาสเสริม posixAccount ดูเพิ่มเติมส่วนที่เรียกว่า“การยูนิกซ์สคี”

  4. descโฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดใน home = "... " การตั้งค่าเหมือน XML ในแอตทริบิวต์คำอธิบายของผู้ใช้ใน SAM หรือ AD ดูส่วนที่เรียกว่า“ The desc schema” สำหรับคำอธิบายโดยละเอียด

สิ่งต่อไปนี้จะทำให้โฮมไดเร็กทอรีของผู้ใช้ใน Cygwin เหมือนกับที่ใช้สำหรับโฮมไดเร็กทอรีของ Windows

db_home: windows

Cygwin 1.7.33 หรือเก่ากว่า

สำหรับผู้ที่ใช้Cygwin 1.7.33ขึ้นไปให้อัปเดตเป็น Cygwin เวอร์ชันล่าสุดและลบไฟล์/etc/passwdและ/etc/groupไฟล์ที่ใช้ก่อนหน้านี้ออกจากนั้นดูขั้นตอนด้านบน

มิฉะนั้นให้ทำตามขั้นตอนเก่าเหล่านี้ด้านล่าง

ประการแรกตั้งค่าตัวแปรสภาพแวดล้อม Windows สำหรับ HOME ที่ชี้ไปที่โปรไฟล์ผู้ใช้ของคุณ:

  1. เปิดระบบบนแผงควบคุม
  2. บนแท็บขั้นสูงคลิกตัวแปรสภาพแวดล้อม (ไปทางด้านล่าง)
  3. ในพื้นที่ User Variables ให้คลิก "New ... "
  4. สำหรับชื่อตัวแปรให้ป้อน HOME
  5. สำหรับค่าตัวแปรให้ป้อน %USERPROFILE%
  6. คลิกตกลงในกล่องโต้ตอบที่เปิดอยู่ทั้งหมดเพื่อใช้การตั้งค่าใหม่นี้

ตอนนี้เรากำลังจะอัปเดต/etc/passwdไฟล์Cygwin ด้วย%HOME%ตัวแปรWindows ที่เราเพิ่งสร้างขึ้น การเข้าสู่ระบบเชลล์และการเข้าสู่ระบบระยะไกลผ่านsshจะอาศัย/etc/passwdเพื่อบอกตำแหน่ง$HOMEเส้นทางของผู้ใช้

ที่พรอมต์คำสั่ง Cygwin bash ให้พิมพ์ดังต่อไปนี้:

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

-dสวิทช์บอก mkpasswd ที่จะรวมถึงผู้ใช้โดเมนในขณะ-lนี้คือการส่งออกเฉพาะผู้ใช้เครื่องท้องถิ่น นี่เป็นสิ่งสำคัญหากคุณใช้พีซีในที่ทำงานซึ่งได้รับข้อมูลผู้ใช้จาก Windows Domain Controller

ตอนนี้คุณสามารถทำเช่นเดียวกันสำหรับกลุ่มได้แม้ว่าจะไม่จำเป็นเว้นแต่คุณจะใช้คอมพิวเตอร์ที่เป็นส่วนหนึ่งของโดเมน Windows Cygwin อ่านข้อมูลกลุ่มจากฐานข้อมูลบัญชี Windows แต่คุณสามารถเพิ่ม/etc/groupไฟล์ได้หากเครื่องของคุณถูกตัดการเชื่อมต่อจาก Domain Controller

ที่พรอมต์ Cygwin bash ให้พิมพ์ดังต่อไปนี้:

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

ตอนนี้ออกจาก Cygwin และเริ่มต้นใหม่อีกครั้ง คุณควรจะพบว่าเส้นทาง HOME ของคุณชี้ไปยังตำแหน่งเดียวกับโปรไฟล์ผู้ใช้ Windows ของคุณนั่นคือ/cygdrive/c/Users/username


7
-d ช้ามาก หากคุณต้องการเฉพาะผู้ใช้ปัจจุบันคุณสามารถใช้ -c แทน: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor

Ben ถูกต้องที่คุณสามารถเพิ่มรายการสำหรับผู้ใช้ปัจจุบันได้โดยระบุ -c แทน อย่างไรก็ตามหากคุณทำ Cygwin จะแสดง ????? สำหรับผู้ใช้และกลุ่มเมื่อแสดงรายการไฟล์บนระบบไฟล์ที่ใช้ร่วมกันเนื่องจากจะไม่มีบันทึกสำหรับผู้ใช้และกลุ่มอื่น ๆ บนโดเมนหรือคอมพิวเตอร์ในระบบของคุณ
Christopher

1
ฉันขอแนะนำการเปลี่ยนแปลงเล็กน้อยในถ้อยคำ: แทนที่จะเป็น 'ตอนนี้อัปเดตไฟล์ Cygwin / etc / passwd ของคุณด้วยเส้นทาง $ HOME ใหม่' ฉันขอแนะนำ 'ตอนนี้เรากำลังจะอัปเดตไฟล์ Cygwin / etc / passwd ด้วย HOME ตัวแปรที่เราเพิ่งสร้างขึ้น ' ขอบคุณมาก
Robert

ด้วย -d ใช้เวลาไม่กี่นาที (ฉันฆ่าหลังจาก 5) นาทีจึงจะเสร็จสมบูรณ์ ดังนั้นฉันจึงรีรันด้วย -c ดีสำหรับความต้องการของฉัน
bartosz.r

1
@ ซามูเอลฉันได้เพิ่มคำอธิบายเพื่อชี้แจงวัตถุประสงค์mkgroupข้างต้น
Christopher

30

ฉันทำอะไรที่ค่อนข้างเรียบง่าย ฉันไม่ต้องการเปลี่ยนตัวแปรสภาพแวดล้อม windows 7 ดังนั้นฉันจึงแก้ไขไฟล์ Cygwin.bat โดยตรง

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

นี่เพิ่งเริ่มเชลล์โลคัลด้วยโฮมไดเร็กทอรีนี้ นั่นคือสิ่งที่ฉันต้องการ ฉันจะไม่เข้าถึงสิ่งนี้จากระยะไกลสิ่งนี้จึงใช้ได้กับฉัน


ประการที่สองเนื่องจากฉันไม่สามารถเปลี่ยนตัวแปรสภาพแวดล้อมภายในบ้านในเครื่อง dev ของฉันได้
Deqing

@WernerCD ฉันขอเตือนว่าสิ่งนี้อาจส่งผลที่ไม่ได้ตั้งใจเมื่อโต้ตอบกับแอปพลิเคชัน Windows ดั้งเดิม แอปพลิเคชัน Windows ของคุณจะยังคงค้นหา HOME ในตำแหน่งเดิม ตัวอย่างจะเป็น Gvim ซึ่งจะรักษาการกำหนดค่าเป็นกลุ่มแยกต่างหากที่ตำแหน่ง Windows เก่า%HOME%ในขณะที่กลุ่ม Cygwin ใช้$HOMEเส้นทางใหม่ที่คุณประกาศไว้
Christopher

ดีมาก ... 5 ปีต่อมาและฉันชอบเพราะ "วิศวกรรม" นั้นง่ายพอที่จะให้ Newb ญาติ Cygwin (เช่นฉัน) ใช้และเข้าใจได้ อนึ่งการใส่ทางลัดไปยังไฟล์. bat ของคุณใน C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo หมายความว่าคุณสามารถไปส่ง -> Cygwin บนเมนูตามบริบทของคุณ (คลิกขวา) ใน Explorer (และเปิดเทอร์มินัลได้ทุกที่ด้วย ~ / set ทุกที่ที่คุณต้องการ)
หนูไมค์

19

mountตอนนี้Cygwin รองรับวิธีการผูกซึ่งช่วยให้คุณติดตั้งไดเร็กทอรี ดังนั้นคุณสามารถเพิ่มบรรทัดต่อไปนี้/etc/fstabจากนั้นรีสตาร์ทเชลล์ของคุณ:

c:/Users /home none bind 0 0

ปัจจุบันเป็นวิธีที่ถูกต้อง คำตอบอื่น ๆ นั้นล้าสมัย
สิ้นสุด

@ceving เอกสารนี้เก็บไว้ที่ใด
Asad Saeeduddin

10

เปลี่ยนตัวแปรสภาพแวดล้อม HOME ของคุณ

ใน XP คลิกขวาที่ My Computer >> Properties >> Advanced >> Environment Variables >> User Variables สำหรับ >> [select variable HOME] >> edit


1
สิ่งนี้จะเปลี่ยนตัวแปรสภาพแวดล้อม HOME ของคุณสำหรับแอปพลิเคชัน Windows ทั้งหมดของคุณด้วย
ม็อบ

จริงแท้แน่นอน. แต่คุณมีแอปพลิเคชัน Windows ใดบ้างที่ใช้ตัวแปร HOME ฉันมี EmacsW32 และ .... Cygwin ตั้งแต่ฉันติดตั้ง Emacs เป็นครั้งแรกนั่นคือที่ที่บ้าน cygwin ของฉันก็อยู่เช่นกัน
Michael Paulukonis

1
สิ่งนี้จะไม่ขัดแย้งกับ / etc / passwd อย่างใด? ค่าเริ่มต้นจะเป็น HOME ของ / etc / passwd หรือไม่หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม หากไม่มีข้อขัดแย้งและจะตั้งค่าเริ่มต้นเป็น / etc / passwd ดูเหมือนว่าจะเป็นการตั้งค่าที่สมบูรณ์แบบ: ฉันใช้ Cygwin จาก Thumbdrive ทั้งสองอย่างเพื่อหลีกเลี่ยงการขออนุญาตติดตั้งในที่ทำงานและฉันจึงมี Unix- เช่นสภาพแวดล้อมในกระเป๋าของฉันที่ฉันสามารถใช้ได้เมื่อมีเพียงกล่อง Windows เท่านั้น ในที่ทำงานฉันจะมีโฮมไดเร็กทอรีของคอมพิวเตอร์ที่ทำงานและที่อื่น ๆ ฉันสามารถมีโฮมไดเร็กทอรีบนทัมไดรฟ์ได้
iconoclast

6

ฉันต้องการเพิ่มการแก้ไข / อัปเดตบิตเกี่ยวกับ $ HOME ที่มีความสำคัญ โฮมไดเร็กทอรีใน / etc / passwd มีความสำคัญเหนือทุกสิ่ง

ฉันเป็นผู้ใช้ Cygwin มานานและเพิ่งติดตั้ง Windows 7 x64 และ Cygwin V1.126 ใหม่ทั้งหมด ฉันจะบ้าไปแล้วพยายามคิดว่าทำไมทุกครั้งที่ฉันวิ่ง ssh ฉันยังคงได้รับ:

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

ฉันเพิ่มคำจำกัดความ HOME = c: \ users \ dhaynes ในสภาพแวดล้อม Windows แต่ก็ยังพยายามสร้าง '/ home / dhaynes' ฉันลองทุกคำสั่งผสมที่ทำได้รวมถึงการตั้งค่า HOME เป็น / cygdrive / c / users / dhaynes Googled สำหรับข้อความแสดงข้อผิดพลาดไม่พบสิ่งใดไม่พบสิ่งใดในไซต์ cygwin ฉันใช้ cygwin จาก cmd.exe ไม่ใช่ bash.exe แต่มีปัญหาในทั้งสองอย่าง

ในที่สุดฉันก็รู้ว่าโฮมไดเร็กทอรีใน / etc / passwd มีความสำคัญเหนือตัวแปรสภาพแวดล้อม $ HOME ฉันเรียกใช้ 'mkpasswd -l> / etc / passwd' ซ้ำง่าย ๆ และอัปเดตโฮมไดเร็กทอรีตอนนี้ทั้งหมดเข้ากันได้ดีกับ ssh

นั่นอาจชัดเจนสำหรับประเภท linux ที่มีประสบการณ์ sysadmin แต่สำหรับพวกเราที่ใช้ Windows เป็นหลักมันค่อนข้างคลุมเครือ


1
โฮมไดเร็กทอรีใน / etc / passwd ไม่ได้มีความสำคัญเหนือทุกสิ่ง อย่างไรก็ตามจะใช้เป็นซอร์สหลักสำหรับพา ธ ไดเร็กทอรี HOME ของคุณเมื่อล็อกอินจากระยะไกลหรือใช้ ssh ดูสิ่งนี้ได้จากคำถามที่พบบ่อยของ Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher

2

ฉันใช้ cwRsync (Cygwin + Rsync สำหรับ Windows) โดยที่ cygwin มาพร้อมกับชุดและฉันไม่พบ / etc / passwd

และมันก็ยังคงพูด

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

ดังนั้นฉันจึงเขียนไฟล์แบตช์ซึ่งเปลี่ยนตัวแปร HOME ก่อนที่จะรัน rsync สิ่งที่ต้องการ:

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

และวิโอล่า! โฟลเดอร์. ssh ปรากฏใน dir ที่ใช้งานอยู่ปัจจุบันและ rsync หยุดน่ารำคาญด้วยลายนิ้วมือ rsa

เป็นโปรแกรมแก้ไขด่วนอย่างรวดเร็ว แต่ในภายหลังคุณควรเปลี่ยน HOME เป็นตำแหน่งที่ปลอดภัยยิ่งขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.