安装后如何更改Cygwin主文件夹?


121

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

我该如何更改?


1
对于使用Cygwin 1.7.34或更高版本的用户,请使用其他文章中介绍的方法,但不要忘记在删除#之前取消引用并使其生效db_home:
Maieul

Answers:


180

从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或除此之外使用的其他几个标记。见nsswitch.conf语法描述Cygwin的用户指南了解详情。

如果您在1.7.34之前安装了Cygwin或已运行其实用mkpasswd程序以获取/etc/passwd文件,则可以通过编辑该文件中的用户条目来更改Cygwin主目录。您的主目录是用户行中倒数第二个元素/etc/passwd。¹

无论您采用哪种方式,都会导致HOME在Shell启动期间设置环境变量。²

有关主题的更多信息,请参见此常见问题解答项目


脚注:

  1. 考虑移动/etc/passwd/etc/group才能使用的方式进行新的SAM / AD为基础的机制来代替。

  2. 尽管可以%HOME%通过控制面板简单地进行设置,但官方不建议这样做。它不仅毫不客气地覆盖了上述机制,而且并不总是有效,例如,通过运行Shell脚本时cron


3
请注意,如果你安装了Git的bash shell的git-scm.com/download/win,你可能有问题,用(取决于您选择了哪些选项)cygwin的安装。我的cygwin〜最终出现在我的Win7用户目录中,ssh直到按照说明进行编辑后才能正常工作/etc/passwd
艾伦(Allan)

@Allan在git安装中提到的问题可以通过将Windows环境变量设置为HOME,然后重新创建/etc/passwd文件来解决。请参阅此处的答案以避免此类问题。
Christopher

11
db_home: /%H可能会解析为域名用户名(而不是本地用户名),这可能不是您想要的。db_home: /cygdrive/c/Users/%U做了我想要的。
阿卜杜勒(Abdull)

2
我看到了各种方法之间的性能差异。使用时db_home: windowssh大约需要2.5到3.5秒才能启动。当我使用时db_home: /cygdrive/c/Users/%Ush大约需要0.9到1.0秒才能启动。当我删除该db_home行或将其硬编码到Windows主目录时,sh大约需要0.2到0.3秒才能启动。我使用的是硬编码的解决方案,例如db_home: /cygdrive/c/Users/susam,因为我经常使用sh命令从命令提示符运行外壳脚本,例如sh foo.sh,等待2秒以上变得不便。
Susam Pal

1
谢谢@ abdull,db_home:/ cygdrive / c / Users /%U是我需要的答案。db_home:Windows使用“ / home /%U”,这在我的配置中不存在。
杰夫(Jeff)

74

Cygwin 1.7.34+

对于使用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域。
  • %HPOSIX样式的Windows主目录。请注意,对于db_home:设置,这仅在前面的斜杠后才有意义,例如db_home: /%H/cygwin
  • %_由于使用空格和TAB字符分隔模式,因此文件名中的空格必须为%_(下划线)。
  • %% 百分比字符。

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

  1. windows用户的主目录设置为与Windows主目录相同的目录,通常是%USERPROFILE%或的形式C:\Users\$USERNAME。当然,Cygwin将Windows目录转换为POSIX样式。

  2. cygwin仅限AD:用户的主目录设置为cygwinUser辅助类的cygwinHome属性中给定的POSIX路径。另请参见“ cygwin模式”一节

  3. unix仅限AD:用户的主目录设置为posixAccount辅助类的unixHomeDirectory属性中给定的POSIX路径。另请参见“ Unix模式”一节

  4. desc用户的主目录设置为SAMIX或AD中用户描述属性中XML相似的home =“ ...” XML设置中提供的POSIX路径。有关详细说明,请参见“ desc模式”一节。

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

db_home: windows

Cygwin 1.7.33或更早版本

对于使用这些Cygwin的33年7月1日或更早的版本,更新到最新版本的Cygwin,并删除以前使用/etc/passwd/etc/group文件,再看看上面的步骤。

否则,请按照以下这些较旧的步骤进行操作。

首先,为HOME设置Windows环境变量,该变量指向您的用户个人资料:

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

现在,我们将/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


7
-d真的很慢。如果仅需要当前用户,则可以使用-c代替:sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben

Ben是正确的,您只需通过指定-c即可为当前用户添加一个条目。但是,如果您这样做,Cygwin将显示????? 列出共享文件系统上的文件时,用户和组的名称,因为在域或本地计算机上没有其他用户和组的记录。
Christopher

1
我可以建议在措辞上做一个小的更改:而不是“现在,使用新的$ HOME路径更新Cygwin / etc / passwd文件”,我建议“现在,我们将使用以下命令更新Cygwin / etc / passwd文件”我们刚刚创建的HOME变量。” 非常感谢
Robert

使用-d,需要几分钟(我在5分钟后就杀死了)的时间才能完成。所以我已经用-c重新运行了。一切都满足我的需求。
bartosz.r 13-10-17

1
@Samuel我添加了一个解释,以阐明上述目的mkgroup
Christopher

30

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

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

这只是使用此主目录启动本地外壳程序。这就是我想要的。我不会远程访问它,所以这对我有用。


其次,这是因为我无法在开发机器中更改家庭环境变量。
德庆2014年

@WernerCD我只是要警告,当与本机Windows应用程序进行交互时,这可能会产生意想不到的后果。Windows应用程序将继续在旧位置查找HOME。一个示例就是Gvim,它将在旧的Windows %HOME%位置维护单独的vim配置,而Cygwin vim使用$HOME您声明的新路径。
Christopher

太棒了... 5年后,我喜欢它,因为“工程”非常简单,足以让Cygwin相对新手(例如我)使用和理解。顺便说一句,在C:\ Users \ <您的用户名> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo中放置.bat文件的快捷方式意味着您可以在上下文相关(右键单击)菜单中转到Send-> Cygwin。资源管理器(并在任意位置打开终端,并在需要的地方设置〜/)。
麦克啮齿动物

19

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

c:/Users /home none bind 0 0

如今,这是正确的方法。其他答案已过时。
ceving 2014年

@ceving是否在任何地方都有记录?
Asad Saeeduddin '16

10

更改您的HOME环境变量。

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


1
这也将更改所有Windows应用程序的HOME环境变量。
暴徒

非常真实 但是,您拥有哪些使用HOME变量的Windows应用程序?我有EmacsW32和...。Cygwin。自从我首先安装Emacs以来,cygwin的家也在那里。
Michael Paulukonis 09年

1
这样与/ etc / passwd不会冲突吗?如果未设置环境变量,它将默认为/ etc / passwd的HOME吗?如果没有冲突,它将默认设置为/ etc / passwd,则似乎是一个完美的设置:我正在用拇指驱动器运行Cygwin,这都是为了避免在工作时必须征得安装许可,因此我拥有Unix-例如口袋里的环境,只有Windows框可用时,我才能使用它。在工作中,我将有我的工作计算机的主目录,在其他地方,我可以在thumbdrive上有一个主目录。
iconoclast 2012年

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。用Google搜索错误消息,找不到任何内容,在cygwin网站上找不到任何内容。我使用来自cmd.exe的cygwin,而不是bash.exe,但两者均存在问题。

我终于意识到/ etc / passwd中的主目录优先于$ HOME环境变量。我简单地重新运行了'mkpasswd -l> / etc / passwd'并更新了主目录,现在ssh一切正常。

对于具有sysadmin经验的linux类型来说,这可能是显而易见的,但对于那些主要使用Windows的人来说,这有点晦涩。


1
/ etc / passwd中的主目录不优先于所有目录。但是,在远程登录或使用ssh时,它用作HOME目录路径的主要来源。请参阅Cygwin常见问题解答cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher

2

我碰巧使用了cygwin捆绑在一起的cwRsync(用于Windows的Cygwin + Rsync),但是我找不到/ 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更改为更安全的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.