Безопасное изменение домашнего каталога


82

Я пытаюсь безопасно обновить домашний каталог, как указано в /etc/passwd, но стандартные утилиты Linux - usermod и vipw - для этого не предоставляются Cygwin.

Может ли кто-нибудь сказать мне, как они изменили это в Cygwin?


4
Повторяющийся вопрос на stackoverflow.com/q/1494658/923560 дает ответы на последние версии Cygwin, начиная с 1.7.34.
Абдул

Ответы:


96

EDIT: для последних версий Cygwin (1.7.34 и выше) см. Этот новый вопрос .

Как и sblundy, вы всегда можете редактировать вручную.

Но если вы хотите сделать это «официальным» способом, используйте специальную mkpasswdкоманду cygwin . Ниже приведен отрывок из официальной документации mkpasswd:

Например, эта команда:

Пример 3.11. Использование альтернативного домашнего корня

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

поместит домашние каталоги локальных пользователей в каталог Windows «Профили».

Есть множество других действительно полезных команд, описанных на странице документации Cygwin Utilities (включая mkpasswd). Использование cygpathв приведенном выше примере - еще один из этих инструментов, специфичных для cygwin.

Пока вы это делаете, вы, вероятно, также захотите прочитать документацию по « Эффективному использованию Cygwin с Windows» . Есть несколько действительно хороших советов.


10
Если вы находитесь в домене, вы можете рассмотреть эту альтернативную команду: ( -dдля домена) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd Это не сработало для меня - оно в основном зависло. Поскольку я единственный использую эту машину, я мог бы использовать эту альтернативу, которая должна быть безопасной вне зависимости от того, находитесь ли вы в домене (это -cозначает «текущий пользователь») $ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
Райан Павлик,

1
После этого файл .bashrc, похоже, не читается, даже если я скопирую его в свой новый $HOME. Есть идеи, как это исправить?
Джефф

1
Вывод должен быть добавлен (>>) в / etc / passwd (для корпоративных сценариев с несколькими пользователями). Это сработало! :)
Андре

1
используйте uname -r, чтобы узнать, какая у вас версия cygwin
Мартин Якубик

19

В итоге я закрыл все свои оболочки cygwin и отредактировал их вручную в текстовом редакторе. Все идет нормально.

Примечание: не избегайте пробелов в каталоге «Документы и настройки». Запись будет выглядеть так

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

Строка маркируется на :персонаже.


Это работает и для UNC-путей, спасибо ранее было
заменено

Что мне нужно отредактировать вручную? Я не знаю, почему мой домашний каталог cygwin /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6. Я хочу, чтобы это был C: / Users / MyName /

16

Самый простой ответ, который я нашел, - это сделать / home мягкой ссылкой на ваш каталог Windows Home / UserProfile.

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

Я использовал cygpath, поскольку он получит правильное расположение для каталога HOME в текущей версии Windows. На мой ящик cygpath -Hвозвращается/cygdrive/c/Users


После этого в течение некоторого времени появляется один недостаток: мне приходится запускать его каждый раз, когда я обновляю cygwin с помощью их setup.exe. Ничего страшного, но нужно помнить.
M Smith

Это лучший ответ. Интересно, почему cygwin не работает cygwin -Hпо умолчанию. Это наиболее разумное место, и, начиная с Windows 7, на его пути тоже нет места.
dashesy

с другой стороны, это не сработает. Внезапно он решил игнорировать символическую ссылку!
dashesy

Вам придется повторно применить его при повторном запуске установки. Это единственный раз, когда мне это не удалось. Я еще не пробовал его на Windows 10
M Smith

Работает должным образом в Windows 10. Мне все равно придется повторно применять каждый раз, когда я обновляю cygwin.
M Smith

8

Для текущего пользователя у меня работало следующее:

  1. Закройте Cygwin.
  2. Задайте переменную пользовательской среды HOME Windows.
  3. Запустите Cygwin.
  4. запустите "mkpasswd -c -p" $ (cygpath -H) "> / etc / passwd".
  5. Перезапустите Cygwin.

Я подтвердил, что это работает, запустив ssh-keygen без каких-либо аргументов. После внесения этого изменения приложение теперь по умолчанию сохраняет ключ в / cygdrive / c / Users / user вместо / home / user.

Я не знаю, требуется ли установка HOME, но я все равно сделал это в соответствии с инструкциями по настройке TortoiseGit с Cygwin, используя официальную документацию Tortoise для неофициальной поддержки Cygwin здесь . Однако одной настройки HOME было недостаточно для ssh-keygen, чтобы распознать изменение домашнего каталога.

Также обратите внимание, что официальную документацию Cygwin по этой проблеме можно найти здесь .

Подтверждено в Windows 7 с использованием 64-разрядной версии Cygwin v1.7.35.


Для Cygwin 1.7.35+ использование mkpasswd не рекомендуется в пользу /etc/nsswitch.conf
Кристофер

4

Я всегда устанавливаю HOME как пользовательскую переменную среды в свойствах компьютера.


Я пытаюсь избежать этого, поскольку он настроен на корпоративный сетевой диск. Похоже, это сработает.
sblundy

6
Обратите внимание, что это не сработает для ssh, он явно игнорирует HOME и всегда использует / etc / passwd. См. Последнее предложение cygwin.com/faq/faq-nochunks.html#faq.setup.home .
Studgeek

3

Чтобы избежать проблем, вызванных наличием пробелов в пути к вашему домашнему каталогу, используйте сокращенную форму каталога Windows «Профили» - т.е. /cygdrive/c/DOCUME~1/user .

Вы можете сделать это, набрав команду:

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

3

Оригинальный ответ на Кристофера из других

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


Поскольку пути следуют предопределенной схеме с последней версией Cygwin вместо «перемещения» домашнего каталога, я бы рекомендовал использовать символические ссылки (включая родные для Windows) на определенные каталоги из HOMEкаталога.
gavenkoa

2

Мне нравится синхронизировать установку Cygwin с флэш-накопителем и другим компьютером, поэтому я ненавижу жесткое программирование домашнего каталога. Я использую следующий файл cygwin.bat:

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

SETLOCAL и ENDLOCAL следят за тем, чтобы SHELL и HOME не затирали существующие переменные env для других программ. HOME=%~dp0..\..\doc\unixустанавливает HOME в два каталога в подкаталоге doc / unix. Потом в .... \ doc \ unix.bashrc включаю PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin". Я не использовал start /wait %CD%\bin\bashдля запуска bash, потому что использую Console2 , поэтому мне не нужно дополнительное окно cmd.


2

Использование переменной среды Windows: HOME

Это работает для меня для постоянного, непереносимого, несетевого решения; т.е. постоянная установка переменной HOME Environment в Windows.

Обратите внимание, что это не влияет на сеансы ssh или telnet, которые всегда ссылаются на / etc / passwd

ref: Настройка Cygwin - переменная окружения My HOME - это не то, что я хочу.

CMD

Для текущего пользователя (необходимо запускать один раз для каждого пользователя):

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

Для новых пользователей:

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

Примечание: вставки ^ перед знаком процента%

ИМПОРТ РЕГ-ФАЙЛА

Импортируйте этот reg-файл ( текущий пользователь):

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

Для новых пользователей:

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

РЕГЕДИТ

В Regedit в:

Для текущего пользователя:

HKEY_CURRENT_USER\Environment

Для новых пользователей:

HKU\.DEFAULT\Environment

Создайте HOME как новое расширяемое строковое значение (* REG_EXPAND_SZ *) и введите% USERPROFILE%


Какая бы информация ни была основана на этом ответе, она больше не актуальна. Ссылка: ссылка также нарушена. Я бы не стал пробовать это дома.
Кристофер

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

Я не совсем уверен, что это самое безопасное решение, но это возможное решение, которое работает для меня;)


0

Я отредактировал свой файл / etc / passwd напрямую (убедившись, что ничто другое не будет иметь к нему доступ) и изменил все ссылки на / home на / Users (в Windows 7). Я обнаружил, что для того, чтобы все работало правильно, мне пришлось удалить все каталоги в каталоге / home (или переместить их в соответствующее другое место). В противном случае cygwin разовьется раздвоение личности, где, например, 'bash -l' будет начинаться с / home / Pablo, а $ HOME будет / Users / Pablo, а emacs, по-видимому, сделает обратное. Как только я удалил / home / Pablo, все заработало.


0

Мне нужно было присутствовать только C:\Users\usernameтогда, когда я начинаю cygwin. Итак, я просто добавил .bashrcи.profile

cd ${HOMEPATH}

Если вы предпочитаете использовать ~/.вместо $HOMEPATH, вы также можете добавить следующее:

export HOME=${HOMEPATH}

Таким образом, я не буду мешать установке cygwin.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.