Как я могу изменить свою домашнюю папку 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описании синтаксиса в User Guide 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файла. Смотрите мой ответ здесь, чтобы избежать таких проблем.
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", которого нет в моей конфигурации.
Джефф
74

Cygwin 1.7.34+

Для тех, кто использует Cygwin 1.7.34 или выше, Cygwin поддерживает настройку получения домашнего каталога, оболочки входа и информации gecos в /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:IS

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. Конечно, каталог Windows конвертируется в стиль POSIX Cygwin.

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

  3. unixТолько AD: для домашнего каталога пользователя задан путь POSIX, указанный в атрибуте unixHomeDirectory из вспомогательного класса posixAccount. См. Также раздел «Схема unix» .

  4. descДомашний каталог пользователя устанавливается на путь POSIX, указанный в настройке home = "...", подобной XML, в атрибуте описания пользователя в SAM или AD. См. Подробное описание в разделе «Схема desc».

Следующее сделает домашний каталог пользователя в Cygwin таким же, какой используется для домашнего каталога Windows.

db_home: windows

Cygwin 1.7.33 или более ранняя

Для тех , кто использует Cygwin 1.7.33 или более ранней версии, обновление до последней версии Cygwin и удалить ранее использовались /etc/passwdи /etc/groupфайлы, а затем просмотрите описанные выше действия.

В противном случае выполните эти более старые шаги ниже.

Во-первых, установите переменную среды Windows для HOME, которая указывает на ваш профиль пользователя:

  1. Откройте систему на панели управления
  2. На вкладке Advanced щелкните Environment Variables (внизу).
  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 и снова запустите его. Вы должны обнаружить, что ваш путь HOME указывает на то же место, что и ваш профиль пользователя Windows, т.е./cygdrive/c/Users/username

Кристофер
источник
7
-d действительно медленный. Если вам нужен только текущий пользователь, вы можете использовать вместо него -c: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Бен Челнор
Бен прав, вы можете просто добавить запись для текущего пользователя, указав вместо этого -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

Это просто запускает локальную оболочку с этим домашним каталогом; это то, что я хотел. Я не собираюсь получать к нему удаленный доступ, поэтому у меня это сработало.

Аджай
источник
Во-вторых, я не могу изменить переменную домашней среды на своей машине разработчика.
Deqing
@WernerCD Я бы просто предупредил, что это может иметь непредвиденные последствия при взаимодействии с собственными приложениями Windows. Ваши приложения Windows будут продолжать искать ДОМ в старом месте. Примером может служить Gvim, который будет поддерживать отдельную конфигурацию vim в старом %HOME%расположении Windows , в то время как Cygwin vim использует новый $HOMEпуть, который вы объявили.
Кристофер
Это здорово ... 5 лет спустя, и мне это нравится, потому что "инженерия" достаточно проста для использования и понимания новичком Cygwin (вроде меня). Между прочим, размещение ярлыка для вашего .bat-файла в C: \ Users \ <your_user_name> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo означает, что вы можете выбрать Отправить -> Cygwin в контекстно-зависимом меню (щелчок правой кнопкой мыши) в Проводник (и откройте терминал где угодно, используя ~ /, где хотите).
Майк грызун
19

Cygwin mountтеперь поддерживает метод привязки, который позволяет монтировать каталог. Следовательно, вы можете просто добавить следующую строку /etc/fstab, а затем перезапустить оболочку:

c:/Users /home none bind 0 0
Jihem
источник
В настоящее время это правильный путь. Остальные ответы устарели.
ceve
@ceving Это где-нибудь задокументировано?
Асад Саидуддин
10

Измените переменную среды HOME.

в XP щелкните правой кнопкой мыши Мой компьютер >> Свойства >> Дополнительно >> Переменные среды >> Пользовательские переменные для >> [выберите переменную HOME] >> изменить

Майкл Паулуконис
источник
1
Это также изменит переменную среды HOME для всех ваших приложений Windows.
моб
Совершенно верно. Но какие у вас есть приложения Windows, которые используют переменную HOME? У меня есть EmacsW32 и .... Cygwin. Поскольку я сначала установил Emacs, там же находится и мой дом cygwin.
Майкл Паулуконис,
1
Не будет ли это как-то конфликтовать с / etc / passwd? Будет ли он по умолчанию HOME / etc / passwd, если переменная среды не установлена? Если конфликта нет, и по умолчанию он будет / etc / passwd, это похоже на идеальную настройку: я запускаю Cygwin с флэш-накопителя, чтобы избежать необходимости спрашивать разрешение на установку на работе, поэтому у меня есть 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. Погуглил сообщение об ошибке, ничего не нашел, ничего не нашел на сайте cygwin. Я использую cygwin из cmd.exe, а не bash.exe, но проблема присутствовала в обоих.

Наконец я понял, что домашний каталог в / etc / passwd имеет приоритет над переменной окружения $ HOME. Я просто повторно запустил mkpasswd -l> / etc / passwd и обновил домашний каталог, теперь с ssh все в порядке.

Это может быть очевидно для тех, кто использует Linux и имеет опыт работы с системным администратором, но для тех из нас, кто в основном использует 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.

Это быстрое исправление, но позже вам следует сменить ДОМ на более безопасное место.

TEHEK
источник