Linux不靠扩展名来区分文件类型,虽然有扩展名,但只是为了让系统管理员更清晰的知道文件类型而已
硬盘是挂载在/dev/目录下的
主分区最多只有4个,扩展分区只有一个,主分区加扩展分区最多有4个,逻辑分区最多只有22个
Linux必须分区的是/(根分区)、swap分区(交换内存分区),推荐创建的分区是/boot(启动分区,他是分配一定空间,专门让linux启动数据放在这里的原因是,这是为了避免如果都放到根分区里,内存满了,系统都会无法启动)
根节点是linux的最顶层结构,根节点下面包含/boot、/etc、/home等目录,/boot分区、/etc分区等可以是一块单独的硬盘,这跟我们平时见到的硬盘结构是不一样的(也就是说/boot等目录并不是在根目录之下的,他们甚至可能不在同一块硬盘,而Windows每个分区每块硬盘都是独立的,不能互相进入):
Linux每个用户都会有一个目录,用来保存这个用户的专门文件,其中管理员目录是/root目录
linux用户根据命令前是#号还是$符号区分是管理员还是普通用户(也就是我们命令行前面的用户提示)
相对目录是指参照我当前所在位置的目录位置,通常是../xxx/xxx,而绝对路径是从根目录出发的目录,通常是/xx/xxx/xx
rmdir删除目录(目录不能为空)
rm -r(删除目录和文件) -f(强制删除)
cp -r(复制目录) -p连带文件属性复制 -d 如果文件是链接文件,则复制链接属性 -a相当于pdr
mv mv filename/ xxxx 移动目录或者文件,前者参数是文件或者文件夹名,后者是移动到的目录名或者文件名。如果移动到当前文件夹,则可以产生改名操作。
ln 创建一个链接。 -s是软连接,默认是硬链接。软连接是一个新的文件,它的内容指向原文件存储地址(类似于windows的快捷方式)。而硬链接两个文件是同一个文件索引,拥有同样的节点号、一般推荐使用软连接。如果做软连接,原文件的地址一定是绝对路径。
locate xxx搜索文件(模糊搜索,只能搜索文件名),他会从数据库/var/lib/mlocate.db里面去查找,所以速度非常快,如果我们创建了一个新文件,他是不会查找到的。原因是文件创建后会把它的信息放在数据库里,而刚刚创建是不会立马放进去的,所以我们需要使用updatedb来更新数据库。还有一个要注意的是,locate数据库并不是保存所有文件信息的,具体保存哪些目录的文件,可以查看他的配置文件:/etc/updatedb.config。
whereis xx:搜索系统(不能是自己创建的命令)命令所在位置以及帮助文档所在位置 -b(只看执行文件位置) -m(只看帮助文档所在位置)
-which 查看命令的别名以及命令所在位置
find:搜索文件(如:find /xx/ -name aaa,代表我们从/xx/目录下搜索aaa文件),他是可以进行模糊搜索的,我们可以使用’*’(任意通配符)、’?’(替换任意一个字符)、’[]’(替换括号中的任意一个字符)来搜索。我们还可以把-name换成-iname(不区分大小写搜索文件名)、-user root(搜索root用户所属的文件,如果是-nouser<后面不用加参数了>,那么就是搜索没有所有者的文件) 、-mtime +10(搜索十天前修改的文件,-10是十天内,10是十号当天的)、-size 25K(搜索文件大小为25K的,+是大于25K,-是小于25K)、-inum 222(根据文件节点名查找文件)。
我们还可以使用-a(and符号)或者-o(or符号)来使用两个命令多条件查询。例如:find /etc -size +20k -a -size -50k(搜索20-50K大小的文件)。
我们还可以使用-exec xxx(别的能够处理文件结果的命令) {} \;(后面一定要有分号),用来处理搜索到的文件。比如:find /etc -size +20k -a -size -50k -exec ls -lh {} \;(先根据条件搜索,然后列出文件详细信息,记得ls命令前面是没有-号的)
grep [选项] 字符串 文件名:在文件当中匹配符合条件的字符串(也就是在文件中搜索有没有这个字符串,它只要包含了这个字符串,就会列出来,他可以配合正则表达式来使用)。 -i忽略大小写,-v排除指定字符串。
我们可以使用man xxx(命令名字)来查看命令的帮助文档 (只能针对外部命令),而外部命令使用help xxx。我们使用whereis命令来区分这是一个外部命令还是内部命令(外部命令有命令所在的位置)。
我们也可以使用xxx –help来查看xxx命令的帮助文档
我们使用zip命令来压缩和解压zip文件,zip afterzipfilename.zip filename的命令是把filename压缩为afterzipfilename.zip(后面的.zip是可以不带的,因为linux没有文件后缀的概念,加上.zip只是为了提醒这是一个zip文件)。我们使用unzip来解压缩:unzip xxx.zip。
.gz文件的压缩和解压:我们可以使用gzip命令来压缩文件,如gzip filename,压缩后源文件会消失。所以我们可以使用流重定向的方式重新保存源文件:gzip -c 源文件 >压缩文件(这个命令是把源文件压缩为压缩文件,且源文件保留)gzip -r 目录会把一个目录压缩,值得注意的是,他并不会把目录压缩为一个文件,而是会把目录内所有的子文件压缩,然后删除子文件,把压缩后的子文件放在源文件的目录中。所以这样压缩非常不方便。我们使用gzip -d和gunzip来解压文件,gunzip -r是解压目录。
.bz2格式压缩:我们使用命令bzip2 [源文件]来把一个文件压缩为.bz2格式,他是不会保留原文件的。使用bzip2 -k [原文件]来压缩后保留文件。值得注意的是bzip2命令不能压缩目录。
因为linux中上述压缩文件在针对目录的时候不能很好的处理,所以我们可以使用tar命令将压缩文件打包成.tar.gz以及.tar.bz2。下面是一些常用的打包命令:
tar -cvf 打包文件名 源文件:c打包,v显示过程,f指定打包后的文件
打包后可以压缩成任意的压缩文件
tar -xvf 打包文件名:解包
tar.gz相关命令:
tar -zcvf 压缩包名.tar.gz 源文件
解压缩:tar -zxvf 压缩包名.tar.gz
tar.bz2相关命令:
tar -jcvf 压缩包名.tar.bz2 源文件
解压缩:tar -jxvf 压缩包名.tar.bz2
解压重定向:
tar -jxvf 压缩包名.tar.bz2 -C /temp/
压缩多个文件并且重定向:
tar -zcvf /temp/压缩包名.tar.gz 源文件1 源文件2
重点内容仅查看压缩包内容:
tar -ztvf 压缩包名.tar.gz
linux的关机命令:shutdown [选项] [时间]
-c(取消前一个命令) -h(立刻关机) -r(重启)。我们可以使用shutdown -r &,通过’&’符号来让这个命令在后台运行。后面的时间如果为now就是现在执行。我们还可以使用halt(halt是阻止的意思)、poweroff、init 0来关机。使用reboot、init 6来重启。
Linux分6个系统级别:0关机、1单用户、2不完全多用户、不含NFSS服务、3完全多用户、4未分配、5图形界面、6重启。我们可以使用init number切换到相应的系统级别。我们可以使用runlevel来查看系统级别情况,它会列出之前的系统级别以及现在的系统级别(如果是N则代表之前是开机,没有切换系统级别)。我们可以进入/etc/inittab来查看默认系统运行级别
我们使用logout来退出登录
linux中的挂载类似于windows中的分配盘符,只是windows更加智能,一般情况下,linux需要有挂载点。我们可以使用mount查看挂载的设备。mount -a(根据配置文件/etc/fstab的内容,自动挂载。我们在开机的时候也会根据这个文件自动挂载,如果挂载不成功,就会直接启动失败)
mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点。来挂载一个设备,其中-t文件系统用来指定挂载设备的文件系统类型,可以使ext3 ext4、iso9660、vfat(windows下的fat32文件系统),-o是特殊选项,可以指定挂载额外的选项。
我们可以使用umount 文件名或挂载点,来卸载设备。如果出现设备正忙,有可能是你正在这个设备的目录里(系统是不允许你在目录中卸载这个设备的)。我们必须要使用卸载命令,否则下次会读取出错。
我们可以使用w命令来查看登录用户信息。它列出的属性含义如下:
USER (登录的用户名) TTY (登录的终端来源,是远程用户还是本地登录的) FROM(如果是远程用户,则会有IP地址来源) LOGIN@(登录的时间) IDLE(用户闲置时间) JCPU(当前登录终端占用CPU时间) PCPU(当前进程所占用时间) WHAT(正在运行的命令)
who也是查看用户登录情况,只不过它比w命令更加精简
last是查询过去登录的情况,其实是查看/var/log/wtmp文件
lastlog是查看所有用户登录的记录,其实是查看/var/log/lastlog文件
我们可以把alias放入~/.bashrc(前面的~符号是当前用户目录)来保存
别名,不过我们需要重新登录才能然这个文件的修改生效(或者使用source .bashrc来让其立即生效)让其永久生效(用命令行是临时别名)。unalias也是临时删除,如果在配置文档里有,下次还是会生效。
linux命令生效顺序:1.执行用绝对路径或者相对路径执行的命令 2.执行别名命令 3.执行Bash内部命令 4.执行$PATH环境变量定义的目录查找到的顺序第一个命令。
linux编辑器快捷键 ctrl c停止任务执行 ctrl l清屏 ctrl a光标移动到命令行行首 ctrl e光标移动到命令行行尾 ctrl u删除光标所在位置到行首(也就是删除整行) ctrl z(把命令放入后台) ctrl r在历史命令中搜索。
我们使用> >>让输出流重定向(>是覆盖,>>是追加),错误重定向是2>或者2>>。上述的命令只能处理错误或者正确命令的输出重定向,不能同时处理两者情况(我们需要命令错误的时候流能重定向、正确的时候流也能重定向),那么我们可以使用下面的命令:
多命令顺序执行:命令1;命令2(多个命令顺序执行,没有任何关联) 、命令1&&命令2(命令1执行成功,命令2才会执行,命令1执行不成功,命令2不会执行) 、命令1||命令2(命令1执行成功,命令2不执行,命令1执行不成功,命令2不执行,也就是只会执行一个成功的命令,一旦执行,后面的命令就不会执行了)。
wc命令统计给定文件中的字节数、字数、行数。-c 是统计字节数、-l是统计行数、-w是统计字数。
我们可以使用通配符匹配某些命令的参数值,如ls filename*,是匹配filename后面任意的字符, 他会把*号当成任意匹配字符去列出相关的文件信息。下图是更多的Linux匹配方式:
a = "hello";//定义一个变量a
echo a;它输出的是变量a的值
echo '$a';//它输出的是$a
echo "$a";//它输出的是变量a的值hello
a = $(ls);//这里会把ls的命令结果赋值给变量a
不同符号下,代表的意思是不同的,刚刚的代码中单引号里不会对”$”产生特别的作用,而双引号中则会把”$”后面的值当成一个变量。更多的特殊情况请见下表
用户和用户组:
cat /etc/passwd查看所有的用户信息
cat /etc/group查看所有组信息
groupadd xxx添加一个xx用户组
groupmod -n xxx1 xxx把xxx用户组名修改为xxx1。
我们可以使用groupmod -g 668 xxx把xxx组的组编号改成668。
groupadd -g 888 xxx创建一个xxx组,并且编号为888。
groupdel xxx 删除xxx用户组
useradd -g groupname username 创建username用户添加到groupname里面去,并且分组为groupname(如果不指定用户组,且没有跟用户名一样的用户组,那么会创建一个跟用户一样的用户组,并把其放入进去)
useradd -d /home/xxx username创建username的时候指定个人文件夹
usermod -c desc username 添加username的注释为desc。
usermod -l newusername username 把username的用户名修改为newusername。
usermod -g group user把user这个用户放到group用户组里去
usermod -d /home/xxx username把username用户的个人文件夹修改为/home/xxx目录
userdel username 删除用户
userdel -r username删除用户的同时删除用户个人文件
touch /etc/nologin 除了root外的其他用户都不能登录
passwd -l username锁定用户,让其不能登录
passwd -u username解锁用户
passwd -d username清除密码
用户可以属于一个主要组,多个附属组
gpasswd -a username groupname把username用户成为groupname的附属组(注意usermod -g是修改主要组)
用户组创建的文件默认是主要组的,如果想要使用附属组权限来执行,那么需要切换到附属组
gpasswd -d username groupname删除username用户的附属组groupname
usradd username -g group1 -G group2,group3添加用户组username到主用户组group1,附属用户组group2,group3……等。
su username切换用户到username(不加参数是root用户),root用户切换到其他用户,不需要密码,其他用户切换到root或者其他用户需要登录密码。
id username显示username用户的用户组,用户名、用户编号、主要组以及附属组名称和列表。
groups username显示用户组所在的所有组
chfn username设置username用户资料
finger username显示username用户详细资料
Linux各目录的作用:
/ 根目录
/bin 存放必要的命令
/boot 存放内核以及启动所需的文件等
/dev 存放设备文件
/etc 存放系统的配置文件
/home 用户文件的主目录,用户数据存放在其主目录中
/lib 存放必要的运行库
/mnt 存放临时的映射文件系统,我们常把软驱和光驱挂装在这里的floppy和cdrom子目录下。
/proc 存放存储进程和系统信息
/root 超级用户的主目录
/sbin 存放系统管理程序
/tmp 存放临时文件的目录
/usr 包含了一般不需要修改的应用程序,命令程序文件、程序库、手册和其它文档。
/var 包含系统产生的经常变化的文件
1.ifconfig命令用来临时配置IP地址。我们可以使用ifconfig来查看网络信息,也可以使用ifconfig etho0 192.168.0.200 netmask 255.255.255.0来配置网卡的IP地址和子网掩码(他是临时命令,关机或者重启网卡就不行了)
2.service network restart会重启网卡
3.我们可以使用修改网卡或者网络设备文件的方式来配置网络。
网卡保存的目录为:/etc/sysconfig/network-scripts/ifcfg-网卡名
4.我们可以使用hostname来查看主机名,使用hostname xxx来修改主机名为xxx(这个是临时修改的,但是它会立即生效,重启会消失。而且修改后登录名并不会变化,需要重新登录)要想永久更改,编辑/etc/sysconfig/network里面的HOSTNAME即可(他需要重启才能生效,不能立即生效)
5.我们可以通过/etc/resolv.conf来修改dns服务器地址:
nameserver后面的 就是dns地址
nameserver 202.106.0.20
6.ifdown [网卡设备名]禁用某个网卡 ifup [网卡设备名]开启某个网卡
7.netstat查询网络状态
-t 列出tcp协议端口
-u 列出ud协议端口
-n 不使用域名与服务,而使用IP地址和服务端口号
-l 仅列出在监听状态下的网络服务
-a 列出所有网络链接
8. route -n查看路由器列表,或者使用netstat -rn也是可以的
route add default gw 192.168.1.1临时设置网关
nslookup 查看域名对应的DNS服务器名字和IP地址(DNS作用)
ping(探测ip或者域名的网络状况),可以使用-c 次数来指定ping包的次数(如果不指定,则会一直Ping)
我们可以使用telnet [域名或IP] [端口]来远程管理与端口探测命令
traceroute路由路径或者跟踪
wget [下载地址] 下载一个文件
tcpdump命令可以抓取往卡上的数据
-i指定网卡接口
-nn 将数据包中的域名与服务器转换为IP和端口
-X 以16进制和ASCII码显示数据包内容
port指定监听的端口
16.ssh命令:
ssh 用户名@ip 远程管理指定linux服务器
scp [-r] [用户名]@ip:[文件路径] [本地路径] 下载远程主机的文件到本地目录
scp [-r] [本地文件] [用户名]@ip:[上传路径] 上传本地文件到ip主机的上传路径去。
linux软件可以使用源码包(有点是可以查看源代码根据自己的环境编译会更加稳定,缺点是需要自己编译,安装速度满,操作复杂)、二进制包(RPM包、系统默认包,他不能看到源代码,安装简单,只需要命令就可以实现,安装速度快)。
文件安装的时候,可能会出现一些依赖问题(树形依赖<安装A需要先安装B,而B需要先安装C>、环形依赖<安装A需要安装B,安装B需要安装C,安装C需要安装A,这个时候我们可以用一个命令安装所有的软件解决环形问题>、模块依赖<在安装过程中,可能依赖的是一个文件而不是一个软件(通常是以.so.数字结尾的),我们可以通过www.rpmfind.net先查询包含这个文件的软件是什么,安装了这个软件,这个文件自然就有了>)。
rpm命令(安装本地软件):
a. 包全名:操作的包是没有安装的软件时,使用包全名,而且要注意路径(安装的是时候需要使用包全名)
b.包名:操作已经安装的软件包时,使用包名,是搜索/var/lib/rpm/中的数据库(使用软件、卸载的时候可以直接使用包名)。
rpm -ivh [包全名]安装一个软件 -i(安装) -v(显示详细信息) -h(显示进度) –nodeps(不检测依赖性)
rpm -uvh [包全名] 软件升级(如果之前没安装,则是纯安装)
rpm -e [包名] 卸载软件(他会提醒你把依赖的包也卸载了,卸载的包跟安装相反,但是我们可以使用–nodeps不检查依赖,让他不卸载依赖,其实我们在安装的时候也可以使用–nodeps来不检查依赖,但是这样安装,会让软件用不了)
rpm -q [包名]查询是否安装了某个软件(q是指query)
rpm -qilp [包全名] 查询未安装的软件信息,包括安装的目录,依赖等信息(必须有这个本地rpm存在,p是指package,i是infomation,l是list,列出所有信息)
rpm -qa 查询安装过的所有rpm安装包 (使用grep可以赛选某个,简直是神器)
rpm -qf [文件名] 查询某个文件是属于哪个rpm安装包的(必须是rpm包安装的文件)
rpm -qR [包全名] 查询rpm包安装需要依赖的安装包(不能使用这个,因为他会把系统环境已经有的依赖包也列出来,所以列出的信息意义不大)
rpm -V [包名/包全名] 校验文件是否被非法修改过 ,具体会包含很多信息,可以上网查看下
rpm包默认安装位置:
/etc/配置文件安装目录
/user/bin/可执行命令安装位置
/usr/lib/程序使用的函数库保存的位置
/usr/share/doc/软件使用手册保存位置
/usr/share/man/帮助文档保存位置
yum在线安装软件
我们可以在/etc/yum.repos.d/CentOS-Base.repo查看或者配置在线安装服务器的一些信息,信息解释如图所示:
在没有网络的时候,我们可以使用本地yum源来作为在线安装源地址,具体的操作如下:
a.挂载光盘
b.修改yum源文件:1 重命名网络源文件名使其失效(CentOS-Base.repo这个文件,重命名了之后,系统就找不到了); 2 修改光盘源文件的配置使其生效:修改baseurl=file:///mnt/cdrom,注释其它源的目录,将源enabled属性值改为1。
yum list 查看可安装的yum包
yum search [关键字] 搜索可安装的yum包
yum -y install [软件名] 安装软件 -y是自动应答yes(不加-y安装依赖的时候就是会让你每次确认)
yum -y update [软件名] 软件升级(如果不加软件名,那么会更新所有的软件和系统内核,新内核需要做配置才能使用,所以必须要谨慎)
yum -y remove [包名] 卸载软件
yum grouplist 列出所有可用的软件组列表(所谓的软件组,就是一组软件安装包,比如说我们要开发JAVA,可能yum服务器已经给我们准备好了JAVA开发大礼包,包含了JAVA开发的各种工具)
yum groupinstall [软件组名] 安装指定软件组
yum groupremove [软件组名] 卸载指定软件组
源码包的安装:
源码包的安装需要自己指定目录(一般放在/usr/local/下面,rpm包可以通过service启动,因为rpm包安装的软件启动目录一般都在固定目录下,而源码包因为要自己指定,他会找不到启动目录所在地,所以不能用service,需要直接通过安装路径启动)。
具体的安装过程如下(这是标准情况下的安装,每个软件可能不一样,所以还是看官方文档或者在源码目录下的INSTALL文件中查看相关的安装操作,启动命令亦记录在内):
linux的文件和目录有三种权限,分别是:读(r)、写(w)、执行(x)。文件权限跟目录权限是不一样的,文件如果拥有读权限,可以使用cat、more、head、tail命令来查看,w权限可以使用vi echo(追加数据)等命令,但是不能删除文件(理由是拥有文件读写权限,只能修改文件本身的数据,而文件信息的数据,是保存在目录中的,所以我们只有拥有对文件所在的目录的读写权限,才能够删除这个文件),x是可执行这个文件。如果对目录有读权限,可以查询目录下的文件(ls命令),如果对目录拥有写权限,那么我们可以在目录中新建文件和目录,删除文件和目录,重命名文件和目录,剪切文件和目录(rm、mv、cp),如果拥有执行权限,那么我们可以进入目录(cd)。但值得注意的是,超级管理员不管怎么样的情况下,都拥有一切权限(就算这个文件没有分配读写执行权限)。
文件权限管理:
我们可以使用chmod来修改文件权限,chmod -[参数] [ 权限] [文件名]。
chmod -R u-x,g+w,o+w ./ 递归,就是把权限设置应用到目录本身及其内的文件与目录,对普通文件使用-R不起作用
chmod u+x,g+w,o+x test.test方式1通过+-来赋予或删除权限。
chmod u=rwx,g=rw,o=r test.tset方式2通过=来设置相应权限
我们还可以使用参数a来设置所有的用户权限 chmod a=rwx test.test设置文件所有用户拥有读写执行权限
我们可以用三个数字来代替读写执行权限(r=4,w=2,x=1,无论如何相加,他们都能正确区分是由哪几个数字组成的),并且用这三个字母的和代表某类用户的权限,比如说:chmod 755 test.test:赋予u为7(4+2+1)g为5(4+1) o为5(4+1)
改变文件所属的用户:chown [用户名:用户组] [文件] 把某个文件所属的用户或者用户组改为另一个用户或者用户组。
chgrp [用户组] [文件名] 改变用户所属组
linux的文件权限没有继承关系(他并不是跟随父文件的),一个文件创建的时候他的权限跟随umask的值值来决定的。我们可以通过umask命令来查看文件默认权限的值(它会显示0002这种数字,其中第一个是代表特殊权限,第二三个是读、写权限)。文件的默认权限仅能为666(读,写权限,之所以这样做,系统是为了保证在不经意创建一个文件的时候,能够保证安全性),我们通过把文件默认最大权限换算成字母(也就是rwx这种字母),然后再把umask值换算成字母,并按照正确排列数字排列,再相减(实际上就是在做逻辑与运算),就能得到文件默认权限。而对于一个目录来说,他的最大默认权限是777,所以目录的最大权限是777减去默认的umask值(也要字母转换)。umask详解请看umask详解
我们可以通过umask xxxx来修改umask值,但是这是临时的,如果我们想永久修改,可以去/etc/profile来修改。文件如下:
在文件中有一个if UID>199的代码,它表示的是root权限(系统用户的id小于500),所以在这个判断语句中它的umask是赋值给root用户的,后面的else是赋值给普通用户umask值。
对于单独一个用户,如果我们想要对其单独赋予特殊权限(我们不能直接对一个文件赋予用户权限,因为他会替换掉原来的用户),可以使用ACL。一个文件要想拥有ACL权限,需要他所在的磁盘开起来ACL权限。我们可以通过df -h查看磁盘挂载信息,通过dumpe2fs -h /dev/sda3来查看某块磁盘是否开启ACL权限(如果显示包含:Default mount options: user_xattr acl ,表示支持 ACL 权限),通过mount -o amount,acl [挂载目录]来重新挂载一个硬盘,并让其拥有ACL权限。
对于一个文件,如果我们可以通过getfacl [文件名] 来查看文件的ACL权限(我们会看到一个mask值,他是文件的最大权限,所有普通用户都需要和mask权限相与之后才是文件的真实权限,其实后面有一个efftive标注的就是实际的权限)。
我们可以通过setfacl -m m: [权限] [文件名]来修改第一个文件的mask值。
我们可以通过setfacl来修改acl权限。如果想要修改一个文件的ACL权限,可以使用setfacl -m u:[用户名/用户组]:[权限] [文件名]。删除某个用户的ACL权限:setfacl -x u(g):用户名(组名) [文件夹] 删除某个文件下的某个ACL权限(这是根据用户来的)。删除所有的ACL权限:setfacl -b [文件夹]
我们可以在setfacl的时候添加-R来递归让文件夹的子文件也拥有同样的权限,他仅仅会把当前已经拥有了的文件赋予相应的权限,后面创建的,不会拥有这样的权限了(但是我们要注意权限溢出问题,所谓的溢出,是指文件夹的执行权限是用在cd命令,而文件的执行权限是运行文件,如果递归相同的ACL权限,那么子文件也会拥有写权限,这样做很危险)。
如果给父母赋予了默认ACL权限,那么父目录中的ACL权限会被子文件和目录继承。我们可以通过setfacl -m d:u:[用户名/组名]:[文件权限] -R [目录]。跟普通的ACL赋值不同的是,前面有了一个参数d。默认权限在操作以后创建了文件,也会拥有这样的权限。
我们可以使用sudo来对普通管理员赋予执行超级管理员的某些命令权限。具体的操作如下:
我们先执行visudo命令,然后再末尾添加一行user[%组名] ALL=(ALL) [命令的绝对路径],他的意义是让某个用户(组)能够执行某条管理员的命令。其中第一个ALL是被管理的主机的IP地址,意思是在指定的IP地址下才有sudo这个权限,第二个ALL是指可以切换成任意身份(也可以写一个具体的身份,如切换成为root,或者user1身份,如果直接写ALL=[命令路径],则是切换为root用户)。我们可以通过sudo -l来查看某个用户具有的超级管理员命令,通过sudo [命令的绝对路径]来执行上述添加过的某条命令。
如果我们想让某个命令条件执行,举个例子,我们想要让其他用户具有修改密码的权限,但我们不想让passwd命令修改root用户,而且只能修改字母开头的用户密码,那么我们可以这样操作:
注:passwd命令的用法是passwd [用户名] [密码]
user1 ALL=/user/bin/passwd [A-Za-z]*, !/usr/bin/passwd “”, !/usr/bin/passwd root
上面的操作他会同时执行三条命令的操作,第一条是让user1用户拥有root身份,但是修改的用户是字母开头的用户(通配符结果的用户),第二个命令是执行的passwd命令后面带的参数不能为空(passwd为空是默认修改root用户密码,符号!是取反的意思),第三个是不能修改root用户的密码。
14.SetUID:我们可以使用SetUID来改变一个拥有可执行权限的文件,在执行的时候,用户的身份会转变成文件所述用户,文件执行完毕后,用户变成之前的用户。我们可以通过chmod 4755 [文件]给文件赋予SUI权限,或者chmod u+s [文件名]也能赋予SUID权限。我们可以使用chmod 0755 [文件名]来取消SUID权限,或者使用chmod u-s [文件名]也是可以的。
15. SetGID:对于拥有可执行的文件,SetGID能够让其在执行的时候,组身份升级为该文件的所属组。执行过后,变成原来的程序组权限。对于文件夹,普通用户在此目录中的有效组会变成此目录的属组,如果普通用户对此文件拥有w权限时,新建的文件的默认属组是这个目录的属组。我们可以通过chmod g+s[文件夹/文件] [权限] 或者chmod g+s [文件夹/文件]来修改SGID。可以使用chmod g-s [文件夹/文件]来删除SGID权限。
16. SBIT(也叫粘着位,他只能作用于拥有777权限的文件):对于某些时候,虽然某个用户拥有了某个文件夹的读写权限执行(这意味着能够编辑删除添加文件夹里的文件),但是我们想让其值能够删除自己添加的目录(当然root用户是可以删除一切东西 的),这个时候我们可以考虑用SBIT。要赋予SBIT权限,我们需要对该目录的普通用户赋予7权限,所以非常危险,我们可以通过chmod o+t [文件夹]或者chmod 1xxx [文件夹]来对文件夹(仅仅只能作用于文件夹)赋予SBIT权限。我们可以使用chmod o-t [文件夹]来删除SBIT权限
17. 我们可以通过chattr +i [文件名/文件]来对某个文件夹/文件赋值i属性,如果针对的是文件夹,那么这个文件夹里面的不能修改文件名、删除添加文件(但是可以编辑文件),如果针对的是文件,那么这个文件不能被修改(是可以改名的,因为名字是保存在目录中的)。可以使用chattr -i [文件夹]。值得注意的是,这个命令只能在root权限下使用
18. chattr +a [文件名/目录]:如果是目录的话,能够添加新的文件,但是不能删除和修改,如果是文件,那么是可以追加的,但是不能删除(我们不能用vi编辑器修改,因为系统判断不了你到底修改了没,所以可以使用>>追加符来追加数据)。值得注意的是,这个命令只能在root权限下使用
19. 我们可以使用lsattr来查看文件属性,-a或者默认不带参数是列出文件夹里的所有目录和文件。-d是仅仅列出某个文件的属性信息。
1.我们可以通过runlever命令来查看当前系统运行级别。使用init [数字]来修改系统运行级别
2.系统运行级别分为7中,从0-6,0(是关机)、1(是单用户模式,跟windows的安全模式一样)、2(不完全单命令行模式,不含NFS服务)、3()完全的命令行模式,就是标准的字符界面)、4(系统保留)、5(图形化界面)、6(重启动)
3.我们可以通过vim /etc/inittab来修改系统默认启动运行级别。
4.Linux的服务氛围两种,一种是独立服务,一种是基于xinetd服务(也就是他是宿主,别的服务会依附于他,这样做能够节省内存,但是效率比独立服务慢)
5.我们可以通过chkconfig –list来查看自启服务状态(它只能找到RPM包,源码包需要自己去找)。
6.rpm包安装后的文件位置
/etc/init.d 启动脚本位置
/etc/sysconfig 初始化环境配置文件位置
/etc/ 配置文件位置
/etc/xinetd.conf xinetd配置文件
/etc/xinetd.d/ 基于xinetd服务的启动脚本
/var/lib/ 服务产生的数据放在这里
/var/log/ 日志
7.我们有两种方式启动一个rpm包服务,第一种是进入/etc/init.d/独立服务名 -start|stop|status|restart来执行启动重启查看服务状态等操作。第二种是service 独立服务名 start|stop|restart|status来操作服务。
8.RPM包独立服务的自启动方法(所谓的自启动,也就是自动加载或者开启某些服务):
方法1:chkconfig [–level 运行级别] [独立服务名] [on/off]
如:chkconfig –level 2345 httpd on(设置httpd服务在运行级别为2345的时候为自启动级别)
chkconfig httpd off(所有运行级别都不让服务有自启能力)
方法2:修改/etc/rc.d/rc.local文件
加入:/etc/init.d/httpd start。他会在系统运行成功后,执行这个命令。
方法3:使用ntsysv命令管理自启动redhat专有工具,和1本质为同一种方法 2为另一种方法,为防止两次自启动报错,只选其中一种。
9.源码包的启动方式:
安装源码包的运行脚本目录 start|stop
10. 源码包的自启动方法:
第一种:在/etc/rc.d/rc.local里加入启动的命令(跟RPM包的是一样的逻辑)
11.让源码包被服务管理命令识别:
让service命令识别:直接创建源码包的启动脚本的软连接到/etc/rc.d/init.d/目录下,他就可以直接调用service xxx start|stop了
被chkconfig和ntsyssv命令识别:a.修改service命令链接过来的启动脚本,在里面添加下面两行:#chkconfig:[运行级别] [启动顺序] [关闭顺序],#description:soure package apache(#号不是注释,必须要加上)。其中运行级别可以是多个数字,他代表会在这几个启动顺序执行的操作(系统的每个运行级别都会在/etc/rc[运行级别号].d/目录里对应的文件,这些文件分为S开头和K开头的,S开头的文件会在系统运行到这个级别的时候运行,他会启动服务,而K开头的是关闭服务,K和S后面会带一个数字,表示他是某一类服务的启动/关闭文件命令)。后面的启动顺序和关闭顺序数字位数跟运行级别位数相对应,所以他不能跟原有的启动关闭顺序号冲突(有几种运行级别就代表有几种关闭或者打开顺序)这样写了之后,系统在运行到这个级别的时候,就会根据K/S以及对应的启动关闭数字去查找到相应的命令。
b.使用chkconfig –add 软连接名(保存在/etc/init.d里面的)就会把这个服务加入到chkconfig和ntsysv命令操作
Linux服务管理结构图:
1.我们可以通过ps命令来查看进程状况。ps aux和ps -le是我们最常用的命令,他会列出系统所有进程以及其内存CPU等信息。他有以下选项:
-a:显示一个终端的所有进程,除了会话引线
-u:显示进程的归属用户以及内存的使用情况
-x:显示没有控制终端的进程
-l:长格式显示,显示更加详细的信息
-e:显示所有进程,作用和-ax一致
2.ps的输出含义如下图所示:
3.进程有以下常用状态(在ps命令输出中的STAT中表示):
4.我们可以使用pstree来查看进程之间的树形关系,-p他会在树形结构中列出pid号,-u会显示所属的用户
5.我们可以使用top命令来查看当前进程状况(3秒钟刷新一次)。
-d [秒数] 指定top命令每隔几秒钟更新
-b 使用批处理模式输出,他会列出所有的进程,一般和-n选项合用
-n 次数:指定top命令执行的次数,一般和-b选项合用
在top命令的交互模式中,可以执行的命令有以下:
?或h:显示交互模式的帮助
P:以CPU使用率排序,默认就是此选项
M:以内存的使用率排序
N:以PID排序
q:退出top
6.杀死进程:
a、kill -l #查看可用的进程信号
其中有两个信息
信号代号 信号名称 说明
1 SIGHUP 关闭读取配置文件后重启
9 SIGKILL 强制停止
平滑重启服务: 正常修改完配置文件后,需要重启服务,但是用普通的restart来重启会提出正在使用的用户,造成不好的用户体验。而平滑重启是重启服务配置,保留正在使用的用户。 命令: kill -HUP(或-1) 进程号
kill 一次只能杀死一个进程。但是一个服务经常会开启很多进程(比如httpd,每登陆一个用户就会增加一个进程),因此一个个进程关闭太麻烦,可能就要用到killall 或者 pkill 可以批量杀死同一类型的进程
b、killall 命令:
killall [选项] [信号] 进程名 #按照进程名杀死进程,可以批量杀死同一类型的进程
选项:
–> -i:交互式,询问是否要杀死某个进程
–> -I:大小的i,忽略进程名的大小写
c、pkill命令
pkill [选项] [信号] 进程名 #按照进程名终止进程,可以批量杀死同一类型的进程
选项:
–> -t 终端号:按照终端号踢出用户
案例:踢出登录用户
w #查看当前登陆用户的用户 TTY列为终端号
按照终端号杀死进程
pkill -9 -t tty1
只有超级用户才能剔除用户
13.vmstat命令用来监控系统资源,他会列出进程信息(procs:r参数表示运行的进程数,数量越大,系统越繁忙,b参数是不可被唤醒的进程数,数量越大,越繁忙) 内存信息(memory:swpd用来表示虚拟内存使用情况,单位是KB,free是空闲的内存容量,单位是K,buff是缓冲的内容容量,cache是缓存的内容容量),交换分区的信息字段(swap:si表示从硬盘中交换到内存单元的数据,so是从内存中交换到磁盘中的数据,两个数越大,说明要经常进行内存交换,系统性能差),磁盘读写信息字段(io:bi从块设备读入数据的总量,单位是块,bo写入设备的数据总量,单位是块,两个数越大,代表系统的I/O越繁忙)。
14. dmesg用来查看系统开机硬件和内核检测信息(他可以判断硬件或者内核是否健康)。
15. free [-b|-k|-m|-g]查看内存使用状况,后面的参数代表内存使用情况以b/k/m/g单位显示。
16. cat /proc/cupinfo用来显示CPU信息
17. uptime 显示系统开机时间,用户数,平均负载(他就是top命令的 第一行数据,这个目的比top耗费更少的资源,所以如果我们只看这些数据,用uptime比较好)
18. uname用来显示内核的信息,-a用来查看所有相关信息,-r用来查看内核版本,-s用来查看内核名称
19. 我们随便查看一个系统自带命令,就能知道系统位数(其实uname显示内核版本的时候,会显示系统位数)file /bin/ls列出的信息会告诉你是什么位数的操作系统。
20. lsof用来列出进程打开或者使用的文件信息,-c [字符串]是只列出以字符串开头的进程打开的文件,-u [用户名]是只列出某个用户名的进程打开的文件 -p [pid]列出某个pid进程打开的文件 lsof [文件名] 查询某个文件正在被哪个进程调用
1.我们可以使用at来执行一次性命令,在/etc目录下,会有at.deny或者at.allow两个文件,他们分别用来禁止或者让某些用户使用,但他们对root用户是不起作用的(如果同时存在两个文件,at.allow的优先级别大于at.deny),如果两个文件都不存在,那么只有root用户可以使用at命令。命令的用法为:
at [选项] [时间],其中选项有-m(当工作完成后,无论命令是否有输出,都通过email通知执行at命令的用户) 以及-c(工作号:显示该at工作的实际内容)。时间参数可以用多种方法表示:HH:MM(如:02:30),HH:MM YYY-MM-DD(如:02:30 2013-07-25),HH:MM[am][pm] [month][date](如:02:30 july 25),HH:MM[am][pm]+[minutes|hours|days|weeks],也可以使用now+5 minutes这种方式),输入at命令并且按下回车后,会提示你输入具体的操作,然后按下ctrl+d键,会保存并退出at命令。
2. atq查询已经存在的at命令
3. at -c [任务编号]查询at任务编号的任务详情
4. atrm [任务编号] 删除at任务
5. crontab [选项]
-e:编辑定时任务,它默认的带上了你当前用户(谁执行的任务就归谁管,并且这个用户只能执行自己能执行的操作)。它会打开vim编辑器,你可以在这里面写入命令和脚本,crontab的命令的环境变量跟正常情况下不一样,所以命令最好写绝对路径),crontab最小识别时间是分钟,最大识别时间是月。
-l(查询crontab任务)
-r(删除当前用户所有的crontab任务,单独删除一个只需要自己去文件里面改就行了)
6. 如何编写crontab命令?我们的格式是五个星号+命令。星号代表的含义如下:
crontab每个星号还可以使用其他符号来表示特别含义,具体包含的符号如下:
crontab用法举例
crontab注意事项
7.我们也可以直接编辑/etc/crontab文件,在里面添加命令(需要加上用户名,具体操作可以看说明文档)
8.除了手工的使用crontab -e执行定时任务或者直接编辑/etc/crontab文件,我们还可以把定时任务脚本拷贝在/etc/cron.{daily,weekly,monthly}目中的任意一个里(分别会自动在天、周、月里执行),这些文件是由/etc/anacrontab来调用的(旧版本是由anacrontab和crontab两个文件共同调用,新版本仅由anacrontab来管理调用)。
9. anocron是用来保证系统关机的时候错过的定时任务,可以在系统开机之后再执行(他只会执行/etc/cron.{daily,weekly,monthly}目录里的文件,这就证明它比crontab -e命令更好)。每次开机后,anacron会使用一天、七天、一个月作为检测周期。它会在系统的/var/spool/anacron/目录中存在的cron.{daily,weekly,monthly}文件,用于记录上次执行cron的时间,并且它会对当前时间做比较,如果两个时间的差超过了anacron的指定时间差值,说明cron任务没有被执行,需要重新执行。这个时候,他会判断是不是可以执行的时间(在/etc/anacrontab文件里有一个START_HOURS_RANGE=3-22参数代表命令执行的时间),如果是,就回去/etc/cron.{daily|weekly|monthly}目录里去查找并且执行相关的命令。
注意:如果我们命令前面加了“:”说明是底线模式下的命令,否则是命令模式下的操作