Xiaopei's DokuWiki

These are the good times in your life,
so put on a smile and it'll be alright

User Tools

Site Tools


it:linux:file

文件管理

ln

删除某些符号链接时, 可能出现此问题. 问题是由 ln -s 时源路径使用相对路径造成, 可先 mv 源路径, 符号链接就能删除了.

stat

display file or file system status

$ stat foo
  File: `foo'
  Size: 6         	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 6427601     Links: 1
Access: (0444/-r--r--r--)  Uid: (  501/   genee)   Gid: (   10/   wheel)
Access: 2012-05-14 09:16:14.653344221 +0800
Modify: 2012-05-14 09:16:27.198468744 +0800
Change: 2012-05-14 09:19:23.747469294 +0800
atime是在读取文件或者执行文件时更改的。
mtime是在写入文件时随文件内容的更改而更改的。
ctime是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改的。

file

检查文件类型

$ file foo.php 
foo.php: PHP script, ASCII text

rmdir

删除空目录. rm empty_dir 会报错

删除过时文件: tmpreaper (tmpwatch)

cp

-v

verbose 显示拷贝过程

--parents

use full source file name under DIRECTORY. 拷贝文件时, 连同文件的直系父级目录一同拷贝

cp --parents /tmp/test/test/test/foo bar/

拷贝后, bar 目录下将会建立目录 /tmp/test/test/test/,以及文件 foo

ls

查看文件属性

-l

# 使用 ls -l 查看文件的所有信息
$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 57388 2010-08-17 14:57 /bin/gzip
# 使用 ls -ld 查看目录的所有信息
$ ls -ld /bin/
drwxr-xr-x 2 root root 4096 2011-09-03 14:42 /bin/
字段 意义
-rwxr-xr-x 该文件的类型和模式(3组权限位)
1 该文件的链接数目
root 属主 UID
root 属组 GID
57388 以字节为单位的大小
2010-08-17 14:57 最后被修改的日期
/bin/gzip 名称

其他重要选项

-a 包括隐藏文件
-t/-tr 按时间排序/逆序(默认时间为 mtime(modify time)
-u 显示 atime(access time)
-c 显示 ctime(change time)
-F 以区分目录和可执行文件的方式(附加*/⇒@)显示文件名
-R 递归显示
-h 文件大小方便人类阅读

glob

Noun: A lump of a semiliquid substance: “thick globs of cheese”.
Program: Globbing pathnames.

Wildcard Matching

  • A string is a wildcard pattern if it contains one of the characters '?', '*' or '['. Globbing is the operation that expands a wildcard pattern into the list of pathnames matching the pattern. Matching is defined by:
    1. A '?' (not between brackets) matches any single character.
    2. A '*' (not between brackets) matches any string, including the empty string.
  • Character classes
    An expression “[…]” where the first character after the leading '[' is not an '!' matches a single character, namely any of the characters enclosed by the brackets. The string enclosed by the brackets cannot be empty; therefore ']' can be allowed between the brackets, provided that it is the first character. (Thus, “[][!]” matches the three characters '[', ']' and '!'.)
  • Ranges
    There is one special convention: two characters separated by '-' denote a range. (Thus, “[A-Fa-f0-9]” is equivalent to “[ABCDE‐ Fabcdef0123456789]”.) One may include '-' in its literal meaning by making it the first or last character between the brackets. (Thus, “[]-]” matches just the two characters ']' and '-', and “[–0]” matches the three characters '-', '.', '0', since '/' cannot be matched.)
  • Complementation
    An expression “[!…]” matches a single character, namely any character that is not matched by the expression obtained by removing the first '!' from it. (Thus, “[!]a-]” matches any single character except ']', 'a' and '-'.)
  • One can remove the special meaning of '?', '*' and '[' by preceding them by a backslash, or, in case this is part of a shell command line, enclosing them in quotes. Between brackets these characters stand for themselves. Thus, "[[?*\]" matches the four characters '[', '?', '*' and '\'.

chmod

改变权限

suid

[root@www ~]# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd
  • SUID 权限仅对二进位程序(binary program)有效, 对脚本无效;
  • 运行者对於该程序需要具有 x 的可运行权限;
  • 本权限仅在运行该程序的过程中有效 (run-time);
  • 运行者将具有该程序拥有者 (owner) 的权限。

用途

在管理多人使用的开发服务器中, 有时会用到 suid 让无 sudo 权限的用户执行某些命令. 步骤如下:

  1. 用 shell 脚本包装命令
    something.sh
    #!/bin/sh
    tailf /var/log/syslog
  2. 修改脚本权限
    chown root:root something.sh
    chmod 4755 something.sh
  3. 但 suid 不可用于脚本, 所以还需用 bin 包装它
    runscript.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    int main()
    {
       setuid( 0 );
       system( "/path/to/script.sh" );
     
       return 0;
    }
  4. 编译
    gcc runscript.c -o runscript
  5. 修改 bin 权限
    chown root:root runscript
    chmod 4755 runscript
  6. 这样普通用户就能运行 runscript 来执行本无权限的命令了

参考: setuid on shell scripts

sgid

文件
[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate
  • SGID 对二进位程序有用;
  • 程序运行者对於该程序来说,需具备 x 的权限;
  • 运行者在运行的过程中将会获得该程序群组的支持!
目录

共享目录问题

  • 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
  • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

Sticky Bit/SBIT

[root@www ~]# ls -ld /tmp
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
  • 只针对目录有效
  • 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

8进制权限代码

100w
010r
001x

助记语法

u+x属主添加写入权限
ug=rw,o=r属主、属组读写,其他人读
ug=srx,o=设置文件的setuid和setgid,且仅属主、属组读写
g=u使属组与属主权限相同
  • u,UID
  • g,GID
  • o,other

umask

指定要剥夺的权限(异或)。没有办法强制用户拥有某个特定的umask值,但可在.profile中提供合适的默认值。

Examples

共享目录问题

例子摘自: 鸟哥的 Linux 私房菜 -- 文件与目录管理

假设系统中有两个帐号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。请问该目录的权限配置应为何?请先以传统权限说明,再以 SGID 的功能解析。

答: 修改用户组/目录组都简单, 但在设置过组后测试, 会发现新建文件组不对的问题:

[root@www ~]# su - alex       <==先切换身份成为 alex 来处理
[alex@www ~]$ cd /srv/ahome   <==切换到群组的工作目录去
[alex@www ahome]$ touch abcd  <==创建一个空的文件出来!
[alex@www ahome]$ exit        <==离开 alex 的身份
 
[root@www ~]# su - arod
[arod@www ~]$ cd /srv/ahome
[arod@www ahome]$ ll abcd
-rw-rw-r-- 1 alex alex 0 Sep 29 22:46 abcd
# 仔细看一下上面的文件,由於群组是 alex ,arod并不支持!
# 因此对於 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
[arod@www ahome]$ exit

这时就需要加入 SGID 的权限! 测试:

[root@www ~]# chmod 2770 /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxrws--- 2 root project 4096 Sep 29 22:46 /srv/ahome
 
测试:使用 alex 去创建一个文件,并且查阅文件权限看看:
[root@www ~]# su - alex
[alex@www ~]$ cd /srv/ahome
[alex@www ahome]$ touch 1234
[alex@www ahome]$ ll 1234
-rw-rw-r-- 1 alex project 0 Sep 29 22:53 1234
# 没错!这才是我们要的样子!现在 alex, arod 创建的新文件所属群组都是 project,
# 由於两人均属於此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件!
it/linux/file.txt · Last modified: 2013/08/19 07:22 (external edit)