ฉันเพิ่งติดตั้ง 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
cygwin
AD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ POSIX ที่กำหนดในแอ็ตทริบิวต์ cygwinHome จากคลาสเสริมของ cygwinUser ดูเพิ่มเติมส่วนที่เรียกว่า“การ Cygwin สคี”
unix
AD เท่านั้น: โฮมไดเร็กทอรีของผู้ใช้ถูกตั้งค่าเป็นพา ธ 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:
เพื่อยกเลิกการอ้างสิทธิ์และทำให้ใช้งานได้