我刚刚安装了 Cygwin,bash 提示符中的主目录似乎在我的 Z: 驱动器上。那不是我想要的。
我怎样才能改变这一切?
从 Cygwin 1.7.34 开始,推荐的方法是向 /etc/nsswitch.conf添加自定义 db_home设置。这样做的一个共同愿望是使 Cygwin 主目录等于 Windows 用户配置文件目录。这个设置会做到这一点:
/etc/nsswitch.conf
db_home
db_home: windows
或者,等价地说:
db_home: /%H
如果您希望在这个方案上有所变化,您需要使用后一种形式,例如将 Cygwin 主文件隔离到 Windows 用户配置文件目录的 子目录中:
db_home: /%H/cygwin
对于 windows选项,还有其他一些可供选择的方案以及其他一些 %令牌,您可以使用这些令牌来代替 %H,或者除此之外使用其他令牌。有关详细信息,请参阅 Cygwin 用户指南中的 nsswitch.conf语法描述。
windows
%
%H
nsswitch.conf
如果您在1.7.34之前安装了 Cygwin,或者运行了 Cygwin 的 mkpasswd实用程序以便拥有一个 /etc/passwd文件,那么您可以通过编辑用户在该文件中的条目来更改 Cygwin 主目录。Home 目录是 /etc/passwd.1中用户行中倒数第二个元素
mkpasswd
/etc/passwd
无论采用哪种方式,这都会导致在 shell 启动期间设置 HOME环境变量
HOME
有关这个主题的更多信息,请参见 此常见问题。
脚注:
考虑移除 /etc/passwd和 /etc/group,以使用 新的基于 SAM/AD 的机制代替。
/etc/group
虽然可以通过控制面板简单地设置 %HOME%,但它是 官方不鼓励。它不仅会不经意地覆盖上述机制,而且并不总是有效,例如在通过 cron运行 shell 脚本时。
%HOME%
cron
更改家居环境变量。
在 XP 上,右键单击 My Computer > > Properties > > Advanced > > Environment Variables > > User Variables for > > [ select variable HOME ] > > edit
我碰巧使用了 cwRsync (Cygwin + Rsync for Windows) ,它是 Cygwin 绑定的,我找不到/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 优先的位。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 1.7.34或更高版本的 Cygwin 支持配置如何在 /etc/nsswitch.conf中获取主目录、登录 shell 和 gecos 信息。这在 Cygwin 用户指南部分有详细介绍:
如果您以前创建过 /etc/passwd或 /etc/group文件,那么您需要删除这些文件,并使用新的 Windows Security 模型配置 Cygwin 到 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 dir 设置为 /home/$USERNAME。不过,您可以将其更改为指向所需的任何其他自定义路径。支持的通配符有:
/home/$USERNAME
%D
%_
可以指定预定义的四个命名路径模式之一,以代替路径。
用户的主目录被设置为与 Windows 主目录相同的目录,通常类似于 %USERPROFILE%或 C:\Users\$USERNAME。当然,Cygwin 将 Windows 目录转换为 POSIX 样式。
%USERPROFILE%
C:\Users\$USERNAME
仅 cygwin AD: 用户的主目录被设置为 cygwinUser 辅助类的 cygwinHome 属性中给定的 POSIX 路径。参见 叫做“ Cygwin 模式”的部分。
cygwin
仅 unix AD: 用户的主目录被设置为 posxAccount 辅助类的 unixHomeDirectory 属性中给定的 POSIX 路径。参见 名为“ Unix 模式”的部分。
unix
desc用户的主目录设置为 SAM 或 AD 中用户描述属性中的 home = “ ...”类 XML 设置中给出的 POSIX 路径。有关详细说明,请参阅名为“ Desc 模式”的部分。
desc
以下将使用户在 Cygwin 的主目录与用于 Windows 主目录的目录相同。
对于那些使用 Cygwin 1.7.33或更早的,更新到 最新版的 Cygwin和删除以前使用的 /etc/passwd和 /etc/group文件,然后看到上面的步骤。
否则,按照下面的旧步骤进行操作。
首先,为 HOME 设置一个 Windows 环境变量,指向你的用户配置文件:
现在我们将用刚才创建的 Windows%HOME%变量更新 Cygwin/etc/passwd文件。Shell 登录和通过 ssh的远程登录将依赖于 /etc/passwd来告诉他们用户的 $HOME路径的位置。
ssh
$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 网域控制器获取的,这一点就很重要。
-d
-l
现在,您也可以对组执行相同的操作,但是这并不是必需的,除非您使用的计算机是 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
/cygdrive/c/Users/username
我做了件很简单的事。我不想改变 windows 7的环境变量。所以我直接编辑了 Cygwin.bat 文件。
@echo off SETLOCAL set HOME=C:\path\to\home C: chdir C:\apps\cygwin\bin bash --login -i ENDLOCAL
这只是用这个主目录启动本地 shell; 这就是我想要的。我不打算远程访问这个,所以这对我有用。
Cygwin mount现在支持 绑定方法,该方法允许挂载目录。因此,您可以简单地将以下代码行添加到 /etc/fstab,然后重新启动您的 shell:
mount
/etc/fstab
c:/Users /home none bind 0 0