安全地更改主目录

我试图安全地更新/etc/passwd指定的主目录,但是标准的Linux utils – usermod和vipw – 这样做并不是Cygwin提供的。

有谁能告诉我他们是如何在Cygwin中改变这一点的?

编辑:对于最新版本的Cygwin(1.7.34及以上),看到这个新的问题 。

就像sblundy的回答一样,你可以随时编辑。

但是如果你想这样做“官方”的方式,使用特定于cygwin的mkpasswd命令。 以下是mkpasswd官方文档的一个片段:

例如,这个命令:

例3.11。 使用另一个家庭根

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

会把本地用户的主目录放在Windows的“个人档案”目录中。

Cygwin Utilities文档页面(其中包括mkpasswd )中介绍了一些其他非常有用的命令。 在上面的例子中使用cygpath是另一个cygwin特定的工具。

当你在这里,你可能也想阅读有效使用Cygwin与Windows文档。 有很多很好的build议。

我最终退出了所有的cygwin shell,并在文本编辑器中手工编辑。 到现在为止还挺好。

注意:不要跳过“Documents and Settings”目录中的空格。 该条目将看起来像

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

该行在:字符上进行标记。

我发现最简单的答案是让/ home成为Windows Home / UserProfile目录的软链接

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

我使用了cygpath,因为它将在当前版本的Windows上获得HOME目录的正确位置。 在我的盒子里, cygpath -H返回/cygdrive/c/Users

对于当前的用户,以下工作适合我:

  1. closuresCygwin。
  2. 设置HOME Windows用户环境variables。
  3. 启动Cygwin。
  4. 运行“mkpasswd -c -p”$(cygpath -H)“> / etc / passwd”。
  5. 重新启动Cygwin。

我确认它没有任何参数运行ssh-keygen。 进行此更改后,应用程序现在默认将密钥保存到/ cygdrive / c / Users / user而不是/ home / user。

我不知道是否需要设置HOME,但是我按照Cygwin的说明设置了TortoiseGit,并且使用了Tortoise的官方文档来获得非官方的Cygwin支持。 单独设置HOME并不足以让ssh-keygen识别主目录更改。

另外请注意,Cygwin的官方文档可以在这里find。

在Windows 7中使用64位Cygwin v1.7.35进行了确认。

在“计算机属性”中,我始终将HOME设置为用户特定的环境variables。

为避免由于在主目录path中有空格而导致的问题,请使用/cygdrive/c/DOCUME~1/user '目录的缩写 – 即/cygdrive/c/DOCUME~1/user

您可以通过键入以下命令来执行此操作:

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

我喜欢保持我的cygwin安装同步到笔驱动器和另一台计算机,所以我讨厌硬编码的主目录。 我使用下面的cygwin.bat:

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

SETLOCAL和ENDLOCAL确保SHELL和HOME不会为其他程序中的现有envvariables打开。 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窗口。

使用Windows环境variables:HOME

这对我来说是一个永久性的,非便携式的,非networking解决scheme; 即在Windows中永久设置HOME环境variables。

请注意 ,这不会影响始终引用/ etc / passwd的 sshtelnet会话

ref:设置Cygwin – 我的HOME环境variables不是我想要的。

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文件

导入这个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

在Regedit中,在:

对于当前用户:

 HKEY_CURRENT_USER\Environment 

对于用户:

 HKU\.DEFAULT\Environment 

HOME作为新的可扩展string值 (* REG_EXPAND_SZ *)创build并放入%USERPROFILE%

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

我不太确定这是否是最安全的解决scheme,但这是一个可行的解决scheme

克里斯托弗从其他地方的原始答复

Cygwin 1.7.34+

对于使用Cygwin 1.7.34或更高版本的用户,Cygwin支持在/etc/nsswitch.confconfiguration如何获取主目录,loginshell和gecos信息。 这在Cygwin用户指南部分有详细介绍:

  • Cygwin的用户名,家庭目录,loginshell

如果以前创build了/etc/passwd/etc/group文件,则需要删除这些文件,并使用新的Windows安全模型将Cygwinconfiguration为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 。 你可以改变它,但指向你想要的任何其他自定义path。 受支持的通配符是:

  • %u Cygwin用户名(小写字母u)。
  • %U Windows用户名(大写U)。
  • %D在NetBIOS风格的Windows域。
  • %H用POSIX风格的Windows主目录。 请注意,对于db_home:设置,只有在上一个斜杠之后才有意义,如在db_home: /%H/cygwin
  • %_因为空格和TAB字符被用来分隔模式,所以文件名中的空格必须被赋予%_ (这是一个下划线)。
  • %%百分之一字符。

代替path,您可以指定预定义的四个命名path模式之一。

  1. windows用户的主目录设置为与Windows主目录相同的目录,通常是%USERPROFILE%C:\Users\$USERNAME 。 当然,Windows目录由Cygwin转换为POSIX风格。

  2. 仅用于cygwin AD:用户的主目录设置为cygwinUser辅助类的cygwinHome属性中给出的POSIXpath。 另请参阅“cygwin架构”一节 。

  3. 仅限于unix AD:用户的主目录设置为posixAccount辅助类的unixHomeDirectory属性中给出的POSIXpath。 另请参阅“Unix模式”一节 。

  4. desc用户的主目录设置为SAM或AD中用户描述属性中home =“…”XML类似设置中给出的POSIXpath。 有关详细说明,请参阅“desc架构”一节。

以下将使用户的Cygwin的主目录与用于Windows主目录的主目录相同。

 db_home: windows 

Cygwin 1.7.33或更早版本

对于那些使用Cygwin 1.7.33或更早版本的用户,请更新到Cygwin的最新版本,并删除以前使用的/etc/passwd/etc/group文件,然后查看上述步骤。

否则,请按照下面这些较旧的步骤。

首先,为HOME指定一个Windows环境variables,指向你的用户configuration文件:

  1. 控制面板上打开系统
  2. 高级选项卡上单击环境variables (向底部)
  3. 在用户variables区域点击“新build…”
  4. 对于variables名称inputHOME
  5. 对于variables值,input%USERPROFILE%
  6. 在所有打开的对话框中单击确定以应用此新设置

现在我们要用我们刚刚创build的Windows %HOME%variables来更新Cygwin /etc/passwd文件。 通过ssh Shelllogin和远程login将依靠/etc/passwd来告诉他们用户$HOMEpath的位置。

在Cygwin bash命令提示符下键入以下内容:

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

-d开关告诉mkpasswd包含DOMAIN用户,而-l只是输出LOCAL机器用户。 如果您正在从Windows域控制器获取用户信息的工作中使用PC,这一点非常重要。

现在,您也可以对群组执行相同操作,但除非您使用属于Windows域的计算机,否则这不是必需的。 Cygwin从Windows帐户数据库中读取组信息,但是如果您的机器经常与其域控制器断开连接,则可以添加/etc/group文件。

在Cygwin bash提示符下键入以下内容:

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

现在,退出Cygwin并重新启动它。 您应该发现您的HOMEpath指向与Windows用户configuration文件相同的位置 – ie /cygdrive/c/Users/username

我直接编辑了我的/ etc / passwd文件(确保没有别的东西可以访问它),并将/ home的所有引用改为/ Users(在Windows 7上)。 我发现,为了一切工作正常,我不得不删除/ home目录中的任何目录(或将它们移动到适当的其他位置)。 否则,cygwin会开发一个分裂的个性,例如,'bash -l'将在/ home / Pablo开始,但是$ HOME将会是/ Users / Pablo,而emacs会出现相反的情况。 一旦我删除/家/巴勃罗,一切工作正常。