目录与路径

目录的相关操作

  • cd:切换目录。
  • pwd:显示当前目录。
    • pwd -p会显示实际的工作目录,而非链接文件本身的目录名。
  • mkdir:建立一个新目录。
    • mkdir -m 744 test可以建立test文件夹,且权限是744.
    • mkdir -p test1/test2/test3可以递归的建立文件夹,而不用一层一层的建立。
    • 常用-m选项,不用-p,因为-p建立的文件夹文件权限和umask有关。
  • rmdir:删除一个空目录。

    • 使用-p可以递归删除空文件夹。
    • 只能删除空文件夹,但是不能删除里面还有文件或者目录的文件夹。

      关于执行文件路径的变量:$PATH

  • 使用echo $PATH来查看PATH。

  • 只有在PATH路径下的命令才能直接输入执行。
  • PATH="${PATH}:/root"这样可以将root加入到PATH中。
  • usr指的是UNIX System Resource。
  • 本目录.最好不好放在PATH中。

    文件与目录管理

    文件与目录的查看:ls

    ls命令参数的意义
    在默认情况下已经将ll设置成为ls -l的意思。

    复制,删除与移动:cp(copy)、rm(remove)、mv(move)

  • cp(复制文件或者目录)

    • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
    • -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。若复制时什么也没加就会复制过来最根本的文件,而不是快捷方式。
    • -f:覆盖已经存在的目标文件而不给出提示。
    • -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
    • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
    • -r:递归复制,此时将复制该目录下所有的子目录和文件。
    • -l:不复制文件,只是生成链接文件。
    • -u:目标文件比源文件新才复制文件,或者是没有源文件才会复制文件。(有差异才会复制)文件才会复制文件。(有差异才会复制)
    • 还可以同时将多个文件复制到一个目录中。最后面一定是目录。
  • rm(删除文件或目录)
    • -i 删除前逐一询问确认。
    • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
    • -r 将目录及以下之档案亦逐一删除。非常危险
  • mv(移动文件与目录,或重命名)

    • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。backup
    • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。inquiry
    • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。force
    • -n: 不要覆盖任何已存在的文件或目录。
    • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。update

      获取路径的文件名与目录名称

  • basename /etc/sysconfig/network就会出现network这个文件。

  • dirname /etc/sysconfig/network就会出现sysconfig这个文件夹。

    文件内容查看

    直接查看内容

  • cat

  • tac
  • nl

    可翻页查看

  • more

  • less

    数据截取

  • head

  • tail

    非纯文本文件

  • od

    修改文件时间或创建新文件

  • touch

    • 修改时间(modification time,mtime):当文件的内容数据发生变化时,就会修改时间。
    • 状态时间(status time,ctime):当文件的状态改变时,就会更新该时间。比如权限与属性的改变。
    • 读取时间(access time,atime):当该文件的内容被读取时就会更新该读取时间。
    • ls -l读取出来的时间时修改时间。如果要查看状态时间就要加上 —time=ctime。查看读取时间就要加上—time=atime。ls -l --time=atime /etc/tmp/config.cfg
    • 使用touch后面要是加文件名且文件名存在,就会将mtime,atime,ctime都更改为现在的时间。要是加文件名但是文件不存在,就会创建新的文件。
    • 使用touch -d "2 days ago" filename可以将文件的mtime和atime改为两天前,但是不能更改ctime。
    • 最常用的还是建立空白文件,和使用touch改mtime和atime到现在。

      文件与目录的默认权限和隐藏权限

  • 在Linux传统的ext2,ext3,ext4文件系统下,可以使用chattr设置隐藏属性(不可修改,文件拥有着也不可修改的属性),使用lsattr来查看。但是在Centos7中利用xfs作为默认的文件系统,没有支持所有的chattr。

    文件默认权限:umask

  • umask就是制定目前用户在建立文件或目录时候的权限默认值。

  • 使用umask的第一位是特殊权限,后三位分别是用户,组用户,其他用户的rwx权限 。或者使用umask -S
  • 若用户建立为文件则默认没有可执行x权限,即只有rw项目,也就是普通文件的默认权限是666;若用户建立的是目录文件,则需要x权限来进入目录,即拥有rwx权限,也就是目录文件的默认权限是777
  • 注意umask的数字指的是该默认值需要减掉的权限。如果umask是022的话,建立一个普通文件,他的默认权限是666,则建立文件时需要666的权限减去022的权限。

    建立文件时:(-rw-rw-rw-)-(——-w—w-)==> -rw-r—r— 建立目录时: (drwxrwxrwx) - (d——w—w-) ==> drwxr-xr-x

  • 使用umask 222可以将umask的值设置为222。

  • root用户的umask是为022,一般身份用户的umask是002。
  • umask的设置可以参考/etc/bashrc里面的内容。

    文件隐藏属性

  • chattr命令只能在ext2,ext3,ext4的Linux传统文件系统完整生效。在Centos7.x上的xfs文件系统仅支持部分参数。

  • chattr 配置文件隐藏属性。
    • 格式:chattr [+-=] [ASacdistu] name
    • a 这个文件将只能增加数据,而不能删除和修改数据,且只 有root用户可以使用该命令。
    • i 可以让一个文件不能删除,改名,设置链接,也没法写入或新增数据,对于系统安全性有很大的帮助。但是只有root用户才能设置。
    • xfs系统仅支持Aadis选项。
  • lsattr 显示文件隐藏属性

    • -a:将隐藏文件的属性也显示出来。
    • -d:如果接的是目录,那么仅列出目录本身的属性而非目录内的文件名。
    • -R:连同子目录的数据也一并列出来。
    • 如果某天一个文件即使root也无法修改,那么就得看一下这个文件的隐藏属性了。

      文件特殊权限:SUID,SGID,SBIT

      SUID

      当s出现在文件拥有者的x权限上时,就被称为Set UID,简称为SUID的特殊权限。-rwsr-xr-x
  • SUID仅对二进制程序文件有效。

  • 执行者对于该程序需要具有x的可执行权限。
  • 本权限仅在执行该程序的过程中有效。
  • 执行者将拥有程序拥有者的权限。
  • 比如有一个文件/usr/bin/shadow这个文件对于mgh来说只有执行的权限,但是这个文件的权限是-rwsr-xr-x。由于有SUID权限,故mgh在执行该文件时就可以暂时拥有该文件拥有者的权限rws,故mgh可以对该文件进行修改。

    SGID

    当s出现在该文件的用户组的x权限位置时称为Set GID,简称为SGID的特殊权限。-rwx--s--x
    注意SGID可以用在文件上,也可以用在目录上。

  • 当SGID设置在文件上有如下功能:

    • SGID对二进制程序有用。
    • 程序执行者对于该程序来说,需要具备x权限。
    • 执行者在执行该程序时会具备该程序用户组的支持。

      例如: -rwx--s--x. 1 root slocate 40496 date /usr/bin/locate -rw-r-----. 1 root slocate 2222222 date /var/lib/mlocate/mlocate.db 如果有mgh用户想要查看mlocate.db由于没有r权限所以他没办法直接查看,但是locate命令执行的时候会去/var/lib/mlocate/mlocate.db中查找数据,所以当mgh用户使用locate命令的时候由于在locate命令的用户组这个有s权限,且mgh有x权限,所以可以在执行locate时拥有locate命令的用户组权限。然后去读取mlocate.db的数据,就可以有r的权限。

  • 当SGID用在目录上的时候,将会有以下用途:

    • 用户对于此目录需要具有r与x的权限,该用户能够进入此目录。
    • 用户在此目录下的有效用户组将变成该目录的用户组。
    • 用途:若此用户在此目录下具有w的权限(可以新建文件),则用户新建立的文件,该文件的用户组与此目录的用户组相同。

      例如: 假设系统中有两个帐号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同在一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 如果/srv/ahome的权限是770,属性是drwxrwx---. 2 root project 6 date /srv/ahome且alex和arod都在project小组中,此时他们两个都可以在/srv/ahome创建文件。假设在该目录创建文件为abcd,查看abcd的文件权限发现是-rw-rw-r--. 1 alex alex 0 date abcd文件的拥有者和小组均为alex,此时arod对于这个文件来说是其他人没有修改的权限。虽然可以删除他,但是不能编辑。不是我们预期的结果。 如果我们能对/srv/ahome设置SGID权限chmod 2770 /srv/ahome,此时alex在/srv/ahome下建立的1234文件的权限为-rw-rw-r--. 1 alex project 0 date 1234,就是我们想要的结果。

SBIT

当t出现在目录的其他人的权限位置的时候被称为Sticky Bit,简称为SBIT。drwxrwxrwt

  • SBIT仅对目录有效。
  • 当用户对此目录具有w,x的权限,即具有写入的权限;
  • 当用户在该目录下建立文件或目录时,只有root和文件拥有者才有权力删除该目录。

    S与T

    当给用户给SUID、SGID、SBIT时,虽然给上了这三个权限,但是没有给到x的权限。这三个特殊权限都需要文件或者目录有x的权限,要是没给的话,就会出现S与T。

SUID、SGID、SBIT的权限设置

SUID=4、SGID=2、SBIT=1
假如给一个文件的权限改为-rwsr-xr-x,由于s在用户的x权限上,所以是SUID。有两种方法更改:

  1. 因此可以采用chmod 4755 filename来进行更改。
  2. 采用符号法,即chmod u=rwxs,go=rx filename如果在该文件的基础上再添加SGID和SBIT权限就需要chmod g+s,o+t filename

    观察文件类型

    file filename就可以查看文件的类型。例如有ASCII文件,可执行文件,data文件。

    命令与文件的查找

    脚本文件的查找

  • which which [-a] command

    • -a 将所有由PATH目录中可以找到的命令都列出,而不是第一个被找到的命令。
    • 这个命令是根据PATH这个环境变量所规范的路径,去查找执行文件的文件名。
    • 有的命令which查找不到,这是因为有的命令时bash内置的命令,可以通过type来查找。

      文件的查找

      find速度慢,影响硬盘性能;一般使用whereis或是locate检查,因为whereis只找某些特定的文件夹。locate则是利用数据库来进行查找。
  • whereis [-bmsu] 文件或者目录名

    • -l:可以列出whereis查询的几个主要目录。
    • -b:只查找二进制格式的文件。
    • -m:只查找在说明文件manual路径下的文件。man命令
    • -s:只查找source文件。
    • -u:查找不是上面三个项目中的其他特殊文件。
  • locate / updatedb locate [-ir] keyword
    • -i:忽略大小写的差异。
    • -S:输出locate所使用的数据库文件的相关信息。
    • -r:后面可以接正则表达式的显示方式。
    • 也可以使用locate passwd这种,只要有文件的完整路径中有passwd就可以查出来。
    • locate查找从数据库中查找,这个数据库每天自动更新一次。手动使用updatedb更新,updatedb读取/etc/updatedb.conf里面的设置,然后再查找系统硬盘内的文件并更新/var/lib/mlocate内的数据库文件。
  • find find [PATH] [option] [action]
    • 与时间有关
      • -mtime n/+n/-n:n为数字,如果n为0,就是今天往前24小时修改过的文件。+1代表24小时往前修改过的文件。-4代表了4天前那一刻到目前修改过的文件。
      • -newer:find file -newer file,用来判断那个文件更新。
    • 与用户有关
      • -uid n
      • -gid n
      • -user name
      • -group name
      • -nouser :查找文件的拥有着不在/etc/passwd中的。
      • -nogroup :查找文件的拥有着不在/etc/group中的。当系统内某个用户删除掉了,但是文件没删掉,就可以使用这个命令来查找。
    • 与文件与权限有关
      • -name filename
      • -size [+-]50k
      • -type TYPE
      • -perm mode: -perm 4755查找所有权限为4755的文件。
      • -perm -mode:-perm 4755查找所有权限囊括了4755的文件。比如权限为4775的文件也可以被查找出来。
      • -perm /mode:-perm 7000查找包含任一权限的文件。比如权限为4000的文件也可以查找出来。只要含有—-s—s—t中任何一个就可以查找出来。
    • 额外的操作
      • -exec command:例如:find / -perm /7000 -exec ls -l {} \;就是先执行find / -perm /7000然后将结果放在{}中,执行ls -l操作。其中的-exec``\都是固定的不能更改。
      • 找出 /etc 底下,文件大小介于 50K 到 60K 之间的档案,并且将权限完整的列出 (ls -l):

find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功