【问题标题】:Safely change home directory安全地更改主目录
【发布时间】:2010-09-18 13:16:44
【问题描述】:

我正在尝试安全地更新/etc/passwd 中指定的主目录, 但是没有提供标准的 Linux utils - usermod 和 vipw - 这样做 由 Cygwin 提供。

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

【问题讨论】:

标签: cygwin etcpasswd


【解决方案1】:

编辑:有关 Cygwin 的最新版本(1.7.34 及更高版本),请参阅this newer question

就像 sblundy 的回答一样,您始终可以手动编辑。

但是,如果您想以“官方”方式进行操作,请使用 cygwin 特定的 mkpasswd 命令。以下是来自mkpasswd 官方文档的 sn-p:

例如这个命令:

示例 3.11。使用备用主根目录

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

会将本地用户的主目录放在 Windows 的“配置文件”目录中。

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

当您使用它时,您可能还想阅读Using Cygwin Effectively with Windows 文档。有很多非常好的建议。

【讨论】:

  • 如果你在域中,你可以考虑这个替代命令:(-d 域)$ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd 这对我不起作用——它基本上挂了。由于我是唯一一个使用这台机器的人,我可以使用这个替代方案,无论你是否在域上都应该是安全的(-c 用于“当前用户)$ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
  • 执行此操作后,.bashrc 似乎没有被读取,即使我将其复制到我的新 $HOME。知道如何解决这个问题吗?
  • 输出应附加 (>>) 到 /etc/passwd(对于有多个用户的公司场景)。这行得通! :)
  • 使用 uname -r 查看你使用的是哪个 cygwin 版本
【解决方案2】:

我最终退出了我所有的 cygwin shell 并在文本编辑器中手动编辑它。到目前为止,一切顺利。

注意:不要转义“文档和设置”目录中的空格。条目看起来像

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

该行在: 字符上标记。

【讨论】:

  • 这也适用于 UNC 路径,感谢之前用 HOME 变量覆盖
  • 我必须手动编辑什么?我不知道为什么我的 cygwin 主目录是 /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6 我希望它是 C:/Users/MyName/
【解决方案3】:

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

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

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

【讨论】:

  • 这样做了一段时间后有一个缺点:每次我使用他们的 setup.exe 更新 cygwin 时都必须运行它。没什么大不了的,但要记住。
  • 这是最好的答案。我想知道为什么cygwin默认不默认为cygwin -H。这是最明智的位置,而且由于 Windows 7,它的路径中也没有空间。
  • 另一方面,这行不通。它突然决定忽略符号链接!
  • 再次运行安装程序时必须重新应用它。那是我唯一一次失败。我还没有在 Windows 10 上尝试过
  • 在 Windows 10 上按预期工作。每次更新 cygwin 时我仍然需要重新申请。
【解决方案4】:

对于当前用户,以下对我有用:

  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,但我还是按照使用 Tortoise 的非官方 Cygwin 支持here 的官方文档使用 Cygwin 设置 TortoiseGit 的说明进行了设置。虽然单独设置 HOME 不足以让 ssh-keygen 识别主目录更改。

另外,请注意 Cygwin 关于这个问题的官方文档可以在 here 找到。

在使用 64 位 Cygwin v1.7.35 的 Windows 7 中确认。

【讨论】:

  • 对于 Cygwin 1.7.35+ 不鼓励使用 mkpasswd 以支持 /etc/nsswitch.conf
【解决方案5】:

我总是在计算机属性中将 HOME 设置为用户特定的环境变量。

【讨论】:

  • 我试图避免这种情况,因为它被设置为公司网络驱动器。看起来它会工作。
  • 请注意,这不适用于 ssh,它明确忽略 HOME 并始终使用 /etc/passwd。见cygwin.com/faq/faq-nochunks.html#faq.setup.home的最后一句话。
【解决方案6】:

为避免因主目录路径中有空格而导致的问题,请使用 Windows“配置文件”目录的缩写形式 - 即 /cygdrive/c/DOCUME~1/user

你可以通过输入命令来做到这一点:

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

【讨论】:

    【解决方案7】:

    answerChristopher来自elsewhere

    Cygwin 1.7.34+

    对于那些使用 Cygwin 1.7.34 或更高版本的用户,Cygwin 支持配置如何在/etc/nsswitch.conf 中获取主目录、登录 shell 和 gecos 信息。 Cygwin 用户指南部分对此进行了详细说明:

    如果您之前创建了 /etc/passwd/etc/group 文件,则需要删除这些文件并使用新的 Windows 安全模型到 POSIX 映射配置 Cygwin。

    [[ -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 NetBIOS 样式的 Windows 域。
    • %H POSIX 样式的 Windows 主目录。请注意,对于db_home: 设置,这仅在前面的斜杠之后才有意义,如db_home: /%H/cygwin
    • %_ 由于空格和 TAB 字符用于分隔模式,因此文件名中的空格必须指定为 %_(即下划线)。
    • %% 百分比字符。

    您可以指定预定义的四个命名路径模式之一来代替路径。

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

    2. cygwin 仅限 AD:用户的主目录设置为 cygwinUser 辅助类的 cygwinHome 属性中给出的 POSIX 路径。另见the section called “The cygwin schema”

    3. unix 仅限 AD:用户的主目录设置为 posixAccount 辅助类的 unixHomeDirectory 属性中给出的 POSIX 路径。另见the section called “The unix schema”

    4. desc 用户的主目录设置为 SAM 或 AD 中用户描述属性中的 home="..." XML 类似设置中给出的 POSIX 路径。有关详细说明,请参阅名为“desc 架构”的部分。

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

    db_home: windows
    

    Cygwin 1.7.33 或更早版本

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

    否则,请按照以下较早的步骤操作。

    首先,为 HOME 设置一个指向您的用户配置文件的 Windows 环境变量:

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

    现在我们将使用刚刚创建的 Windows %HOME% 变量更新 Cygwin /etc/passwd 文件。通过ssh 进行的Shell 登录和远程登录将依赖/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 包括 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 并重新启动它。您应该会发现您的 HOME 路径与您的 Windows 用户配置文件指向相同的位置 - 即 /cygdrive/c/Users/username

    【讨论】:

    • 由于路径遵循带有最新 Cygwin 的预定义架构,而不是“移动”主目录,我建议使用符号链接(包括 Windows 本机)到 HOME 目录中的特定目录。
    【解决方案8】:

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

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

    SETLOCAL 和 ENDLOCAL 确保 SHELL 和 HOME 不会破坏其他程序的现有环境变量。 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窗口。

    【讨论】:

      【解决方案9】:

      使用 Windows 环境变量:HOME

      这适用于我的永久、非便携式、非网络解决方案;即在 Windows 中永久设置 HOME 环境变量。

      注意这不会影响 sshtelnet 会话,它们总是引用 /etc/passwd

      ref: Setting up Cygwin- My HOME environment variable is not what I want.

      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%

      【讨论】:

      • 无论此答案基于什么信息,它都不再是最新的。 ref: 链接也已损坏。我不会在家里尝试这个。
      【解决方案10】:
      cd /home
      rm -rf chris
      ln -s /cygdrive/z chris
      

      我不确定这是否是最安全的解决方案,但它可能是适合我的解决方案;)

      【讨论】:

        【解决方案11】:

        我直接编辑了我的 /etc/passwd 文件(确保没有其他人可以访问它),并将所有对 /home 的引用更改为 /Users(在 Windows 7 上)。我发现,为了让一切正常工作,我必须删除 /home 目录中的所有目录(或将它们移动到适当的其他位置)。否则,cygwin 会发展出人格分裂,例如,'bash -l' 会从 /home/Pablo 开始,但 $HOME 会是 /Users/Pablo,而 emacs 似乎会做相反的事情。删除 /home/Pablo 后,一切正常。

        【讨论】:

          【解决方案12】:

          当我启动 cygwin 时,我只需要在 C:\Users\username 中。所以,我只是添加到.bashrc.profile

          cd ${HOMEPATH}
          

          如果您更喜欢使用~/. 而不是$HOMEPATH,您还可以添加以下内容:

          export HOME=${HOMEPATH}
          

          这样我就不会干扰 cygwin 的安装了。

          【讨论】:

            猜你喜欢
            • 2015-05-29
            • 2018-11-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-29
            • 1970-01-01
            • 2014-12-22
            • 1970-01-01
            相关资源
            最近更新 更多