Thay đổi thư mục chính một cách an toàn


82

Tôi đang cố gắng cập nhật thư mục chính một cách an toàn như được chỉ định trong /etc/passwd, nhưng các utils Linux tiêu chuẩn - usermod và vipw - để làm như vậy không được Cygwin cung cấp.

Bất cứ ai có thể cho tôi biết họ đã thay đổi điều này như thế nào trong Cygwin?


4
Câu hỏi trùng lặp tại stackoverflow.com/q/1494658/923560 cung cấp câu trả lời cho các phiên bản Cygwin gần đây bắt đầu bằng 1.7.34.
Abdull

Câu trả lời:


96

CHỈNH SỬA: Đối với các phiên bản gần đây của Cygwin (1.7.34 trở lên), hãy xem câu hỏi mới hơn này .

Giống như câu trả lời của sblundy, bạn luôn có thể chỉnh sửa thủ công.

Nhưng nếu bạn muốn làm điều đó theo cách "chính thức", hãy sử dụng mkpasswdlệnh dành riêng cho cygwin . Dưới đây là một đoạn trích từ các tài liệu chính thức về mkpasswd:

Ví dụ, lệnh này:

Ví dụ 3.11. Sử dụng root home thay thế

$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

sẽ đặt thư mục nhà của người dùng cục bộ trong thư mục 'Hồ sơ' của Windows.

Có một loạt các lệnh thực sự hữu ích khác được mô tả trên trang tài liệu Cygwin Utilities (bao gồm mkpasswd). Việc sử dụng cygpathtrong ví dụ trên là một trong những công cụ dành riêng cho cygwin này.

Trong khi ở đó, bạn có thể cũng muốn đọc tài liệu Sử dụng Cygwin hiệu quả với Windows . Có rất nhiều lời khuyên thực sự tốt.


10
Nếu bạn đang ở trên một miền, bạn có thể xem xét lệnh thay thế này: ( -dđối với miền) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd Điều này không hiệu quả với tôi - về cơ bản nó bị treo. Vì tôi là người duy nhất sử dụng máy tính này, tôi có thể sử dụng phương án này, mà nên được an toàn hay không, bạn đang ở trên một miền (các -clà dành cho "người dùng hiện hành) $ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
Ryan Pavlik

1
Sau khi thực hiện việc này, tệp .bashrc dường như không được đọc, ngay cả khi tôi sao chép nó sang tệp mới của mình $HOME. Bất kỳ ý tưởng làm thế nào để sửa chữa điều này?
Jeff

1
Đầu ra phải được nối (>>) vào / etc / passwd (đối với các trường hợp công ty có nhiều người dùng). Điều này đã hiệu quả! :)
Andre

1
sử dụng uname -r để xem bạn đang sử dụng phiên bản cygwin nào
martin jakubik

19

Cuối cùng tôi đã thoát tất cả các trình bao cygwin của mình và chỉnh sửa nó bằng tay trong trình soạn thảo văn bản. Càng xa càng tốt.

Lưu ý: không thoát khỏi khoảng trắng trong thư mục "Tài liệu và Cài đặt". Mục nhập sẽ như thế nào

user:...:/cygdrive/c/Documents and Settings/user:/bin/bash

Dòng được mã hóa trên :ký tự.


Này làm việc cho đường dẫn UNC quá, nhờ được trọng với biến HOME trước
HaveAGuess

Tôi phải chỉnh sửa bằng tay những gì? Tôi không biết tại sao thư mục home Cygwin của tôi là /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6 Tôi muốn nó là C: / Users / myname /

16

Câu trả lời đơn giản nhất mà tôi đã tìm thấy là hãy biến / home trở thành một liên kết mềm đến thư mục Windows Home / UserProfile của bạn

cd /
mv home oldhome
ln -s "$(cygpath -H)" home

Tôi đã sử dụng cygpath vì nó sẽ lấy vị trí thích hợp cho thư mục HOME trên phiên bản Windows hiện tại. Trên hộp của tôi cygpath -Htrả lại/cygdrive/c/Users


Sau khi thực hiện việc này một thời gian, có một nhược điểm: tôi phải chạy nó mỗi khi cập nhật cygwin bằng cách sử dụng setup.exe của họ. Không phải là một vấn đề lớn nhưng là một cái gì đó để nhớ.
M Smith

Đây là câu trả lời tốt nhất. Tôi tự hỏi tại sao cygwin không mặc định cygwin -Htheo mặc định. Đây là vị trí hợp lý nhất và vì Windows 7 không có khoảng trống trên đường dẫn của nó.
thoáng qua

trên một lưu ý khác, điều này sẽ không hoạt động. Nó đột nhiên quyết định bỏ qua liên kết tượng trưng!
ngắn gọn

Bạn phải áp dụng lại nó khi bạn chạy lại thiết lập. Đó là lần duy nhất nó thất bại đối với tôi. Mặc dù vậy, tôi vẫn chưa thử nó trên windows 10
M Smith

Hoạt động như mong đợi trên Windows 10. Tôi vẫn phải áp dụng lại mỗi lần cập nhật cygwin.
M Smith

8

Đối với người dùng hiện tại, điều sau phù hợp với tôi:

  1. Đóng Cygwin.
  2. Đặt biến môi trường người dùng HOME Windows.
  3. Khởi động Cygwin.
  4. chạy "mkpasswd -c -p" $ (cygpath -H) "> / etc / passwd".
  5. Khởi động lại Cygwin.

Tôi đã xác nhận rằng nó hoạt động bằng cách chạy ssh-keygen mà không có bất kỳ đối số nào. Sau khi thực hiện thay đổi này, ứng dụng hiện mặc định lưu khóa vào / cygdrive / c / Users / user thay vì / home / user.

Tôi không biết việc thiết lập HOME có cần thiết hay không, nhưng dù sao thì tôi cũng đã thực hiện theo hướng dẫn thiết lập TortoiseGit với Cygwin bằng cách sử dụng tài liệu chính thức của Tortoise để hỗ trợ Cygwin không chính thức tại đây . Mặc dù vậy, việc chỉ đặt HOME là không đủ để ssh-keygen nhận ra sự thay đổi của thư mục chính.

Ngoài ra, lưu ý rằng tài liệu chính thức của Cygwin về vấn đề này có thể được tìm thấy tại đây .

Đã xác nhận trong Windows 7 bằng Cygwin v1.7.35 64-bit.


Đối với Cygwin 1.7.35+ sử dụng mkpasswd không được khuyến khích ủng hộ /etc/nsswitch.conf
Christopher

4

Tôi luôn đặt HOME làm biến môi trường dành riêng cho người dùng trong Thuộc tính máy tính.


Tôi đang cố gắng tránh điều đó vì nó được đặt thành ổ đĩa mạng công ty. Có vẻ như nó sẽ hoạt động mặc dù.
sblundy 22/10/08

6
Lưu ý rằng điều này sẽ không hoạt động đối với ssh, nó bỏ qua HOME một cách rõ ràng và luôn sử dụng / etc / passwd. Xem câu cuối cùng của cygwin.com/faq/faq-nochunks.html#faq.setup.home .
studgeek

3

Để tránh các vấn đề do có khoảng trắng trong đường dẫn đến thư mục chính của bạn, hãy sử dụng dạng viết tắt của thư mục 'Hồ sơ' của Windows - tức là /cygdrive/c/DOCUME~1/user.

Bạn có thể thực hiện việc này bằng cách gõ lệnh:

mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd

2

Tôi muốn giữ cho cài đặt cygwin của mình được đồng bộ hóa với ổ đĩa bút và một máy tính khác, vì vậy tôi ghét mã hóa cứng thư mục chính. Tôi sử dụng cygwin.bat sau:

echo off
SETLOCAL
set SHELL=\\bin\\bash
set HOME=%~dp0..\..\doc\unix
bin\bash --login -i
ENDLOCAL

SETLOCAL và ENDLOCAL đảm bảo rằng SHELL và HOME không chặn các biến env hiện có cho các chương trình khác. HOME=%~dp0..\..\doc\unixđặt HOME thành hai thư mục, trong thư mục con doc / unix. Sau đó, trong .... \ doc \ unix.bashrc, tôi đưa vào PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin". Tôi không sử dụng start /wait %CD%\bin\bashđể bắt đầu bash, vì tôi đang sử dụng Console2 , vì vậy tôi không cần thêm cửa sổ cmd.


2

Sử dụng biến môi trường Windows: HOME

Điều này phù hợp với tôi cho một giải pháp vĩnh viễn, không di động, không mạng; tức là thiết lập vĩnh viễn biến Môi trường HOME trong Windows.

Lưu ý rằng điều này không ảnh hưởng đến các phiên ssh hoặc telnet luôn tham chiếu đến / etc / passwd

ref: Thiết lập Cygwin- Biến môi trường HOME của tôi không phải là điều tôi muốn.

CMD

Đối với người dùng hiện tại (cần chạy một lần cho mỗi người dùng) ::

reg add HKCU\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Đối với người dùng mới :

reg add HKU\.DEFAULT\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Lưu ý: Dấu mũ ^ trước dấu phần trăm%

NHẬP FILE ĐĂNG KÝ

Nhập tệp reg này ( người dùng hiện tại ):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

Đối với người dùng mới :

Windows Registry Editor Version 5.00

[HKU\.DEFAULT\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

ĐĂNG KÝ

Trong Regedit, dưới:

Đối với người dùng hiện tại :

HKEY_CURRENT_USER\Environment

Đối với người dùng mới :

HKU\.DEFAULT\Environment

Tạo HOME dưới dạng Giá trị chuỗi có thể mở rộng mới (* REG_EXPAND_SZ *) và đặt % USERPROFILE%


Dù câu trả lời này dựa trên thông tin nào, nó không còn hiện tại nữa. Các ref: liên kết cũng bị phá vỡ. Tôi sẽ không thử điều này ở nhà.
Christopher

2

Câu trả lời gốc của Christopher từ nơi khác

Cygwin 1.7.34+

Đối với những người sử dụng Cygwin 1.7.34 trở lên, Cygwin hỗ trợ cấu hình cách tìm nạp thư mục chính, trình bao đăng nhập và thông tin gecos trong /etc/nsswitch.conf. Điều này được trình bày chi tiết trong phần Hướng dẫn sử dụng Cygwin:

Nếu trước đó bạn đã tạo một /etc/passwdhoặc /etc/grouptệp, bạn sẽ muốn xóa chúng và định cấu hình Cygwin bằng cách sử dụng mô hình Bảo mật Windows mới cho ánh xạ POSIX.

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

Các /etc/nsswitch.conftập tin của db_home:thiết định nghĩa như thế nào Cygwin lấy về thư mục home của người dùng. Cài đặt mặc định cho db_home:

db_home: /home/%U

Vì vậy, theo mặc định, Cygwin chỉ đặt dir nhà thành /home/$USERNAME. Tuy nhiên, bạn có thể thay đổi điều đó để trỏ đến bất kỳ đường dẫn tùy chỉnh nào khác mà bạn muốn. Các ký tự đại diện được hỗ trợ là:

  • %u Tên người dùng Cygwin (đó là chữ thường u).
  • %U Tên người dùng Windows (đó là chữ hoa U).
  • %D Miền Windows theo kiểu NetBIOS.
  • %HThư mục chính của Windows theo kiểu POSIX. Lưu ý rằng, đối với db_home:cài đặt, điều này chỉ có ý nghĩa ngay sau dấu gạch chéo trước đó, như trongdb_home: /%H/cygwin
  • %_Vì dấu cách và các ký tự TAB được sử dụng để phân tách schemata, một khoảng trắng trong tên tệp phải được cung cấp dưới dạng %_(đó là dấu gạch dưới).
  • %% Một ký tự phần trăm.

Thay cho một đường dẫn, bạn có thể chỉ định một trong bốn schemata đường dẫn được đặt tên đã được xác định trước.

  1. windowsThư mục chính của người dùng được đặt thành cùng một thư mục được sử dụng làm thư mục chính của Windows, thường là thư mục dọc theo dòng %USERPROFILE%hoặc C:\Users\$USERNAME. Tất nhiên, thư mục Windows được Cygwin chuyển đổi sang kiểu POSIX.

  2. cygwinChỉ AD: Thư mục chính của người dùng được đặt thành đường dẫn POSIX được đưa ra trong thuộc tính cygwinHome từ lớp bổ trợ cygwinUser. Xem thêm phần có tên “Giản đồ cygwin” .

  3. unixChỉ AD: Thư mục chính của người dùng được đặt thành đường dẫn POSIX được cung cấp trong thuộc tính unixHomeDirectory từ lớp bổ trợ posixAccount. Xem thêm phần có tên “Giản đồ unix” .

  4. descThư mục chính của người dùng được đặt thành đường dẫn POSIX được đưa ra trong cài đặt giống XML home = "..." trong thuộc tính mô tả của người dùng trong SAM hoặc AD. Xem phần có tên “Giản đồ mô tả” để biết mô tả chi tiết.

Phần sau sẽ làm cho thư mục chính của người dùng trong Cygwin giống như được sử dụng cho thư mục chính của Windows.

db_home: windows

Cygwin 1.7.33 trở xuống

Đối với những người sử dụng Cygwin 1.7.33 hoặc phiên bản cũ hơn, hãy cập nhật lên phiên bản Cygwin mới nhất và xóa các tệp /etc/passwd/etc/grouptệp đã sử dụng trước đó , sau đó xem các bước ở trên.

Nếu không, hãy làm theo các bước cũ hơn bên dưới.

Đầu tiên, hãy đặt một biến môi trường Windows cho HOME trỏ đến hồ sơ người dùng của bạn:

  1. Mở hệ thống trên bảng điều khiển
  2. Trên tab Nâng cao, bấm vào Biến Môi trường (về phía dưới cùng)
  3. Trong vùng Biến người dùng, hãy nhấp vào "Mới…"
  4. Đối với tên biến, hãy nhập HOME
  5. Đối với giá trị biến, hãy nhập %USERPROFILE%
  6. Nhấp vào OK trong tất cả các hộp thoại đang mở để áp dụng cài đặt mới này

Bây giờ chúng ta sẽ cập nhật /etc/passwdtệp Cygwin với %HOME%biến Windows mà chúng ta vừa tạo. Đăng nhập Shell và đăng nhập từ xa thông qua sshsẽ dựa vào đó /etc/passwdđể cho họ biết vị trí $HOMEđường dẫn của người dùng .

Tại dấu nhắc lệnh Cygwin bash, gõ như sau:

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

Công -dtắc yêu cầu mkpasswd bao gồm người dùng DOMAIN, trong khi -lchỉ xuất người dùng máy LOCAL. Điều này rất quan trọng nếu bạn đang sử dụng PC tại nơi làm việc mà thông tin người dùng được lấy từ Bộ điều khiển miền của Windows.

Bây giờ, bạn cũng có thể làm điều tương tự cho các nhóm, mặc dù điều này là không cần thiết trừ khi bạn sẽ sử dụng máy tính là một phần của Miền Windows. Cygwin đọc thông tin nhóm từ cơ sở dữ liệu tài khoản Windows, nhưng bạn có thể thêm /etc/grouptệp nếu máy của bạn thường xuyên bị ngắt kết nối khỏi Bộ điều khiển miền của nó.

Tại dấu nhắc Cygwin bash, gõ như sau:

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

Bây giờ, hãy thoát Cygwin và khởi động lại. Bạn sẽ thấy rằng đường dẫn HOME của bạn trỏ đến cùng một vị trí với Hồ sơ người dùng Windows của bạn - tức là/cygdrive/c/Users/username


1
cd /home
rm -rf chris
ln -s /cygdrive/z chris

Tôi thực sự không chắc liệu đó có phải là giải pháp an toàn nhất hay không nhưng nó là một giải pháp khả thi phù hợp với tôi;)


0

Tôi đã trực tiếp chỉnh sửa tệp / etc / passwd của mình (đảm bảo rằng không có gì khác sẽ truy cập vào nó) và thay đổi tất cả các tham chiếu đến / home thành / Users (trên Windows 7). Tôi thấy rằng, để mọi thứ hoạt động chính xác, tôi phải xóa bất kỳ thư mục nào trong thư mục / home (hoặc di chuyển chúng đến vị trí thích hợp khác). Nếu không, cygwin sẽ phát triển một tính cách tách biệt, ví dụ: 'bash -l' sẽ bắt đầu trong / home / Pablo nhưng $ HOME sẽ là / Users / Pablo và emacs sẽ làm ngược lại. Sau khi tôi xóa / home / Pablo, mọi thứ đều hoạt động tốt.


0

Tôi chỉ cần tham gia C:\Users\usernamekhi tôi bắt đầu cygwin. Vì vậy, tôi chỉ thêm vào .bashrc.profile

cd ${HOMEPATH}

Nếu bạn muốn sử dụng ~/.thay vì $HOMEPATH, bạn cũng có thể thêm những thứ sau:

export HOME=${HOMEPATH}

Bằng cách này, tôi không làm phiền quá trình cài đặt cygwin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.