ฉันเพิ่งติดตั้ง Cygwin และดูเหมือนว่าโฮมไดเร็กทอรีใน bash prompt อยู่ในไดรฟ์ Z: ของฉัน นั่นไม่ใช่ที่ที่ฉันต้องการ
ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร?
ฉันเพิ่งติดตั้ง Cygwin และดูเหมือนว่าโฮมไดเร็กทอรีใน bash prompt อยู่ในไดรฟ์ Z: ของฉัน นั่นไม่ใช่ที่ที่ฉันต้องการ
ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร?
คำตอบ:
เริ่มต้นด้วย 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ตัวแปรสภาพแวดล้อมถูกตั้งค่าระหว่างการเริ่มต้นเชลล์²
ดูรายการคำถามที่พบบ่อยนี้สำหรับข้อมูลเพิ่มเติมในหัวข้อ
เชิงอรรถ:
พิจารณาย้าย/etc/passwdและ/etc/groupออกนอกเส้นทางเพื่อใช้กลไกที่ใช้SAM / AD ใหม่แทน
ขณะที่มันเป็นไปได้ที่จะเพียงแค่ตั้งค่า%HOME%ผ่านทางแผงควบคุมก็จะท้อแท้อย่างเป็นทางการ ไม่เพียง แต่จะลบล้างกลไกข้างต้นอย่างไม่ได้cronตั้งใจเท่านั้น แต่ยังไม่ได้ผลเสมอไปเช่นเมื่อเรียกใช้เชลล์สคริปต์ผ่าน
sshจะทำงานไม่ถูกต้องจนกว่าจะแก้ไข/etc/passwdตามที่อธิบายไว้
/etc/passwdไฟล์ใหม่ ดูคำตอบของฉันที่นี่เพื่อหลีกเลี่ยงปัญหาดังกล่าว
db_home: /%Hอาจแก้ไขสำหรับชื่อผู้ใช้โดเมน (แทนที่จะเป็นชื่อผู้ใช้ภายใน) ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ db_home: /cygdrive/c/Users/%Uทำในสิ่งที่ฉันอยากมี
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 วินาที
สำหรับผู้ที่ใช้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 จึงต้องกำหนดช่องว่างในชื่อไฟล์เป็น%_(ซึ่งเป็นเครื่องหมายขีดล่าง)%% อักขระร้อยละแทนเส้นทางคุณสามารถระบุหนึ่งในสี่แผนผังของเส้นทางที่มีชื่อซึ่งกำหนดไว้ล่วงหน้า
windowsไดเรกทอรีของผู้ใช้จะถูกกำหนดให้ไดเรกทอรีเดียวกันซึ่งจะใช้เป็นไดเรกทอรีบ้านของ Windows โดยทั่วไปสิ่งที่ตามสายของหรือ%USERPROFILE% C:\Users\$USERNAMEแน่นอนไดเรกทอรีของ Windows ถูกแปลงเป็นสไตล์ POSIX โดย Cygwin
cygwinAD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดในแอ็ตทริบิวต์ cygwinHome จากคลาสเสริมของ cygwinUser ดูเพิ่มเติมส่วนที่เรียกว่า“การ Cygwin สคี”
unixAD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดในแอ็ตทริบิวต์ unixHomeDirectory จากคลาสเสริม posixAccount ดูเพิ่มเติมส่วนที่เรียกว่า“การยูนิกซ์สคี”
descโฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดใน home = "... " การตั้งค่าเหมือน XML ในแอตทริบิวต์คำอธิบายของผู้ใช้ใน SAM หรือ AD ดูส่วนที่เรียกว่า“ The desc schema” สำหรับคำอธิบายโดยละเอียด
สิ่งต่อไปนี้จะทำให้โฮมไดเร็กทอรีของผู้ใช้ใน Cygwin เหมือนกับที่ใช้สำหรับโฮมไดเร็กทอรีของ Windows
db_home: windows
สำหรับผู้ที่ใช้Cygwin 1.7.33ขึ้นไปให้อัปเดตเป็น Cygwin เวอร์ชันล่าสุดและลบไฟล์/etc/passwdและ/etc/groupไฟล์ที่ใช้ก่อนหน้านี้ออกจากนั้นดูขั้นตอนด้านบน
มิฉะนั้นให้ทำตามขั้นตอนเก่าเหล่านี้ด้านล่าง
ประการแรกตั้งค่าตัวแปรสภาพแวดล้อม Windows สำหรับ HOME ที่ชี้ไปที่โปรไฟล์ผู้ใช้ของคุณ:
HOME%USERPROFILE%ตอนนี้เรากำลังจะอัปเดต/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
mkgroupข้างต้น
ฉันทำอะไรที่ค่อนข้างเรียบง่าย ฉันไม่ต้องการเปลี่ยนตัวแปรสภาพแวดล้อม windows 7 ดังนั้นฉันจึงแก้ไขไฟล์ Cygwin.bat โดยตรง
@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL
นี่เพิ่งเริ่มเชลล์โลคัลด้วยโฮมไดเร็กทอรีนี้ นั่นคือสิ่งที่ฉันต้องการ ฉันจะไม่เข้าถึงสิ่งนี้จากระยะไกลสิ่งนี้จึงใช้ได้กับฉัน
%HOME%ในขณะที่กลุ่ม Cygwin ใช้$HOMEเส้นทางใหม่ที่คุณประกาศไว้
mountตอนนี้Cygwin รองรับวิธีการผูกซึ่งช่วยให้คุณติดตั้งไดเร็กทอรี ดังนั้นคุณสามารถเพิ่มบรรทัดต่อไปนี้/etc/fstabจากนั้นรีสตาร์ทเชลล์ของคุณ:
c:/Users /home none bind 0 0
เปลี่ยนตัวแปรสภาพแวดล้อม HOME ของคุณ
ใน XP คลิกขวาที่ My Computer >> Properties >> Advanced >> Environment Variables >> User Variables สำหรับ >> [select variable HOME] >> edit
ฉันต้องการเพิ่มการแก้ไข / อัปเดตบิตเกี่ยวกับ $ 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 เป็นหลักมันค่อนข้างคลุมเครือ
ฉันใช้ 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 เป็นตำแหน่งที่ปลอดภัยยิ่งขึ้น
db_home:เพื่อยกเลิกการอ้างสิทธิ์และทำให้ใช้งานได้