我试图按照中指定的那样安全地更新主目录/etc/passwd
,但是Cygwin没有提供用于这样做的标准Linux utils(usermod和vipw)。
谁能告诉我他们如何在Cygwin中更改此设置?
我试图按照中指定的那样安全地更新主目录/etc/passwd
,但是Cygwin没有提供用于这样做的标准Linux utils(usermod和vipw)。
谁能告诉我他们如何在Cygwin中更改此设置?
Answers:
编辑:对于Cygwin的最新版本(1.7.34及更高版本),请参见此较新的问题。
像sblundy的答案一样,您始终可以手动编辑。
但是,如果您想以“官方”方式进行操作,请使用特定于cygwin的mkpasswd
命令。以下是来自的官方文档的摘录mkpasswd
:
例如,此命令:
示例3.11 使用备用主根
$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd
会将本地用户的主目录放在Windows的“个人资料”目录中。
Cygwin实用程序文档页面(包括mkpasswd
)上介绍了许多其他非常有用的命令。cygpath
在以上示例中的使用是这些特定于Cygwin的工具中的另一种。
在阅读本书时,您可能还想阅读“将Cygwin与Windows一起有效使用”文档。有很多非常好的建议。
-d
对于域) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd
这对我不起作用-它基本上挂了。由于我是唯一使用此计算机的人,因此我可以使用此替代方法,无论您是否在域上(-c
对于“当前用户”) ,这都应该是安全的$ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
$HOME
。任何想法如何解决这个问题?
我最终退出了所有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
cygwin -H
默认。这是最明智的位置,并且由于Windows 7也没有路径。
对于当前用户,以下对我有用:
我通过运行不带任何参数的ssh-keygen确认它可以工作。进行此更改后,该应用程序现在默认将密钥保存到/ cygdrive / c / Users / user而不是/ home / user。
我不知道是否需要设置HOME,但是无论如何我还是按照此处的说明使用Torgise的官方文档为Cygwin设置了Cygwin的TortoiseGit,以进行非官方的Cygwin支持。尽管仅设置HOME不足以使ssh-keygen识别主目录更改。
另外,请注意,可以在此处找到有关此问题的Cygwin的官方文档。
在Windows 7中使用64位Cygwin v1.7.35确认。
我总是在“计算机属性”中将HOME设置为用户特定的环境变量。
我想使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设置为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 Environment变量。
请注意,这不会影响始终引用/ etc / passwd的ssh或telnet会话
对于当前用户(需要每个用户运行一次)::
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^%
注意:百分号%之前的Carets ^
导入此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%
对于使用Cygwin 1.7.34或更高版本的用户,Cygwin支持在中配置如何获取主目录,登录Shell和gecos信息/etc/nsswitch.conf
。《 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:
IS
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
。当然,Cygwin将Windows目录转换为POSIX样式。
cygwin
仅限AD:用户的主目录设置为cygwinUser辅助类的cygwinHome属性中给定的POSIX路径。另请参见“ cygwin模式”一节。
unix
仅限AD:用户的主目录设置为posixAccount辅助类的unixHomeDirectory属性中给定的POSIX路径。另请参见“ Unix模式”一节。
desc
用户的主目录设置为SAMIX或AD中用户描述属性中XML相似的home =“ ...” XML设置中提供的POSIX路径。有关详细说明,请参见“ desc模式”一节。
以下内容将使Cygwin中用户的主目录与Windows主目录使用的主目录相同。
db_home: windows
对于使用这些Cygwin的33年7月1日或更早的版本,更新到最新版本的Cygwin,并删除以前使用/etc/passwd
和/etc/group
文件,再看看上面的步骤。
否则,请按照以下这些较旧的步骤进行操作。
首先,为HOME设置一个Windows环境变量,该变量指向您的用户个人资料:
HOME
%USERPROFILE%
现在,我们将/etc/passwd
使用%HOME%
刚刚创建的Windows变量更新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
只输出本地机器用户。如果您在工作中使用PC且从Windows域控制器获取用户信息的情况下,这一点很重要。
现在,您也可以对组执行相同的操作,尽管没有必要,除非您将使用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
我直接编辑了/ 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的安装。