我正在尝试按照 中指定的方式安全地更新主目录/etc/passwd
,但 Cygwin 不提供用于执行此操作的标准 Linux 实用程序 - usermod 和 vipw。
谁能告诉我他们是如何在 Cygwin 中改变这个的?
编辑:对于 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文档。有很多非常好的建议。
我最终退出了我所有的 cygwin shell 并在文本编辑器中手动编辑它。到现在为止还挺好。
注意:不要转义“文档和设置”目录中的空格。条目看起来像
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
对于当前用户,以下内容对我有用:
我通过不带任何参数运行 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 中确认。
我总是在计算机属性中将 HOME 设置为用户特定的环境变量。
为避免因主目录路径中有空格而导致的问题,请使用 Windows 'Profiles' 目录的缩写形式 - 即/cygdrive/c/DOCUME~1/user
.
您可以通过键入以下命令来执行此操作:
mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd
对于使用Cygwin 1.7.34或更高版本的用户,Cygwin 支持配置如何在/etc/nsswitch.conf
. Cygwin 用户指南部分对此进行了详细说明:
如果您之前创建了一个/etc/passwd
or/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 字符用于分隔模式,因此文件名中的空格必须指定为%_
(即下划线)。%%
一个百分比字符。您可以指定预定义的四个命名路径模式之一来代替路径。
windows
用户的主目录设置为与 Windows 主目录相同的目录,通常类似于%USERPROFILE%
或C:\Users\$USERNAME
。当然,Windows 目录是由 Cygwin 转换为 POSIX 样式的。
cygwin
仅限 AD:用户的主目录设置为 cygwinUser 辅助类的 cygwinHome 属性中给出的 POSIX 路径。另请参阅名为“cygwin 模式”的部分</a>。
unix
仅限 AD:用户的主目录设置为 posixAccount 辅助类的 unixHomeDirectory 属性中给出的 POSIX 路径。另请参阅名为“unix 模式”的部分</a>。
desc
用户的主目录设置为在 SAM 或 AD 中用户的描述属性中的 home="..." XML 类似设置中给出的 POSIX 路径。有关详细说明,请参阅名为“描述模式”的部分。
以下将使 Cygwin 中的用户主目录与用于 Windows 主目录的相同。
db_home: windows
对于使用Cygwin 1.7.33或更早版本的用户,请更新到最新版本的 Cygwin并删除以前使用的/etc/passwd
和/etc/group
文件,然后参见上述步骤。
否则,请按照以下这些较早的步骤操作。
首先,为指向您的用户配置文件的 HOME 设置一个 Windows 环境变量:
HOME
%USERPROFILE%
现在我们将使用刚刚创建/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 用户,而-l
is 只输出 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 安装同步到笔式驱动器和另一台计算机,所以我讨厌硬编码主目录。我使用以下 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 窗口。
这对我来说适用于永久、非便携式、非网络解决方案;即在 Windows 中永久设置 HOME 环境变量。
请注意,这不会影响始终引用/etc/passwd的ssh或telnet会话
参考:设置 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%
cd /home
rm -rf chris
ln -s /cygdrive/z chris
我不确定这是否是最安全的解决方案,但它可能是适合我的解决方案;)
我直接编辑了我的 /etc/passwd 文件(确保没有其他人可以访问它),并将所有对 /home 的引用更改为 /Users (在 Windows 7 上)。我发现,为了让一切正常工作,我必须删除 /home 目录中的所有目录(或将它们移动到适当的其他位置)。否则,cygwin 会发展出人格分裂,例如,'bash -l' 会从 /home/Pablo 开始,但 $HOME 会是 /Users/Pablo,而 emacs 似乎会做相反的事情。删除 /home/Pablo 后,一切正常。
我只需要在C:\Users\username
启动 cygwin 时加入。所以,我只是添加到.bashrc
和.profile
cd ${HOMEPATH}
如果您更喜欢使用~/.
而不是$HOMEPATH
,还可以添加以下内容:
export HOME=${HOMEPATH}
这样我就不会打扰 cygwin 安装。