【问题标题】:How can I change my Cygwin home folder after installation?安装后如何更改 Cygwin 主文件夹?
【发布时间】:2010-12-02 10:52:44
【问题描述】:

我刚刚安装了 Cygwin,看起来 bash 提示符中的主目录位于我的 Z: 驱动器上。那不是我想要的地方。

我该如何更改?

【问题讨论】:

  • 使用 Cygwin 1.7.34 或更高版本的用户,请使用其他帖子中介绍的方法,但不要忘记删除 db_home: 之前的 # 以取消引用并使其正常工作。跨度>

标签: cygwin


【解决方案1】:

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


脚注:

  1. 考虑将/etc/passwd/etc/group 移开,以便改用the new SAM/AD-based mechanism

  2. 虽然可以通过控制面板简单地设置%HOME%,但它是officially discouraged。它不仅毫不客气地覆盖了上述机制,而且并不总是有效,例如在通过cron 运行 shell 脚本时。

【讨论】:

  • 请注意,如果您从 git-scm.com/download/win 安装了 Git bash shell,您可能在安装 cygwin 时遇到问题(取决于您选择的选项)。我的 cygwin ~ 最终出现在我的 Win7 用户目录中,并且 ssh 在编辑 /etc/passwd 之前无法正常工作。
  • @Allan 在此处提到的 git 安装问题通过为 HOME 设置 Windows 环境变量然后重新创建 /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秒以上就很不方便了。
  • 谢谢@abdull,db_home: /cygdrive/c/Users/%U 是我需要的答案。 db_home:windows 使用“/home/%U”,这在我的配置中不存在。
【解决方案2】:

Cygwin 1.7.34+

对于那些使用 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 字符用于分隔模式,因此文件名中的空格必须指定为 %_(即下划线)。
  • %% 百分比字符。

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

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

  2. cygwin 仅限 AD:用户的主目录设置为 cygwinUser 辅助类的 cygwinHome 属性中给出的 POSIX 路径。另见the section called “The cygwin schema”

  3. unix 仅限 AD:用户的主目录设置为 posixAccount 辅助类的 unixHomeDirectory 属性中给出的 POSIX 路径。另见the section called “The unix schema”

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

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

db_home: windows

Cygwin 1.7.33 或更早版本

对于那些使用 Cygwin 1.7.33 或更早版本的用户,请更新到 the latest version Cygwin 并删除之前使用的 /etc/passwd/etc/group 文件,然后查看上述步骤。

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

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

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

现在我们将使用刚刚创建的 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

【讨论】:

  • -d 真的很慢。如果您只需要当前用户,您可以使用 -c 代替:sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
  • Ben 是正确的,您可以通过指定 -c 来为当前用户添加一个条目。但是,如果您这样做,Cygwin 将显示 ?????列出共享文件系统上的文件时用于用户和组,因为它不会包含您的域或本地计算机上的其他用户和组的记录。
  • 我能否建议对措辞进行一些小改动:而不是“现在,使用新的 $HOME 路径更新您的 Cygwin /etc/passwd 文件”,我建议“现在我们将更新带有我们刚刚创建的 HOME 变量的 Cygwin /etc/passwd 文件。非常感谢
  • 用 -d 需要几分钟(我在 5 后杀死)分钟才能完成。所以我用-c重新运行。一切都满足我的需要。
  • @Samuel 我已经添加了一个解释来阐明上面mkgroup 的目的。
【解决方案3】:

我做了一些很简单的事情。我不想更改 Windows 7 环境变量。所以我直接编辑了Cygwin.bat文件。

@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL

这只是用这个主目录启动本地shell;这就是我想要的。我不打算远程访问它,所以这对我有用。

【讨论】:

  • 第二个,因为我无法在我的开发机器中更改我的家庭环境变量。
  • @WernerCD 我只是提醒您,在与本机 Windows 应用程序交互时,这可能会产生意想不到的后果。您的 Windows 应用程序将继续在旧位置寻找 HOME。一个例子是 Gvim,它将在旧 Windows %HOME% 位置维护一个单独的 vim 配置,而 Cygwin vim 使用您声明的新 $HOME 路径。
  • 这太棒了...... 5 年后,我喜欢它,因为“工程”对于 Cygwin 相对新手(如我)来说非常简单,可以使用和理解。顺便说一句,在 C:\Users\\AppData\Roaming\Microsoft\Windows\SendTo 中放置 .bat 文件的快捷方式意味着您可以在上下文相关(右键单击)菜单中转到 Send-->Cygwin Explorer(并在任何地方打开终端,使用 ~/ 设置任何你想要的地方)。
【解决方案4】:

Cygwin mount 现在支持 bind 方法,它可以让你挂载一个目录。因此,您只需将以下行添加到/etc/fstab,然后重新启动您的 shell:

c:/Users /home none bind 0 0

【讨论】:

  • 这是当今正确的方法。其他答案已过时。
  • @ceving 这是否记录在任何地方?
【解决方案5】:

更改您的 HOME 环境变量。

在XP上,右键我的电脑>>属性>>高级>>环境变量>>用户变量>>[选择变量HOME]>>编辑

【讨论】:

  • 这也将更改所有 Windows 应用程序的 HOME 环境变量。
  • 非常正确。但是您有哪些使用 HOME 变量的 Windows 应用程序?我有 EmacsW32 和.... Cygwin。由于我首先安装了 Emacs,这也是我的 cygwin 家所在的地方。
  • 这不会与 /etc/passwd 发生冲突吗?如果没有设置环境变量,它会默认为 /etc/passwd 的 HOME 吗?如果没有冲突并且默认为 /etc/passwd,这似乎是一个完美的设置:我在拇指驱动器上运行 Cygwin,以避免在工作时请求安装权限,所以我有一个 Unix-就像我口袋里的环境一样,当只有一个 Windows 盒子可用时我可以使用它。在工作中,我将拥有我的工作计算机的主目录,而在其他地方我可以在拇指驱动器上拥有一个主目录。
【解决方案6】:

我想对 $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 的人来说,这有点晦涩。

【讨论】:

  • /etc/passwd 中的主目录并不优先于所有内容。但是,在远程登录或使用 ssh 时,它会用作 HOME 目录路径的主要来源。请参阅 Cygwin 常见问题解答cygwin.com/faq/faq.setup.html#faq.setup.home
【解决方案7】:

我碰巧使用捆绑了 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 更改为更安全的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多