Як я можу змінити домашню папку Cygwin після встановлення?


121

Щойно я встановив Cygwin, і схоже, що домашній каталог у запиті bash знаходиться на моєму 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або додатково до нього. Докладніше див . nsswitch.confОпис синтаксису в Посібнику користувача Cygwin .

Якщо ви встановили Cygwin до 1.7.34 або запустили його mkpasswdутиліту, щоб у вас був /etc/passwdфайл, ви можете змінити домашній каталог Cygwin, відредагувавши запис свого користувача у цьому файлі. Ваш домашній каталог - другий за останнім елементом у рядку вашого користувача в/etc/passwd

Яким би способом ви це не зробили, це спричиняє HOME змінної середовища під час запуску оболонки

Дивіться цей розділ поширених запитань для отримання додаткової інформації з цієї теми


Виноски:

  1. Подумайте про перехід /etc/passwdта /etc/groupвихід із шляху, щоб замість цього використовувати новий механізм на основі SAM / AD .

  2. Хоча це можливо просто встановити %HOME%через панель управління, це офіційно не рекомендується . Він не лише безцеремонно перекриває вищезазначені механізми, але не завжди працює, як, наприклад, при запуску скриптів оболонки через cron.


3
Зауважте, що якщо ви встановили оболонку Git bash з git-scm.com/download/win , у вас можуть виникнути проблеми з установкою cygwin (залежно від того, які параметри ви вибрали). Мій cygwin ~ опинився в моєму каталозі користувачів Win7 і sshне працював правильно до редагування, /etc/passwdяк описано.
Аллан

Проблеми, які @Allan згадує тут із установками git, вирішуються шляхом встановлення змінної середовища Windows для HOME, а потім відтворення /etc/passwdфайлу. Дивіться мою відповідь тут, щоб уникнути подібних питань.
Крістофер

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", якого немає в моїй конфігурації.
Джефф

74

Cygwin 1.7.34+

Для тих, хто використовує Cygwin 1.7.34 або новішої версії, Cygwin підтримує налаштування того, як отримати домашній каталог, оболонку входу та інформацію про геокоди в /etc/nsswitch.conf. Це детально описано в розділі Посібника користувача Cygwin:

Якщо ви раніше створили файл /etc/passwdабо /etc/groupфайл, вам потрібно буде видалити їх і налаштувати Cygwin за допомогою нової моделі безпеки Windows для відображення 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 просто встановлює домашній режим /home/$USERNAME. Ви можете це змінити, щоб вказати на будь-який інший спеціальний шлях, який ви хочете. Підтримувані символи підстановки:

  • %u Ім’я користувача Cygwin (це мале слово u).
  • %U Ім'я користувача Windows (це велике регістр U).
  • %D Домен Windows у стилі NetBIOS.
  • %HДомашній каталог Windows у стилі POSIX. Зауважте, що для db_home:налаштування це має сенс лише після попередньої косої риски, як вdb_home: /%H/cygwin
  • %_Оскільки простір та символи TAB використовуються для розділення схем, пробіл у імені файлу повинен бути вказаний як %_(це підкреслення).
  • %% Процентний персонаж.

Замість шляху ви можете вказати одну з чотирьох іменованих схем шляху, які визначені заздалегідь.

  1. windowsДомашній каталог користувача встановлений у тому самому каталозі, який використовується як домашній каталог Windows, як правило, щось уздовж рядків %USERPROFILE%або C:\Users\$USERNAME. Звичайно, Cygwin перетворює каталог Windows у стиль POSIX.

  2. cygwinЛише AD: Домашній каталог користувача встановлюється на шлях POSIX, вказаний в атрибуті cygwinHome з допоміжного класу cygwinUser. Дивіться також розділ під назвою «Схема цигувіна» .

  3. unixЛише AD: Домашній каталог користувача встановлюється на шлях POSIX, заданий в атрибуті unixHomeDirectory з допоміжного класу posixAccount. Дивіться також розділ під назвою «Unix-схема» .

  4. descДомашній каталог користувача встановлюється на шлях POSIX, заданий у домівки home = "..." XML-подібний в атрибуті опису користувача в SAM або AD. Детальний опис див. У розділі "Схема опису".

Нижче зроблено домашній каталог користувача в Cygwin таким же, як і для домашнього каталогу Windows.

db_home: windows

Cygwin 1.7.33 або новішої версії

Для тих, хто використовує Cygwin 1.7.33 або новішої версії , оновіть до останньої версії Cygwin та видаліть раніше використані файли /etc/passwdта /etc/groupфайли, після чого див. Кроки вище.

Інше, виконайте ці старі кроки нижче.

По-перше, встановіть змінну середовища Windows для HOME, яка вказує на ваш профіль користувача:

  1. Відкрийте систему на панелі керування
  2. На вкладці « Додатково » натисніть Змінні середовища (внизу)
  3. У області змінних користувачів натисніть "Створити ..."
  4. Для імені змінної введіть HOME
  5. Для значення змінної введіть %USERPROFILE%
  6. Клацніть OK у всіх відкритих діалогових вікнах, щоб застосувати це нове налаштування

Тепер ми збираємось оновити /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.

Тепер ви також можете зробити те ж саме для груп, хоча це не потрібно, якщо ви не будете використовувати комп'ютер, який є частиною домену Windows. Cygwin зчитує інформацію про групу з баз даних облікових записів Windows, але ви можете додати /etc/groupфайл, якщо ваш апарат часто відключається від його контролера домену.

У запиті Cygwin bash введіть наступне:

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

Тепер вийдіть із Cygwin і запустіть його знову. Ви повинні виявити, що ваш ДОМАШНИЙ шлях вказує на те саме місце, що і ваш профіль користувача Windows - тобто/cygdrive/c/Users/username


7
-d дійсно повільно. Якщо вам потрібен лише поточний користувач, ви можете використовувати -c замість цього: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor

Бен вірно, що ви можете просто додати запис для поточного користувача, вказавши замість -c. Якщо ви все-таки зробите, Cygwin відобразить ????? для Користувача та Групи при переліку файлів у спільних файлових системах, оскільки вони не матимуть записів для інших користувачів та груп на вашому Домені чи локальному комп'ютері.
Крістофер

1
Чи можу я запропонувати невелику зміну формулювання: а не "Тепер, оновіть файл Cygwin / etc / passwd новим $ HOME", я б запропонував "Зараз ми збираємось оновити файл Cygwin / etc / passwd з Змінна HOME, яку ми тільки що створили. " Велике спасибі
Роберт

З -d На це потрібно кілька хвилин (я вбив через 5) хвилин. Так що я повторився з -c. Все добре для моїх потреб.
bartosz.r

1
@Samuel Я додав пояснення, щоб уточнити мету mkgroupвище.
Крістофер

30

Я зробив щось досить просте. Я не хотів змінювати змінну середовища Windows 7. Тому я безпосередньо редагував файл Cygwin.bat.

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

Це просто запускає локальну оболонку з цього домашнього каталогу; саме цього я хотів. Я не збираюся віддалено отримувати доступ до цього, тому це працювало для мене.


По-друге, тому що я не можу змінити змінну домашнього середовища в своїй машині розробки.
Декінг

@WernerCD Я просто застережу, що це може мати непередбачувані наслідки при взаємодії з рідними програмами Windows. Ваші програми Windows продовжуватимуть пошук ГОЛОВНО в старому місці. Прикладом може бути Gvim, який підтримуватиме окрему конфігурацію vim у старому %HOME%розташуванні Windows , тоді як Cygwin vim використовує новий $HOMEшлях, який ви оголосили.
Крістофер

Це чудово ... Через 5 років мені це подобається, тому що "інженерія" досить проста, щоб родич Cygwin (як я) міг використовувати та розуміти. Між іншим, додавання ярлика до вашого .bat-файлу в C: \ Users \ <ваше_користувач_іме> \ AppData \ Роумінг \ Microsoft \ Windows \ SendTo означає, що ви можете перейти надіслати Send>> Cygwin у контекстному меню (клацніть правою кнопкою миші) у Провідник (і відкрийте термінал куди завгодно, ~ / встановіть куди завгодно).
мійський гризун

19

mountТепер Cygwin підтримує метод прив'язки, який дозволяє монтувати каталог. Отже, ви можете просто додати наступний рядок до /etc/fstab, а потім перезапустити оболонку:

c:/Users /home none bind 0 0

Сьогодні це правильний шлях. Інші відповіді застаріли.
закінчення

@ceving Це документується десь?
Асад Саєдюддін

10

Змініть змінну середовища HOME.

на XP, клацніть правою кнопкою миші Мій комп'ютер >> Властивості >> Додатково >> Змінні середовища >> Змінні користувача для >> [виберіть змінну ДОМАШНЯ СТОРІНКА] >> редагувати


1
Це також змінить змінну середовища HOME для всіх ваших програм Windows.
моб

Дуже правильно. Але які у вас програми Windows, які використовують змінну HOME? У мене є EmacsW32 і .... Cygwin. Оскільки я першим встановив Emacs, саме там лежить і мій дім cygwin.
Майкл Паулуконіс

1
Не буде це конфліктом з / etc / passwd якось? Чи буде за замовчуванням / etc / passwd HOME, якщо змінна середовища не встановлена? Якщо немає конфлікту, і він за замовчуванням буде / etc / passwd, це здається ідеальним налаштуванням: я запускаю Cygwin з thumbdrive, обидва, щоб не вимагати дозволу на встановлення на роботі, і тому у мене є Unix- як оточення в кишені, яке я можу використовувати, коли є лише вікно Windows. На роботі я матиму домашній каталог свого робочого комп’ютера, а в інших місцях я можу мати домашній каталог на thumbdrive.
іконоборство

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. Гугл за повідомлення про помилку, нічого не міг знайти, нічого не зміг знайти на сайті cygwin. Я використовую cygwin від cmd.exe, а не bash.exe, але проблема була в обох.

Нарешті я зрозумів, що домашній каталог у / etc / passwd має перевагу над змінною середовища $ HOME. Я просто перезапустив 'mkpasswd -l> / etc / passwd' і оновив домашній каталог, тепер усе добре з ssh.

Це може бути очевидно для типів Linux з досвідом роботи sysadmin, але для тих, хто в основному використовує Windows, це трохи незрозуміло.


1
Домашній каталог у / etc / passwd НЕ переважає над усім. Однак він використовується як основне джерело для шляху до каталогу HOME під час віддаленого входу або використання ssh. Перегляньте це з поширених запитань
Крістофер,

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 папка з'явилася в поточному робочому режимі, і rsync перестав дратувати відбитки пальців rsa.

Це швидке виправлення, але пізніше ви повинні змінити HOME на більш безпечне місце.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.