82

我正在尝试按照 中指定的方式安全地更新主目录/etc/passwd,但 Cygwin 不提供用于执行此操作的标准 Linux 实用程序 - usermod 和 vipw。

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

4

12 回答 12

96

编辑:对于 Cygwin 的最新版本(1.7.34 及更高版本),请参阅这个较新的问题

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

但是,如果您想以“官方”方式进行操作,请使用 cygwin-specificmkpasswd命令。以下是官方文档的片段mkpasswd

例如,这个命令:

例 3.11。使用备用主根

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

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

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

在阅读过程中,您可能还想阅读Using Cygwin Effectively with Windows文档。有很多非常好的建议。

于 2008-11-29T05:52:02.903 回答
19

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

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

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

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

于 2008-10-22T14:56:32.427 回答
16

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

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

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

于 2012-04-25T18:28:27.940 回答
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,但我还是按照使用 Tortoise 的官方文档在此处使用 Tortoise 的非官方 Cygwin 支持设置 TortoiseGit 和 Cygwin 的说明进行了设置。虽然单独设置 HOME 不足以让 ssh-keygen 识别主目录更改。

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

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

于 2015-04-22T14:38:47.177 回答
4

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

于 2008-10-22T13:54:16.563 回答
3

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

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

mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd
于 2008-12-12T05:03:08.903 回答
3

来自其他地方克里斯托弗的原始答案

Cygwin 1.7.34+

对于使用Cygwin 1.7.34或更高版本的用户,Cygwin 支持配置如何在/etc/nsswitch.conf. Cygwin 用户指南部分对此进行了详细说明:

如果您之前创建了一个/etc/passwdor/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. 您可以将其更改为指向您想要的任何其他自定义路径。支持的通配符有:

  • %uCygwin 用户名(小写的 u)。
  • %UWindows 用户名(大写的 U)。
  • %DNetBIOS 风格的 Windows 域。
  • %HPOSIX 风格的 Windows 主目录。请注意,对于db_home:设置,这仅在前面的斜杠之后才有意义,如db_home: /%H/cygwin
  • %_由于空格和 TAB 字符用于分隔模式,因此文件名中的空格必须指定为%_(即下划线)。
  • %%一个百分比字符。

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

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

  2. cygwin仅限 AD:用户的主目录设置为 cygwinUser 辅助类的 cygwinHome 属性中给出的 POSIX 路径。另请参阅名为“cygwin 模式”的部分</a>。

  3. unix仅限 AD:用户的主目录设置为 posixAccount 辅助类的 unixHomeDirectory 属性中给出的 POSIX 路径。另请参阅名为“unix 模式”的部分</a>。

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

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

db_home: windows

Cygwin 1.7.33 或更早版本

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

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

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

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

现在我们将使用刚刚创建/etc/passwd的 Windows%HOME%变量更新 Cygwin 文件。Shell 登录和远程登录通过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 用户,而-lis 只输出 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

于 2016-11-23T05:46:32.927 回答
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 不会破坏其他程序的现有环境变量。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 窗口。

于 2011-06-13T02:15:00.303 回答
2

使用 Windows 环境变量:HOME

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

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

参考:设置 Cygwin-我的 HOME 环境变量不是我想要的。

命令

对于当前用户(每个用户需要运行一次)::

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%

于 2012-05-30T15:01:15.377 回答
1
cd /home
rm -rf chris
ln -s /cygdrive/z chris

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

于 2016-02-17T08:32:09.600 回答
0

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

于 2014-10-14T22:46:31.967 回答
0

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

cd ${HOMEPATH}

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

export HOME=${HOMEPATH}

这样我就不会打扰 cygwin 安装。

于 2019-07-18T14:47:51.397 回答