当前位置:首页 > Windows程序 > 正文

cygwin的坑坑洼洼

2021-05-26 Windows程序

弄清楚cygwin的哪些操作或者特性会跟windows本身的冲突,以便更好的使用cygwin管理Windows Server系统。

环境

操作系统:WindowsServer2012 x64

Cygwin版本: CYGWIN_NT-6.2 TEST 2.0.2(0.287/5/3)2015-05-0817:00 x86_64 Cygwin

Cygwin核心概念Windows安全概述

Windows NT系统包含了一个基于ACL的复杂的安全模型,cygwin默认情况下在支持它们的文件系统(通常会是NTFS)上将Win32文件的属主和权限映射为ACL。拥有Administrator权限的用户可以修改文件的属主。

在Windows安全模型中,几乎所有的object都是安全的。这里的object指的是文件、进程、线程、信号量等。每一个object都有一个叫做SD(security descriptor)的数据结构,SD包含了所有的权限管理信息。

SD包含下面几个要素:

Flags which control several aspects of this SD. This is not discussed here.

object属主的SID

object属组的SID

一个ACE(Access Control Entries)列表,称为DACL(Discretionary Access Control List)

另外一个ACE列表,称为SACL(Security Access Control List)

每个ACE都包含一个SID(Security IDentifier)。SID是所有用户、组、计算机、AD域的唯一标识符。与POSIX中的UID/GID不同的是,SID是跨计算机、域全局唯一的。

例如:一个计算机“foo”的SID为:

S-1-5-21-165875785-1005667432-441284377

该计算机“foo”中的一个用户“johndoe”的SID为:

S-1-5-21-165875785-1005667432-441284377-1023

格式:

第1段恒为S;第2段为SID结构的版本号,目前为1;

第3、4段代表SID的类型或类别,计算机和域永远以S-1-5-21开始;

接下来的3段是一个32位的值,代表一个计算机系统的96位唯一标识;

用户的SID是在计算机SID的后面加上一个编号,这个编号称为RID(relative identifier),当用户创建的时候,RID就跟着一起创建出来了。

对域而言,也是类似的结构。 
SID of a domain “bar.local”:

S-1-5-21-186985262-1144665072-740312968

SID of a user “johndoe” in the domain “bar.local”:

S-1-5-21-186985262-1144665072-740312968-1207

注意:虽然上面的johndoe用户在计算机中存在,又在域中存在,但是他具有不同的SID,因此这两个SID并不是同一个账户。不同的SID,就是不同的账户。

从Cygwin 1.7.34版本之后,cygwin就会自动的将Windows中的SID翻译成POSIX的UID、GID。Windows系统中的RID会被转换成/etc/passwd、/etc/group中的UID、GID。

ACE包含3个部分:

ACE类型:allow ACE或deny ACE

32位的权限位

这些权限允许或拒绝的SID

文件权限

cygwin将Windows系统的文件权限实现成POSIX的文件权限,而POSIX文件是以ACL来管理文件权限的。POSIX的文件、目录权限是被mount选项来控制的,默认设置为acl。 
也就是说在默认情况下,/etc/fstab文件内容为:

none /cygdrive cygdrive binary,posix=0,user 00

这说明cygwin会模拟POSIX文件权限,从而可能会导致Windows系统中应用程序的文件权限产生混乱,为了解决这个问题,需要添加noacl参数,将/etc/fatab改为:

none /cygdrive cygdrive binary,user,noacl,posix=000

在D:\(即/cygwin/d)下分别创建3个文件测试一下权限,效果分别如下图所示: 

技术分享

左图为Windows系统中创建的文件的权限,中间为cygwin在默认情况下模拟POSIX文件权限创建出来的文件权限,右图为cygwin添加了noacl参数之后,在cygwin中创建的文件的权限。可以看出,添加noacl参数之后,cygwin将不会模拟POSIX文件权限,在cygwin中创建的文件的权限跟Windows系统的文件权限保持一致。

但是上面的改动仅仅是修改了/cygdrive目录,也就是windows系统中的所有的磁盘(C:、D:、E:、F:等),而cygwin本身的/并未修改,同样会存在上述的权限问题,因此需要一并修改,最终完整的/etc/fatab文件内容如下:

none /cygdrive cygdrive binary,user,noacl,posix=000 D:\cygwin64 / ntfs binary,noacl,override00 D:\cygwin64\bin/usr/bin ntfs binary,noacl,override00 D:\cygwin64\lib /usr/lib ntfs binary,noacl,override00cygserver

cygserver 是为Cygwin作为后台服务运行而设计的,默认安装Cygwin的时候并没有启动它。我们需要打开它,并将它作为Windows的标准服务来安装。

在Cygwin中输入命令:

cygserver-config

按照界面提示进行cygserver的安装,并同意将其安装为服务。

运行该服务:

cygrunsrv --start cygserver

cygrunsrv其实是启动的Windows标准服务cygserver,这个命令也可以在Cmd下这样做: net start cygserver,或者也可以按下按键 Windows+R ,键入 services.msc 回车,找到CYGWI cygwerver服务,并启动之。

查看cygserver服务的状态:

cygrunsrv --qurey cygserver

cygserver的配置文件:

/etc/cygserver.confcygwin命令行工具

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71239.html