安全地更改主目录
我试图安全地更新/etc/passwd
指定的主目录,但是标准的Linux utils – usermod和vipw – 这样做并不是Cygwin提供的。
有谁能告诉我他们是如何在Cygwin中改变这一点的?
编辑:对于最新版本的Cygwin(1.7.34及以上),看到这个新的问题 。
就像sblundy的回答一样,你可以随时编辑。
但是如果你想这样做“官方”的方式,使用特定于cygwin的mkpasswd
命令。 以下是mkpasswd
官方文档的一个片段:
例如,这个命令:
例3.11。 使用另一个家庭根
$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd
会把本地用户的主目录放在Windows的“个人档案”目录中。
在Cygwin Utilities文档页面(其中包括mkpasswd
)中介绍了一些其他非常有用的命令。 在上面的例子中使用cygpath
是另一个cygwin特定的工具。
当你在这里,你可能也想阅读有效使用Cygwin与Windows文档。 有很多很好的build议。
我最终退出了所有的cygwin shell,并在文本编辑器中手工编辑。 到现在为止还挺好。
注意:不要跳过“Documents and Settings”目录中的空格。 该条目将看起来像
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
对于当前的用户,以下工作适合我:
- closuresCygwin。
- 设置HOME Windows用户环境variables。
- 启动Cygwin。
- 运行“mkpasswd -c -p”$(cygpath -H)“> / etc / passwd”。
- 重新启动Cygwin。
我确认它没有任何参数运行ssh-keygen。 进行此更改后,应用程序现在默认将密钥保存到/ cygdrive / c / Users / user而不是/ home / user。
我不知道是否需要设置HOME,但是我按照Cygwin的说明设置了TortoiseGit,并且使用了Tortoise的官方文档来获得非官方的Cygwin支持。 单独设置HOME并不足以让ssh-keygen识别主目录更改。
另外请注意,Cygwin的官方文档可以在这里find。
在Windows 7中使用64位Cygwin v1.7.35进行了确认。
在“计算机属性”中,我始终将HOME设置为用户特定的环境variables。
为避免由于在主目录path中有空格而导致的问题,请使用/cygdrive/c/DOCUME~1/user
'目录的缩写 – 即/cygdrive/c/DOCUME~1/user
。
您可以通过键入以下命令来执行此操作:
mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd
我喜欢保持我的cygwin安装同步到笔驱动器和另一台计算机,所以我讨厌硬编码的主目录。 我使用下面的cygwin.bat:
echo off SETLOCAL set SHELL=\\bin\\bash set HOME=%~dp0..\..\doc\unix bin\bash --login -i ENDLOCAL
SETLOCAL和ENDLOCAL确保SHELL和HOME不会为其他程序中的现有envvariables打开。 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环境variables:HOME
这对我来说是一个永久性的,非便携式的,非networking解决scheme; 即在Windows中永久设置HOME环境variables。
请注意 ,这不会影响始终引用/ etc / passwd的 ssh或telnet会话
ref:设置Cygwin – 我的HOME环境variables不是我想要的。
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文件
导入这个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
对于新用户:
HKU\.DEFAULT\Environment
将HOME作为新的可扩展string值 (* REG_EXPAND_SZ *)创build并放入%USERPROFILE%
cd /home rm -rf chris ln -s /cygdrive/z chris
我不太确定这是否是最安全的解决scheme,但这是一个可行的解决scheme
克里斯托弗从其他地方的原始答复
Cygwin 1.7.34+
对于使用Cygwin 1.7.34或更高版本的用户,Cygwin支持在/etc/nsswitch.conf
configuration如何获取主目录,loginshell和gecos信息。 这在Cygwin用户指南部分有详细介绍:
- Cygwin的用户名,家庭目录,loginshell
如果以前创build了/etc/passwd
或/etc/group
文件,则需要删除这些文件,并使用新的Windows安全模型将Cygwinconfiguration为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
。 你可以改变它,但指向你想要的任何其他自定义path。 受支持的通配符是:
-
%u
Cygwin用户名(小写字母u)。 -
%U
Windows用户名(大写U)。 -
%D
在NetBIOS风格的Windows域。 -
%H
用POSIX风格的Windows主目录。 请注意,对于db_home:
设置,只有在上一个斜杠之后才有意义,如在db_home: /%H/cygwin
-
%_
因为空格和TAB字符被用来分隔模式,所以文件名中的空格必须被赋予%_
(这是一个下划线)。 -
%%
百分之一字符。
代替path,您可以指定预定义的四个命名path模式之一。
-
windows
用户的主目录设置为与Windows主目录相同的目录,通常是%USERPROFILE%
或C:\Users\$USERNAME
。 当然,Windows目录由Cygwin转换为POSIX风格。 -
仅用于
cygwin
AD:用户的主目录设置为cygwinUser辅助类的cygwinHome属性中给出的POSIXpath。 另请参阅“cygwin架构”一节 。 -
仅限于
unix
AD:用户的主目录设置为posixAccount辅助类的unixHomeDirectory属性中给出的POSIXpath。 另请参阅“Unix模式”一节 。 -
desc
用户的主目录设置为SAM或AD中用户描述属性中home =“…”XML类似设置中给出的POSIXpath。 有关详细说明,请参阅“desc架构”一节。
以下将使用户的Cygwin的主目录与用于Windows主目录的主目录相同。
db_home: windows
Cygwin 1.7.33或更早版本
对于那些使用Cygwin 1.7.33或更早版本的用户,请更新到Cygwin的最新版本,并删除以前使用的/etc/passwd
和/etc/group
文件,然后查看上述步骤。
否则,请按照下面这些较旧的步骤。
首先,为HOME指定一个Windows环境variables,指向你的用户configuration文件:
- 在控制面板上打开系统
- 在高级选项卡上单击环境variables (向底部)
- 在用户variables区域点击“新build…”
- 对于variables名称input
HOME
- 对于variables值,input
%USERPROFILE%
- 在所有打开的对话框中单击确定以应用此新设置
现在我们要用我们刚刚创build的Windows %HOME%
variables来更新Cygwin /etc/passwd
文件。 通过ssh
Shelllogin和远程login将依靠/etc/passwd
来告诉他们用户$HOME
path的位置。
在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并重新启动它。 您应该发现您的HOMEpath指向与Windows用户configuration文件相同的位置 – ie /cygdrive/c/Users/username
我直接编辑了我的/ etc / passwd文件(确保没有别的东西可以访问它),并将/ home的所有引用改为/ Users(在Windows 7上)。 我发现,为了一切工作正常,我不得不删除/ home目录中的任何目录(或将它们移动到适当的其他位置)。 否则,cygwin会开发一个分裂的个性,例如,'bash -l'将在/ home / Pablo开始,但是$ HOME将会是/ Users / Pablo,而emacs会出现相反的情况。 一旦我删除/家/巴勃罗,一切工作正常。