setfacl 与chmod的区别

linux提供了一套相当安全的文件管理方式,它包括文件的权限、属性、ACL还有SELINUX

1、权限
在说文件权限之前,我们得知道它们是什么?
先在终端中输入ls -l /root,root是系统管理员的HOME目录,它下面有一个目录Desktop和文件root.如下所示:
-rw——- 1 root root 8 9月 28 13:36 root
drwxr-xr-x 2 root root 4096 9月 26 21:42 Desktop
你会发现除了名字外前面还有一堆信息,那这些信息都是些什么意思呢?我先拿目录那行来说明
drwxr-xr-x 2 root root 4096 9月 26 21:42 Desktop

再说权限之前先看root和root这两个参数,他们的意思是该目录属于用户root(第一个root)和用户组root(第二个root),这两个不一定非要相同,可以通过命令修改
修改所属用户:chown haha Desktop 将Desktop的拥有者改成用户haha
修改所属组:chgrp heihei Desktop 将Desktop的群组拥有者改成用户组heihei

然后是文件的三大基本权限:读r、写w、执行x
对于文件的意义:
r:可读取文件的实际内容,如读取文本文件的文字内容等;
w:可以新增、修改该文件的内容,但不能删除该文件;
x:该文件可以被系统执行
对于文件夹的意义
r:可以读取文件夹里列表的权限,比如用ls命令将该目录下的内容列出来
w:可以新建、删除、重命名、移除文件夹下的文件和文件夹
x:进入一个文件夹的权限,如使用cd进入一个文件夹

说完这两个参数和三大权限后,那前面那十个参数就好理解了
drwxr-xr-x 这十个字母可以分成1+3+3+3四个小组。
第1组:代表该文件的类型,这里是d,代表目录
-代表普通文件,d代表目录,l代表链接文件
b代表读取数据以段为单位的设备,如硬盘
c代表读取数据以字符为单位的设备,如键盘、鼠标 
第2组:代表文件拥有者对该文件的权限,这里是rwx,意思是root对该Desktop具有读r、写w、执行x的权限
第3组:代表文件所在组对该文件的权限,这里是r-x,意思是用户组root下面其他非root用户对Desktop具有读r、执行x权限,没有写w权限就用-表示
第4组:代表文件拥有者所在组外其他组及成员对该文件的权限,这里也是r-x,意思是其他组的成员对Desktop读、执行权限,没有写w权限
既然时权限,当然可以修改,修改的命令是chmod,有下面三种方法
数值模式:chmod 764 Desktop,修改完权限变成drwxrw-r–
赋值模式:chmod u=rwx,g=rw,o=r Desktop,修改完权限变成drwxrw-r–
增删模式:chmod u+x,g-x,o-x,修改完变成drwxr–r–


2、特殊权限
SUID、SGID、SBIT

先用ls -l命令看一下下面几个文件或目录的信息:
-rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd
-rwx–s–x. 1 root slocate 35612 8月 24 2010 /usr/bin/locate
drwxrwxrwt. 24 root root 20480 10月 14 17:55 /tmp
会发现在文件拥有者,文件拥有者所在组,其他组的权限x的位置上被s或者t取代了,这是什么?

先来看看他们的作用:
SUID:当用户执行具有x权限的二进制文件时拥有此文件所有者的权限
SGID:当用户执行具有x权限的二进制文件时拥有此文件所在组的权限,另外也可以对目录设置此权限
SBIT:当用户对某个目录具有w和x权限时,在该目录下建立的文件和目录只有该用户和root用户才可以删除
听着很绕,举个例子:
比如普通用户用passwd命令去修改密码,而密码是存在/etc/shadow文件中,而普通用户是无法修改这个文件的,也就无法把新密码保存进来。
但事实的结果是普通用户是可以修改密码,并且保存到/etc/shadow这个文件中的。

它的流程是这样的:
一、先看下/usr/bin/passwd这个文件,也就时命令passwd。
-rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd
发现这个文件的拥有者是root,并且其他组的权限为r-x,也就说普通用户对其具有r和x的权限
二、既然普通用户对其具有执行权限,因此当普通用户执行这条命令时,由于s这个权限的存在,那么在执行过程中会暂时获取root的权限
三、由于只有root才可以修改/etc/shadow文件,而在此次执行过程中已经得到了root用户的支持,因此密码会顺利得写入到这个文件中

那么,怎样才能增加这种权限呢?
可以参照第1节权限,使用chmod命令修改,命令如下:
SUID 4 SGID 2 SBIT 1
chmod 6777 这就添加了SUID和SGID权限,就是在原有权限的前面加了一个6

另外,还有可能出现rwsrwsrwt大写的情况,变成rwSrwSrwT,出现这种情况是因为用户不具备文件的x权限,而又用上面的命令强加了特殊权限
这就矛盾了,因为这三个权限的基础是用户对其有有x权限,现在连x权限都没有,那有sst这个权限又有什么用呢!


3、属性
名称大小:文件名、 大小,这两个最好理解了就是文件名字和占用空间大小
所属属性:拥有者、拥有组,如1中所述
时间属性:mtime、ctime、atime
mtime:最近一次文件内容变化时间,是具体内容变化,不是属性、权限变化,ls显示的结果就是mtime
ctime:最近一次文件状态变化时间,这里就是属性、权限那些变化时的时间
atime:最近一次读取文件时间,如用cat去读取文件的时候


4、隐藏属性
隐藏属性就是给文件设定特殊的标记使其达到某种需求

废话不多说,先看下是什么东西,再说它有什么用!
查看隐藏属性的命令是:lsattr 文件名,命令很好记忆,ls应该知道是干嘛的,attribute就是属性的意思,lsattr = ls + attribute
lsattr file 
—-ia——- file
这就显示了文件file的隐藏属性,可以看到有13个隐藏属性,这个文件只有i、a这两个隐藏属性,其他属性没有就用-代替。

隐藏属性是需要文件系统的支持的,我的机子是ext4格式,上面有15个隐藏属性,在网上搜了下,没找到关于ext4隐藏属性的说明,因此上面这个例子是用
鸟哥的ext3格式下的例子,ext3格式下只有13个隐藏属性。

那么这个i、a是什么意思呢?
i代表不能对这个文件进行删除、改名、链接、写入资料等等。
a代表这个文件只能增加数据不能删除和修改数据。

增加隐藏属性的命令如下:
chattr +a file 修改后file就具有了a这个隐藏属性。
其他属性我也不太清楚,鸟哥的书上面只列出了几个,谁有ext4上面的隐藏属性资料希望能发给我份,谢谢了!

5、ACL
ACL全称Access Control List,访问控制列表,这个东西又是什么?

在传统的权限控制中,比如ls -l diary,diary是我的一个文件。 
-rw-rwx— 1 root root 2 10月 1 15:16 diray
对于某个文件和目录,它的使用者大致分为三类:文件拥有者、文件拥有者所在组、其他组这三大类,这样分就有一个很大的局限性,就是不能个性化。

举个例子:我有本日记,我现在想让我的密友看,但是别的朋友不可以看
在这里,“日记”就是文件或者目录,“我”就是“日记”的所有者,文件所在组这里没提到,你可以认为你是内心的独白,“朋友”就是其他组
在传统权限控制中,我想让我的密友看,那么就必须给其他组r权限,这样一来,不光是密友可以看见了,所有朋友都能看见
那我能不能只让密友看,而不让其他人看呢!当然可以,这就是ACL目的所在,可以针对单个用户、群组进行特别权限控制。

先来看下传统的权限:ls -l diary
-rw-rwx—. 1 root root 2 10月 1 15:16 diary
再来看下默认情况下ACL的设定:getfacl diary
# file: diary //文件名
# owner: root //文件拥拥有者
# group: root //文件拥所在组
user::rw- //文件拥有者对其的权限,::之间为空代表文件所有者
group::rw- //文件所在组对其的权限,::之间为空代表文件所在组
other::— //其他组成员对其的权限,::之间为空代表其他组成员

和ls -l的显示结果一模一样,只是换了种显示方式,现在来设置只让密友查看:setfacl -m u:miyou:r– diary
设置完就只有密友可以查看,别的人就看不了了,再来看下ACL:getfacl diary
# file: diary 
# owner: root 
# group: root 
user::rw-
user:miyou:r– //多出了这一项 
group::rw- 
mask::rwx //又冒出了这么个东东
other::— 
mask的作用是这样的:它规定了开放权限的范围,比如我现在把umask设置为r–,而我还想让我的密友可以修改我的日记,于是密友变成了rw-,由于我最大只开放了r权限,即使把密友设置为rw-也只能有r权限,w无效。

EXECL批量转CSV 生成1 2 3 。。。 文件名

Sub SaveToCSVs()

Dim fDir As String

Dim wB As Workbook

Dim wS As Worksheet

Dim fPath As String

Dim sPath As String
Dim i, j, k As Integer

fPath = “\\data\www\fs_audit\joom\allFiles\”

sPath = “\\data\www\fs_audit\joom\”

fDir = Dir(fPath)

Do While (fDir <> “”)

If Right(fDir, 4) = “.xls” Or Right(fDir, 5) = “.xlsx” Then

On Error Resume Next

Set wB = Workbooks.Open(fPath & fDir)

‘MsgBox (wB.Name)

For Each wS In wB.Sheets

wS.SaveAs sPath & i & “.csv”, xlCSV
i = i + 1

Next wS

wB.Close False

Set wB = Nothing

End If

fDir = Dir

On Error GoTo 0

Loop

End Sub

让php support jpeg

需要重新编译
‘./configure’  ‘–prefix=/usr/local/php7’ ‘–with-curl=/usr/local/curl’   ‘–with-gettext’ ‘–with-iconv-dir’ ‘–with-mysql-sock’ ‘–with-kerberos’ ‘–with-libdir=lib64’ ‘–with-libxml-dir’ ‘–with-mysqli’ ‘–with-openssl’ ‘–with-pcre-regex’ ‘–with-pdo-mysql’ ‘–with-pdo-sqlite’ ‘–with-pear’  ‘–with-xmlrpc’ ‘–with-xsl’ ‘–enable-fpm’ ‘–enable-bcmath’ ‘–enable-libxml’ ‘–enable-inline-optimization’ ‘–enable-gd-native-ttf’ ‘–enable-mbregex’ ‘–enable-mbstring’ ‘–enable-opcache’ ‘–enable-pcntl’ ‘–enable-shmop’ ‘–enable-soap’ ‘–enable-sockets’ ‘–enable-sysvsem’ ‘–enable-xml’ ‘–with-fpm-user=www’ ‘–with-fpm-group=www’
再下载安装jpeg
wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz tar xzvf jpegsrc.v9b.tar.gz ./configure –prefix=/usr/local/libjpeg –enable-shared –enable-static make && make install
再去php/ext/gd编译安装
cd /usr/local/src/php-5.6.30/ext/gd #gd的源码目录 /usr/local/php/bin/phpize #生成configure命令 ./configure –with-php-config=/usr/local/php/bin/php-config –with-png-dir –with-freetype-dir –with-jpeg-dir=/usr/lib64 -with-zlib-dir –with-gd make && make install#编译gd
重启php-fpm即可

samba 使用GIT出现权限拒绝问题 无法拉取

In my case, it looks like Git (v 2.6.3) tried to create its own read/write permissions on the Samba drive. This would prevent the pack files and/or objects from getting written (unpack error)

remote: error: unable to write sha1 filename ./objects/pack/pack-<some_hex_string>.pack: Permission denied
remote: fatal: cannot store pack file
error: unpack failed: index-pack abnormal exit
To z:\git\<repo name>
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs

I went back and forth on trying to fix. Finally, since I had control of the Samba machine, I added a line to the samba drive config, which says “inherit permissions = yes”. I restarted Samba and tried to push. It worked!

This worked for me since I’m the only person using the Samba server. For others, you may have the play around with “force directory mode” or “force create mode”. You can find the man pages for those over here:

https://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/AccessControls.html

samba中文乱码

可以试下下面的方法

vi /etc/samba/smb.conf
根据locales的设置,修改该文件:
1. 如果locale是zh_CN.UTF-8,做如下设置:
  display charset = UTF-8
  unix charset = UTF-8
  dos charset = UTF-8
2. 如果locale是zh_CN.GBK或zh_CN.gb2312,做如下设置:
  display charset = cp936
  unix charset = cp936
  dos charset = cp936
  重启samba:service samba restart

opcache编译

1
2
3
4
cd /usr/local/src/ZendOptimizerPlus-master
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

#编辑 php.ini,追加如下内容:

1
2
3
4
5
6
7
8
9
zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

#重启php-fpm

1
service php-fpm restart