安全地更改主目录

时间:2008-10-22 13:40:16

标签: cygwin etcpasswd

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

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

12 个答案:

答案 0 :(得分:96)

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

与sblundy的回答一样,您可以随时编辑。

但如果您想以“官方”方式执行此操作,请使用特定于cygwin的mkpasswd命令。以下是mkpasswd上官方文档的摘要:

  

例如,这个命令:

     

示例3.11。使用备用主目录

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

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

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

当你在这里时,你可能还想阅读Using Cygwin Effectively with Windows文档。有很多非常好的建议。

答案 1 :(得分:19)

我最终退出了所有的cygwin shell并在文本编辑器中手动编辑。到目前为止,非常好。

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

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

该行在:字符上被标记化。

答案 2 :(得分:16)

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

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

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

答案 3 :(得分:8)

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

  1. 关闭Cygwin。
  2. 设置HOME Windows用户环境变量。
  3. 启动Cygwin。
  4. 运行“mkpasswd -c -p”$(cygpath -H)“> / etc / passwd”。
  5. 重启Cygwin。
  6. 我通过运行ssh-keygen确认它没有任何参数。进行此更改后,应用程序现在默认将密钥保存到/ cygdrive / c / Users / user而不是/ home / user。

    我不知道是否需要设置HOME,但无论如何我都按照使用Tortoise官方文档为Cygwin设置TortoiseGit的说明做了非官方的Cygwin支持here。单独设置HOME虽然不足以让ssh-keygen识别主目录更改。

    另请注意,可以找到Cygwin关于此问题的官方文档here

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

为避免因在主目录的路径中留有空格而导致的问题,请使用Windows“个人档案”目录的简短格式 - 即/cygdrive/c/DOCUME~1/user

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

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

答案 6 :(得分: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 / unix子目录中将HOME设置为两个目录。然后在.... \ doc \ unix.bashrc中,我包含PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin"。 我没有使用start /wait %CD%\bin\bash来启动bash,因为我使用Console2,所以我不需要额外的cmd窗口。

答案 7 :(得分:2)

使用Windows环境变量:HOME

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

注意这不会影响总是引用 / etc / passwd ssh telnet 会话

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^%

new 用户:

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

注意: Carets ^ 之前百分号%

IMPORT REG FILE

导入此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

new 用户:

HKU\.DEFAULT\Environment

HOME 创建为新的可扩展字符串值(* REG_EXPAND_SZ *)并输入%USERPROFILE%

答案 8 :(得分:2)

  来自answer

Christopher的原始elsewhere

Cygwin 1.7.34 +

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

如果您之前已经创建了/etc/passwd/etc/group文件,那么您将要删除这些文件,并使用新的Windows安全模型将Cygwin配置为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 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用户的主目录设置为home =" ..."中给出的POSIX路径。 SAM或AD中用户的描述属性中的类似XML的设置。有关详细说明,请参阅“desc架构”一节。

  5. 以下内容将使用户在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. 在用户变量区域中,单击"新建..."
    5. 对于变量名称,请输入HOME
    6. 对于变量值,请输入%USERPROFILE%
    7. 在所有打开的对话框中单击“确定”以应用此新设置
    8. 现在我们将使用刚刚创建的Windows /etc/passwd变量更新Cygwin %HOME%文件。通过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包含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

答案 9 :(得分:1)

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

我不确定它是否是最安全的解决方案,但它是一个可行的解决方案对我有用;)

答案 10 :(得分:0)

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

答案 11 :(得分:0)

启动cygwin时,我只需要进入C:\Users\username。因此,我刚刚添加到.bashrc.profile

cd ${HOMEPATH}

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

export HOME=${HOMEPATH}

这样,我不会打扰cygwin的安装。