man -f 查看命令的简介
file 查看文件时类型(简介)
#ELF是一种二进制文件,不能直接打开
stat 查看文件的三个时间

#win跟Linux的文件编码方式不同,所以文件不互通,如果想要该win的文件可以dnf -y install dos2unix(一个win的文本跟Linux文本转换的工具)在不同格式之间的转换
#用vim则更方便 在扩展模式下 直接输入 ":ff=dos"
iconv -f gb2312 windows.txt -o windows1.txt  
#将windows10上文本默认的编码ANSI(GB2312)转换成UTF-8
iconv -f utf8 -t gb2312 windows1.txt -o windows11.txt
#UTF-8的文本转换成GB2312的win格式
#win的文本二进制是 回车加换行两个字符,Linux里是回车加换行是一个字符ascii里 '\n'

通配符

[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

*匹配不了隐藏文件

echo file[C-E].txt
fileC.txt filed.txt fileD.txt filee.txt fileE.txt
#显示不是按照ASCII码中C-E的顺序,而是按照小大小大的顺序表示的a,A,b,B,c,C这个顺序

touch ./.{a..z} 创建26个.开头的隐藏文件
#如果touch一个已有的文件 则默认刷新文件 的三个时间戳
#不能用touch配合通配符创建文件 比如 touch [:lower:] 这不可以!!
#ls -a * 只显示当前目录的非隐藏文件
#ls -a 显示当前目录的全部文件
#rm -rf .[^
].txt (意思就是删除当前目录所有.开头的除了非隐藏的且.txt结尾所有文件,即删除所有非隐藏文件)
#rm -rf ./.* (也可删除全部的隐藏文件,利用相对路径,删除当前目录下的所有.开头的文件,即删除所有隐藏文件)

练习

1、显示/etc目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录列表
# ls  /etc/*/i*[0-9]*[a-z]
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录列表
#ls /etc/*/[0-9]*[^0-9]
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录列表
#ls /etc/[^[:alpha:]][[:alpha:]]*   不对!!!!!
4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录列表
#ls   /etc/rc[0-6]*
5、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录列表
#ls /etc/[mnrp]*.conf
6、只显示/root下的隐藏文件和目录列表
#ls -d /root/.*       (不加 -d  表现出来的差别很大 )
7、只显示/etc下的非隐藏目录列表
#ls -d  /etc/*/    (如果没有最后一个/ 则表示/etc/下的所有文件,而加了/则只表示/etc/下的所有目录)(***因为就目录结构来讲"a/b/c"这表示a目录下的b目录下的c文件,而如果/a/b/c/则代表c也是个文件夹下面也可以有文件***)
(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a,/testdir/dir1/y/b
#mkdir -pv /data/testdir/dir1/{x,y}/{a,b}
(2) 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a, /testdir/dir2/x/b
#mkdir -pv  /data/testdir/dir2{x/{a,b},y}
(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
#mkdir -pv /data/testdir/dir{3,4,5/{6,7}}

cat -A 显示不可见字符

mkdir是 如果想创建 /a/b/c/d/e/f 如果f的上级目录不存在 则创建不成功
如想创建此格式需加 -p选项 mkdir -pv /a/b/c/d/e/f/g

因root权限过大,很多命令自带 -i提示 (即覆盖前提醒) 比如cp mv rm
即root的cp命令是别名 cp=cp -i 如果cp文件前不想被提示则 \cp -av(屏蔽别名)

rename 能实现批量改名 (个人测试不成功!)

练习

如何拷贝一个文件夹的所有文件 cp -av . /data (拷贝当前目录的所有文件到/data下)(.表示当前目录)
如何删除文件夹里的隐藏文件 rm -rf .[^.]* 或者删除父目录(不可以用rm -rf .的方式删除,因为文件夹里默认自带 . .. 的文件)
如何删除文件夹里的所有文件 rm -rf * .[^.]
(第一个*,是所有非隐藏文件,第二个是所有隐藏文件)
#更快的方法是直接删除文件夹

inode

ELP文件系统,文件储存逻辑
每个分区可以分成两部分 一个为节点表 ,一个为数据
节点表里主要描述了一些元数据信息  权限 uid gid  指针 等信息
直接指针 间接指针等
#目录就是存放了目录里面的文件名字 inode 编号
#一个指针指向一个块文件(block),一个快文件为4KB(不满4KB也占用一个快文件)
#直接指针只有12个  ,即48KB以下的数据可以被直接指针寻找到
#间接指针不直接指向文件,间接指针指向一个指针快,一个指针快存储1024个指针,即最多储存4MB数据
#三重间接指针最多可储存4GB数据,四重间接指针最多储存4TB数据
 df -i 即可查询分区的节点表信息

软硬链接

!硬链接本质是给一个文件取多个名字
ln  /etc/issue  /root/aba
#在/root/下创建一个aba的文件,aba的文件实际是/etc/issue的硬连接
ll /etc/issue  /root/aba 
-rw-r--r-- 2 root root 26 Jan 30 20:28 /etc/issue
-rw-r--r-- 2 root root 26 Jan 30 20:28 /root/aba
# 第一个2 就是链接数 ,如果删了源文件,那么也不会影响此文件,此文件的大小和源文件相同
#为什么删除源文件 此文件还可以打开,个人理解是,创建了一个硬链接之后,磁盘空间并没有增加,而是在节点表里增加了一个指针,指向硬链接的文件夹,文件夹里多了一个inode编号(与源文件相同),删除源文件的时候,因为有相同的inode编号文件(可能名字不同),所以实际磁盘并没有变化,只有最后一个inode编号的文件被删除后,inode编号消失,磁盘空间才会被标记,下次文件写入此区域即被覆盖
不能跨分区创建硬链接
文件夹不能创建硬链接
硬链接的元数据信息和源文件信息相同


软链接ln -s  
软链接权限信息和文件大小和源文件不同,文件大小为源文件的名字的大小
软链接的节点编号与源文件不同,链接数也不增长
如果源文件被删除,则软链接也会失效 
!!创建软链接如果使用相对路径, 是相对于原文件的路径,而非相对于当前目录建链接的目标的相对路径
软链接支持跨分区,支持对文件夹创建软链接
!!思考:软链接是不是向别名一样?


#绝对路径
ln -s /data/dir /data/dirlink
#相对路径

!!!!!!删除软链接时候注意别删除软链接下的"/"  !!!!!!
cd /data
ln -s ../data/dir /root/dirlink
rm -rf /data/dirlink #删除软链接本身,不会删除源目录内容
rm -rf /data/dirlink/ #删除源目录的文件,不会删除链接文件
(删除软链接时 rm-rf/data/dirlink/ 跟 /data/dirlink差别天差地别千万注意!!!!!)
在ls查看文件的时候浅蓝色的一般就是软链接

如果该一个软链接所指向文件夹的信息 例 chown -R dachui:dachui /root/haha
如果这样敲改的只是软链接本身的元数据信息 正确应该 chown -R dachui:dachui /root/haha/ #一定要带一个"/" 就像删除时候 不加"/"删除的也只是软链接本身一样

#查看链接文件指向的原文件
readlink /data/dirlink



进程


/proc下运行的是内存中的程序,ls /proc/会看到一堆数字,那些数字就是进程的PID,用ps aux 就可以查看正在运行的进程 第二排的数字就是程序的PID
ps aux
查看当前所有运行的进程
root      25225  0.0  0.1  25336  4000 pts/0    S    10:41   0:00 bash
#查看想要查看的进程的PID
ll    /proc/25225/
#根据PID进到proc目录下的找到PID对应的进程
lrwxrwxrwx. 1 root root 0 Mar 26 10:42 exe -> /usr/bin/bash
#exe软链接对应的文件就是程序的真实路径

echo $$  可以查看当前SHELL的PID
  ll /proc/$$/fd  #fd(file descriptor)文件描述符
                                              #0标准输入
                                              #1标准输出
                                              #2标准错误(提示)
  

```bash

touch不能清空文件内容,只能刷新文件时间
>标准输出重定向可以
echo > 一个文件 会留一下一个换行 并不是完全清空文件

 ```bash
 如果想要几个命令的结果都重定向到一个文件中
 可以先把一个命令的结果重定向到文件中,之后的命令>>(追加)带到文件中
 也可以用()的方式把几个命令括起来,在统一追加到文件中

(ls ; hostname ;whoami ;echo hello) &> nbnb
cat nbnb
anaconda-ks.cfg
nbnb
centos8
root
hello

例子
[root@centos8 ~]#ls /data /xxx > /data/all.log 2>&1 
[root@centos8 ~]#ls /data /xxx 2> /data/all.log 1>&2 
[root@centos8 ~]#ls /data /xxx &> /data/all.log 
[root@centos8 ~]#ls /data /xxx 2>&1 > /data/all.log 
ls: cannot access '/xxx': No such file or directory 
#最后一个执行结果和前几个不一样

重定向

标准输出重定向
2>标准错误重定向
&>标准输出,标准错误重定向
<标准输入重定向

追加至
<<EOF #多行追加,多行重定向
#多行追加的好处:减少磁盘I/O操作
缺点:不能及时保存,需要全部写完才可保存,如果退出(崩溃),则正在追加的内容不与保存
| 管道 # CMD1|CMD2 (CMD1的标准输出传给CMD2的标准输入)
如想CMD1的标准错误,标准输出全部传给CMD2,用下面的格式
CMD1 |& CMD2

tr

echo  hahahaoighw  |tr 'a-z' 'A-Z'
HAHAHAOIGHW
#把小写转化成大写
echo ghioav08bn30h8g  3uy0n bjpwbag | tr -d vng 
hioa08b30h8 3uy0 bjpwba
#删除输入里的 "v,n,g" 并输出
tr -d abc <xxx.txt
#把xxx.txt文件里的 abc符号删除
echo "thissss is      a text linnnnnnne." | tr -s ' sn'
this is a text line.
#压索 '空格 s n' 这三个字符
tr -dc '[:alnum:]'  </dev/urandom |head -c 6
#去6为字幕加数字组合的随机字符(在tr命令里可以调用"通配符",但这是命令本身自带的,并不是真正的通配符,所以和通配符写法不同.少了一个[])

rev 可以倒叙显示输出的内容
tee 可以实现重定向的同时在将结果输出到终端上
CMD1 | tee 需要重定向的位置 |CMD2 (可以没有|CMD2)

练习:


 将1、/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
   #  tr 'a-z' 'A-Z' < /etc/issue.net  >/tmp/issue.out
   2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
   #  who | tr 'a-z' 'A-Z' >/tmp/who.out 
   3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:Hello, I am 用户名,The system version is here,please help me to  check it ,thanks! 操作系统版本信息 
   #  mail -s help root <<EOF
      i am `whoami`
      can you help help me ?
      the issue is `cat /etc/issue` 
      EOF

   4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开 
   #  ls /root |tr -s  ' \n' ' ' 
   5、计算1+2+3+...+99+100的总和 
   #  seq -s + 1 100 |bc
       5050
   6、删除Windows文本文件中的回车字符 ,即“\r” 
   #  tr -d '\r'   < test.txt  >zczc.txt
   #  file test.txt zczc.txt 
      test.txt: ASCII text, with CRLF line terminators
      zczc.txt: ASCII text
   #  文件属性已经发生改变

   7、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
   #   echo xt.,l 1 jr#4mn 2 c*/fe 3 uz 4 |tr -dc ' 0-9'
   #      1 4 2  3  4
   8、将PATH变量每个目录显示在独立的一行 
   #  echo $PATH |tr ':' '\n'
   9、将指定文件中0-9分别替代成a-j 10、将文件/etc/centos-release中每个单词(由字母组成)显示在独立一行,并无空行
   #  cat /etc/centos-release |tr ')\n' ')' |tr ' ' '\n'
      CentOS
      Linux
      release
      8.1.1911
      (Core)
   #此文件的最后一行隐藏了一个换行,所以第一个tr 先把隐藏的换行替换掉,第二个tr在吧空格替换成 换行   



当创建一个用户时,用户的ID为1000+ (centos6为500+)
  rootUID为0              1000以前为系统进程ID 
  ID  命令可以查看用户的ID信息



 /etc/passwd  #用户账号信息
 #格式为 用户名:密码:UID:GID:描述:家目录:shell类型

 /etc/shadow  #用户口令信息及其相关属性(密码)
 #格式为 用户名:
 密码(经过哈希算法加密,算法为sha512):
 密码更改日期(自1970年起)
 密码再过多久可被变更:
 密码强制变更倒计时:
 密码到期前提醒(默认一周):
 密码过期几天锁定:
 自1970.01.01日起,账号还有多少天失效

 /etc/gruop   #组及其属性信息 
 格式 群组名称:就是群组名称 
 群组密码:通常不需要设定,密码是被记录在 /etc/gshadow 
 GID:就是群组的 ID 
 以当前组为附加组的用户列表(分隔符为逗号) 

 /etc/gshadow #组口令信息及其相关属性(一般不设密码)
 格式 群组名称:就是群的名称 
 群组密码:  
 组管理员列表:组管理员的列表,更改组密码和成员 
 以当前组为附加组的用户列表:多个用户间用逗号分隔 



账号管理

getent   命令用来查看系统的数据库中的相关记录
#相当于cat库文件 还可以查看一些其他的数据库
id       查看用户UID GID 附加组ID
useradd  创建账号有一堆很长的选项
usermod  修改账号的一些权限,同样一堆选项
userdel  删除账号
passwd   修改账户密码 passwd -e 强制下次登入更改口令
groups   查看用户属于那些组
groupmems组成员查看,管理(附加)组成员关系
chown    修改文件或文件夹所有者,所属组 #chown dachui:dachui  /home/dachui
#此方法略危险 建议用FCAL 控制属性
chmod     修改文件的权限  
#chmod +x  xxx   对xxx文件的所有人增加执行权限(省略了a)

setfacl  设置FACL权限     #个人觉得facl 比chmod好,因为权限只是对特定用户改变,不影响全局用户
getfacl  查看FACL权限
#ACL只影响USER GROUP 对OTHER无效
例子:
root@ubuntu18:/data# setfacl -m u:dachui:rwx  /data/hgoa.txt
root@ubuntu18:/data# getfacl hgoa.txt 
# file: hgoa.txt
# owner: root
# group: root
user::rwx
user:dachui:rwx
group::---
mask::rwx
other::---
setfacl -b hgoa.txt #清空hgoa.txt的facl权限(-x 清楚某个用户 -b清除文件全部acl权限)
还可以通过FACL设置mask权限,mask权限限制了用户的权限不能超过mask,mask影响除了user,other之外的所有人



 gpasswd  改组密码.修改附加组成员关系 用处不大#
 newgrp   临时却换主组            用处不大 #
 chage    修改账户的各种密码策略  用处不大 #
 chfn     修改账户描述信息        用处不大 #
 chsh     修改用户shell           用处不大 #
 chgrp    修改文件主组            用处不大 #
 chattr   对指定的文件保护,防止删除修改,追加,移动 -i 只能追加 -a
 lsattr   查看文件的attr属性       
 
 useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
#创建一个叫apache的用户,这是一个系统用户-r ,他的UID是48 -u , 他的shell类型是nologin -s 他的家目录是/var/www -d 对于他的描述是Apache -c

#给文件夹X权限代表着文件夹里没有x权限的文件保持不变,所属组,所有者,其他,中有一类有x权限的即给这个文件的所有人x权限
例子: chmod -R a+X  /data/

Umask

新建的文件或者文件夹的权限由UMASK决定 比如
umask
0002
touch  bcbc.txt 
ll bcbc.txt
-rw-rw-r--. 1 dachui dachui  0 Mar 28 19:54 bcbc
#因为umask是002 所以新建出来的文件就是 002 -666 = 664 (如果是单数则+1)
#                   新建出来的文件夹就是002-777 = 775 

用户账号的默认配置

/etc/default/useradd
#此文本就是创建用户的默认配置
/etc/skel/
#新建用户的家目录的文件即是从此文件夹复制的
/etc/login.defs
创建用户的一些默认策略
#经测试,ubutun创建用户时如不加 -m 选项 则不会自动创建用户家目录

文件夹内的文件能否被删除,取决于操作者对文件夹有什么样的权限 ,如果操作者对该文件夹有x,w两个权限即可删除文件夹内的此文件即使对被删除的文件没有任何权限(也不是所有者,所属组)
#因为表面上是在删除文件,可实际上文件在磁盘的位置都没有改变.改变的是文件夹的元数据(指向文件的"指引"被删除了,文件被标记成可覆盖)文件实际上没有动位置,删除的时候改变的是文件夹元数据的"指引",所以需要文件夹的x,w两个权限而不需要对文件的权限

账号切换

su   不完全切换,切换之后不会切换环境信息,不会切换之目标家目录
su - 完全切换,环境变量还留有前一个用户的信息,且会跳转到家目录
su -c 'getent shadow '
#切换root执行命令,然后退出 (蛮方便的一个选项)
su - dachui -c  'touch bvbv.txt'
root@ubuntu18:~# ll /home/dachui/bvbv.txt 
-rw-rw-r-- 1 dachui dachui 0 Mar 28 11:11 /home/dachui/bvbv.txt
#快速的在大锤的家目录里创建一个元数据是大锤的bvbv文件
如果把一个用户的shell类型改成nologin 或者false 用户就无法登入
#usermod -s /bin/false  dachui 


#不重要
suid:作用于二进制可执行程序,当用户执行此程序时,将会临时继承此程序所有者的权限
sgid:1)作用于二进制可执行程序,当用户执行此程序时,将会临时继承此程序所属组的权限
作用于目录(文件夹),当用户在此目录下创建新文件时,文件的所属组会自动继承父目录的所属组
stikcy:作用于目录,用户只能删除自已的文件
#suid=4 sgid=2 stikcy=1  且只能作用在二进制的可执行文件上,不可作用在脚本上

练习

1. 创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为"Gentoo Distribution"
#useradd -s /bin/csh  -G bin,root -c  'Gentoo Distribution' gentoo

2. 创建下面的用户、组和组成员关系
名字为webs 的组
用户nginx,使用webs 作为附加组
#groupadd webs ; useradd -G webs nginx
用户varnish,使用webs 作为附加组
#useradd -G webs varnish
用户mysql,不可交互登录系统,且不是webs 的成员,nginx,varnish,mysql密码都是
magedu
#useradd -r -s /sbin/nologin mysql
#vim passwd
  nginx:magedu
  varnish:magedu
  mysql:magedu
#chpasswd <passwd 

文件系统

windows一般用文件NTFS系统
Linux常用的文件系统ext4 ,xfs等
以上说的权限只是针对于Linux的ext4 等文件系统
对于文件权限来说这不是Linux的特色,而是Linux的文件系统的特色

练习

1. 当用户docker对/testdir 目录无执行权限时,意味着无法做哪些操作?
#无法进入,修改,对里面的内容进行任何操作(连LL都看不到文件的权限)
2. 当用户mongodb对/testdir 目录无读权限时,意味着无法做哪些操作?
#无法查看文件,但是可以修改拷贝,删除目录里的文件
3. 当用户redis 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除?
#?????????
4. 当用户zabbix对/testdir 目录有写和执行权限时,该目录下的只读文件file1是否可修改和删除?
#????
5. 复制/etc/fstab文件到/var/tmp下,设置文件所有者为tomcat读写权限,所属组为apps组有读写
权限,其他人无权限
[root@20:18:50 tmp]116# chown tomcat:apps fstab 
[root@20:18:50 tmp]117# chmod 620 fstab 
[root@20:19:06 tmp]118# ll fstab 
-rw--w----. 1 tomcat apps 709 Mar 28 20:16 fstab
6. 误删除了用户git的家目录,请重建并恢复该用户家目录及相应的权限属性
#rm -rf /home/docker/
#cp -rv /etc/skel /home/docker
#la  /home/docker
.bash_logout  .bash_profile  .bashrc

练习

1. 在/testdir/dir里创建的新文件自动属于webs组,组apps的成员如:tomcat能对这些新文件有读写
权限,组dbs的成员如:mysql只能对新文件有读权限,其它用户(不属于webs,apps,dbs)不能
访问这个文件夹
2. 误将 /bin/chmod 文件的执行权限删除,如何恢复?
 root@ubuntu18:/data# chmod -x /bin/chmod 
 root@ubuntu18:/data# ll /bin/chmod 
 -rw-r--r-- 1 root root 59608 Jan 18  2018 /bin/chmod
 setfacl -m u:root:rwx /bin/chmod
 root@ubuntu18:~# chmod a+x /bin/chmod
 root@ubuntu18:~# setfacl -b /bin/chmod 
 root@ubuntu18:~# ll /bin/chmod
 -rwxr--r-x 1 root root 59608 Jan 18  2018 /bin/chmod*

vim

插入模式下
/           搜索内容
w           相当于Windows里的CTRL+S 及时保存
r           读取文件内容到当前光标位置  # : etc/passwd 
x           保存退出=wq
X           对文件加密  可以把机密的文件加密,如密码表等 
!           执行命令 # :!date     
r!          把命令结果输出到光标位置
set nu      显示行号   setnonu   不显示行号
set ai      自动对齐
set ic      忽略大小写
set ff      文本格式转换 # :set ff=dos  set ff=unix 
set cul     下划线功能
y           复制 # :2+5 y
p           粘贴
d           删除 # :7,15 d
%           全文 #  :%d
s           搜索替换  
   # : 1,5s/haha/baba/g  把haha替换成baba(g是整行的   haha 个替换成baba)    也可以把"/"换成其他符号如 "@"  "#"

命令模式
ZQ          不保存退出 #等于 :q!
ZZ          保存退出   #等于 :wq 





可以在家目录里创建一个 .vimrc的配置文件,把默认的vim配置放里


seq 100 | sort -R |head -1 #一百个数字取一个随机数