标签:linux
文件特殊权限suid、sgid、stick_bit可以用file命令查看文件类型
[root@localhost ~]# file /etc/passwd
/etc/passwd: ASCII text
[root@localhost ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
一、特殊属性之suid
suid=set uid,只针对二进制文件,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限,passwd命令就设置有这种权限
语法: chmod [u] [+,-] s 二进制文件
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd
可以看到,在文件拥有者的执行位上出现为小s而不是x,(如果U没有执行权限会显示大S)所以说passwd这个程序是具有SUID权限的。我们在修改用户密码的时候,用的就是passwd这个命令,在linux下面,用户密码是存储在/etc/shadow这个文件里面的。首先查看一下/etc/shadow这个文件的权限:
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1207 5月 14 16:45 /etc/passwd
可以看到只有root具有写权限,可以往shadow文件中写入数据,其他用户连查看的权限都没有。那我们平时是怎么修改密码呢?没错,就是和SUID有关。当我们使用passwd命令时,就获得了passwd的所有者即root的权限,进而可以对shadow文件进行写入操作。使用SUID需要满足几点:
1.SUID只对二进制文件有效
2.调用者对该文件有执行权
3.在执行过程中,调用者会暂时获得该文件的所有者权限
4.该权限只在程序执行的过程中有效
我们可以用例子来解释下:
[root@localhost ~]#ls -ld /root #可以看到其他用户是没有任何权限的
dr-xr-x---. 3 root root 4096 5月 9 18:12 /root
[root@localhost ~]#su - luo #切换到普通用户
[luo@localhost ~]$ id
uid=500(luo) gid=500(luo) 组=500(luo) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[luo@localhost ~]$ ls -l /root/ #显示权限不够
ls: 无法打开目录/root/: 权限不够
[root@localhost ~]#chmod u+s /bin/ls #用root给ls命令加上suid权限
[root@localhost ~]# su - luo #再切换到普通用户luo
[luo@localhost ~]$ ls -l /root/ #可以看到已经可以临时拥有了root权限
总用量 24
-rw-------. 1 root root 974 4月 22 00:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 12360 4月 22 00:06 install.log
-rw-r--r--. 1 root root 3482 4月 22 00:05 install.log.syslog
二、特殊属性之sgid
SGID即Set GID的缩写,它出现在文件所属组权限的执行位上面,它对普通二进制文件和目录都有效。当它作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。当SGID作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录有SGID权限,则该用户在这个目录下新建立的文件都是属于这个目录所属的组,旧文件不受影响。
语法: chmod [g] [+,-] s 二进制文件或目录
例如:
[root@localhost ~]# mkdir /tmp/333/ #在tmp目录下新建个333目录
[root@localhost ~]# chmod 777 /tmp/333/ #权限设置为777
[root@localhost ~]# chmod g+s /tmp/333/ #给333目录加上sgid权限
[root@localhost ~]# ls -ld /tmp/333/ #可以看到已经设置了sgid权限
drwxrwsrwx. 2 root root 4096 5月 14 19:53 /tmp/333/
[root@localhost ~]# su - luo #切换到普通用户luo
[luo@localhost ~]$ touch /tmp/333/2.txt #用普通用户新建个2.txt文件
[luo@localhost ~]$ ll !$ #可以看到新建文件的所属组为root
ll /tmp/333/2.txt
-rw-rw-r--. 1 luo root 0 5月 14 19:53 /tmp/333/2.txt
三、特殊属性之sbit
SBIT即Sticky Bit,它出现在其他用户权限的执行位上,它只作用于目录(文件也行,没有意义)。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以,也可以理解为防删除位,一个文件是否可以被某用户删除,主要取决于该文件所在目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新文件。如果希望用户能够添加文件但同时不能删除该目录下的其他用户(root除外)的文件,则可以对其父目录增加该权限.
语法:chmod [o] [+,-] t 目录
例如:
[root@localhost ~]# ll -d /tmp/333/
drwxrwxrwx. 2 root root 4096 5月 14 19:53 /tmp/333/
[root@localhost ~]# chmod o+t /tmp/333/ #给/tmp/333/目录加上sbit权限
[root@localhost ~]# ll -d /tmp/333/
drwxrwxrwt. 2 root root 4096 5月 14 19:53 /tmp/333/
[root@localhost ~]# su - luo #切换到普通用户luo
[luo@localhost ~]$ touch /tmp/333/3.txt #新建个文件3.txt
[luo@localhost ~]$ su - gen #切换到普通用户gen
密码:
[gen@localhost ~]$ cd /tmp/333/
[gen@localhost 333]$ ll
总用量 0
-rw-rw-r--. 1 luo root 0 5月 14 19:53 2.txt
-rw-rw-r--. 1 luo luo 0 5月 14 20:08 3.txt
[gen@localhost 333]$ rm 3.txt #/tmp/333/ 目录权限是777,但是设置了sbit权限,用普通用户gen是不能删除其它用户创建的文件的
rm:是否删除有写保护的普通空文件 "3.txt"?y
rm: 无法删除"3.txt": 不允许的操作
软链接和硬链接
Linux 系统中有软链接和硬链接两种特殊的“文件”。
软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。
硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。
创建方法都很简单:
创建软链接: ln -s [源文件] [目标文件]
创建硬链接: ln [源文件] [目标文件]
inode
当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个 文件的 inode。 Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息
用实例来解释下软链接和硬链接
[gen@localhost tmp]$ touch AAA BBB #新建两个文件AAA BBB
[gen@localhost tmp]$ ll -i
261147 -rw-rw-r--. 1 gen gen 0 5月 14 20:34 AAA
261148 -rw-rw-r--. 1 gen gen 0 5月 14 20:34 BBB
[gen@localhost tmp]$ ln AAA AAAhard #给AAA创建一个硬链接AAAhard
[gen@localhost tmp]$ ll -i
261147 -rw-rw-r--. 2 gen gen 0 5月 14 20:34 AAA
261147 -rw-rw-r--. 2 gen gen 0 5月 14 20:34 AAAhard
261148 -rw-rw-r--. 1 gen gen 0 5月 14 20:34 BBB
注意在创建链接前,AAA显示的链接数目为1,创建链接后
1.AAA和AAAhard的链接数目都变为2。
2.AAA和AAAhard的inode号是一样的,都是261147。
3.AAA和AAAhard显示的文件大小也是一样。
可见进行了ln命令的操作结果:AAA和AAAhard是同一个文件的两个名字, 它们具有同样的索引节点号和文件属性,建立文件AAA的硬链接,就是为 AAA的文件索引节点在当前目录上建立一个新指针。你可以删除其中任何一个,如rm AAA,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除
尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处:
1.不允许给目录创建硬链接。
2.不可以在不同文件系统的文件间建立链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了
再给BBB创建个软链接
[gen@localhost tmp]$ ln -s BBB BBBsoft
[gen@localhost tmp]$ ll -i
261147 -rw-rw-r--. 2 gen gen 0 5月 14 20:34 AAA
261147 -rw-rw-r--. 2 gen gen 0 5月 14 20:34 AAAhard
261148 -rw-rw-r--. 1 gen gen 0 5月 14 20:34 BBB
261149 lrwxrwxrwx. 1 gen gen 3 5月 14 20:42 BBBsoft -> BBB
可以看到链接数目不变都是1,大小是不一样的,一个是0 一个是3 ,而且BBBsoft前面显示是l文件,软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接
区别:
**1.硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,不能跨分区,不能作用于目录,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
2.在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
3.链接数目是不一样的,软链接的链接数目不会增加;
4.文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而软链接显示的大小与原文件就不同了
5.软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。
当然软链接也有硬链接没有的缺点:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;软链接要系统分配额外的空间用于建立新的索引节点和保存原文件的路径**
find命令
find是个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。
find命令的格式:find [-path……] -options [-print -exec -ok]
path:要查找的目录路径。
print:表示将结果输出到标准输出。
exec:对匹配的文件执行该参数所给出的shell命令。
形式为command {} \;,注意{}与\;之间有空格
ok:与exec作用相同,
区别在于,在执行命令之前,都会给出提示,让用户确认是否执行
options常用的有下选项:
-name:按照名字查找
-perm:安装权限查找
-user:文件属主来查找
-group:文件所属组来查找
-nogroup:查找无有效所属组的文件
-nouser:查找无有效属主的文件
-type:按照文件类型查找
-mtime 按修改内容时间查找
-size 按大小查找
例如:
根据名字查找
[root@localhost ~]# find /etc -name ‘host*‘ #在/etc目录下查找host开头的文件或目录
/etc/hosts
/etc/hosts.allow
/etc/host.conf
/etc/hosts.deny
按权限查找
[root@localhost ~]# find /tmp -perm 777
/tmp/BBBsoft
[root@localhost ~]# ll /tmp/BBBsoft
lrwxrwxrwx. 1 gen gen 3 5月 14 20:42 /tmp/BBBsoft -> BBB
按文件类型查找
[root@localhost ~]# find /tmp -type l
/tmp/BBBsoft
按时间查找
find . -mtime -2 -type f #在当前目录下查找两天内被更改过的文件
find . -mtime +2 -type f #在当前目录下查找两天前被更改过的文件
按大小查找
[root@localhost ~]# find /tmp -size +1k -type f #在/tmp目录下查找大于1K的文件
[root@localhost ~]# find /tmp -size -1k -type f #在/tmp目录下查找小于1K的文件
/tmp/AAAhard
/tmp/BBB
/tmp/333/3.txt
/tmp/333/2.txt
/tmp/yum.log
/tmp/AAA
查找后执行命令
$ find . -name ‘del.txt‘ -ok rm {} \; #在当前目录下查找名字为del.txt的并删除,删除前提示确认
$ find . -name ‘aa.txt‘ -exec cp {} {}.bak \; #在当前目录下查找名字为aa.txt 并备份为aa.txt.bak
linux和windows互传文件
实现的方式有很多种 securecrt xshell 可以通rz sz 命令,或者xshell自带的 xftp工具实现(在 xshell上点击新建文件传输),windows下可以用winscp工具实现,走的都是22端口,下图是xshell自带的xftp工具
标签:linux
原文地址:http://blog.51cto.com/13736286/2116570