【发布时间】:2010-12-02 10:52:44
【问题描述】:
我刚刚安装了 Cygwin,看起来 bash 提示符中的主目录位于我的 Z: 驱动器上。那不是我想要的地方。
我该如何更改?
【问题讨论】:
-
使用 Cygwin 1.7.34 或更高版本的用户,请使用其他帖子中介绍的方法,但不要忘记删除
db_home:之前的 # 以取消引用并使其正常工作。跨度>
标签: cygwin
我刚刚安装了 Cygwin,看起来 bash 提示符中的主目录位于我的 Z: 驱动器上。那不是我想要的地方。
我该如何更改?
【问题讨论】:
db_home: 之前的 # 以取消引用并使其正常工作。跨度>
标签: cygwin
Starting with Cygwin 1.7.34,推荐的方法是添加自定义db_home 设置到/etc/nsswitch.conf。这样做的一个共同愿望是使 Cygwin 主目录与 Windows 用户配置文件目录相同。此设置将执行此操作:
db_home: windows
或者,等效地:
db_home: /%H
如果您想对此方案进行一些变化,则需要使用后一种形式,例如将 Cygwin 主文件分离到 Windows 用户配置文件目录的 子目录:
db_home: /%H/cygwin
windows 选项还有其他几种替代方案以及其他几种% 令牌,您可以使用它来代替%H 或除此之外。详情请参阅Cygwin User Guide 中的the nsswitch.conf syntax description。
如果您在 1.7.34 之前安装了 Cygwin 或运行了其 mkpasswd utility 以便拥有一个 /etc/passwd 文件,您可以通过编辑该文件中的用户条目来更改您的 Cygwin 主目录。您的主目录是/etc/passwd 中用户行的倒数第二个元素。¹
无论您采用哪种方式,这都会导致在 shell 启动期间设置 HOME 环境变量。²
有关该主题的更多信息,请参阅this FAQ item。
脚注:
考虑将/etc/passwd 和/etc/group 移开,以便改用the new SAM/AD-based mechanism。
虽然可以通过控制面板简单地设置%HOME%,但它是officially discouraged。它不仅毫不客气地覆盖了上述机制,而且并不总是有效,例如在通过cron 运行 shell 脚本时。
【讨论】:
ssh 在编辑 /etc/passwd 之前无法正常工作。
/etc/passwd 文件来解决。请参阅my answer here 以避免此类问题。
db_home: /%H 可能会解析为域用户名(而不是本地用户名),这可能不是您想要的。 db_home: /cygdrive/c/Users/%U 做了我想做的事。
db_home: windows 时,sh 大约需要 2.5 到 3.5 秒才能启动。当我使用db_home: /cygdrive/c/Users/%U 时,sh 大约需要 0.9 到 1.0 秒才能启动。当我删除 db_home 行或将其硬编码到 Windows 主目录时,sh 需要大约 0.2 到 0.3 秒才能启动。我将使用硬编码的解决方案,例如db_home: /cygdrive/c/Users/susam,因为我经常使用 sh 命令从命令提示符运行 shell 脚本,例如sh foo.sh 等2秒以上就很不方便了。
对于那些使用 Cygwin 1.7.34 或更高版本的用户,Cygwin 支持配置如何在/etc/nsswitch.conf 中获取主目录、登录 shell 和 gecos 信息。 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: 的默认设置是
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 路径。另见the section called “The cygwin schema”。
unix 仅限 AD:用户的主目录设置为 posixAccount 辅助类的 unixHomeDirectory 属性中给出的 POSIX 路径。另见the section called “The unix schema”。
desc 用户的主目录设置为 SAM 或 AD 中用户描述属性中的 home="..." XML 类似设置中给出的 POSIX 路径。有关详细说明,请参阅名为“desc 架构”的部分。
以下内容将使 Cygwin 中的用户主目录与用于 Windows 主目录的主目录相同。
db_home: windows
对于那些使用 Cygwin 1.7.33 或更早版本的用户,请更新到 the latest version Cygwin 并删除之前使用的 /etc/passwd 和 /etc/group 文件,然后查看上述步骤。
否则,请按照以下较早的步骤操作。
首先,为 HOME 设置一个指向您的用户配置文件的 Windows 环境变量:
HOME
%USERPROFILE%
现在我们将使用刚刚创建的 Windows %HOME% 变量更新 Cygwin /etc/passwd 文件。通过ssh 进行的Shell 登录和远程登录将依赖/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
【讨论】:
mkgroup 的目的。
我做了一些很简单的事情。我不想更改 Windows 7 环境变量。所以我直接编辑了Cygwin.bat文件。
@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL
这只是用这个主目录启动本地shell;这就是我想要的。我不打算远程访问它,所以这对我有用。
【讨论】:
%HOME% 位置维护一个单独的 vim 配置,而 Cygwin vim 使用您声明的新 $HOME 路径。
Cygwin mount 现在支持 bind 方法,它可以让你挂载一个目录。因此,您只需将以下行添加到/etc/fstab,然后重新启动您的 shell:
c:/Users /home none bind 0 0
【讨论】:
更改您的 HOME 环境变量。
在XP上,右键我的电脑>>属性>>高级>>环境变量>>用户变量>>[选择变量HOME]>>编辑
【讨论】:
我想对 $HOME 优先的部分进行更正/更新。 /etc/passwd 中的主目录优先于所有内容。
我是 Cygwin 的长期用户,我刚刚完成了 Windows 7 x64 和 Cygwin V1.126 的全新安装。我疯了,想弄清楚为什么每次我运行 ssh 时都会得到:
e:\>ssh foo.bar.com
Could not create directory '/home/dhaynes/.ssh'.
The authenticity of host 'foo.bar.com (10.66.19.19)' can't be established.
...
我在 Windows 环境中添加了 HOME=c:\users\dhaynes 定义,但它仍然试图创建“/home/dhaynes”。我尝试了所有可能的组合,包括将 HOME 设置为 /cygdrive/c/users/dhaynes。谷歌搜索错误消息,找不到任何东西,在 cygwin 网站上找不到任何东西。我使用 cmd.exe 中的 cygwin,而不是 bash.exe,但两者都存在问题。
我终于意识到 /etc/passwd 中的主目录优先于 $HOME 环境变量。我简单地重新运行 'mkpasswd -l >/etc/passwd' 并更新了主目录,现在 ssh 一切正常。
这对于具有系统管理员经验的 linux 类型来说可能是显而易见的,但对于我们这些主要使用 Windows 的人来说,这有点晦涩。
【讨论】:
我碰巧使用捆绑了 cygwin 的 cwRsync(Cygwin + Rsync for Windows),但我找不到 /etc/passwd。
它一直在说
Could not create directory '/home/username/.ssh'.
...
Failed to add the host to the list of known hosts (/home/username/.ssh/known_hosts).
所以我写了一个批处理文件,它在运行 rsync 之前更改了 HOME 变量。比如:
set HOME=.
rsync /path1 user@host:/path2
瞧! .ssh 文件夹出现在当前工作目录中,并且 rsync 不再因 rsa 指纹而烦恼。
这是一个快速修复程序,但稍后您应该将 HOME 更改为更安全的位置。
【讨论】: