Linux 笔记

  说起来接触 Linux 也算很久了,准确来说是 Ubuntu ,开始只是尝鲜体验桌面版,感觉并不是很方便,遂放弃了。之后是再次用到是因为做 Procast 模拟运算,听说 Linux 运算效率高,试着安装 Linux 版本,来回安装了五六遍,重复输入些看不明白的的指令,可算是装上了软件,奈何执行运算总是出错,当时用 Linux 版本的 Procast 的人很少,社区也查不到什么有效的资料,最后也放弃了。再后来决定转行做开发又一次接触到了 Lunix ,熟悉命令操作便是第一道坎,虽说环境搭建,服务器运行都实践过好几遍,常规的命令也都熟悉,不过前两天面试问到文件权限命令却答不出来,知道大概,但又记不住细节,甚是尴尬。所以抽时间对 Linux 的常用命令做一次梳理、查、汇总,一是加强记忆,二是方便查询。

1、文件操作

1.1、目录/文件列表

ls     # 列出目录
ls -l # 列出长数据串,包含文件的属性与权限数据等
ls -a # 列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
ls -d # 仅列出目录本身,而不是列出目录的文件数据
ls -h # 将文件容量以较易读的方式(GB,kB等)列出来
ls -R # 连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来

stat -L index.html # 列出文件详细信息

# -L:支持符号连接;
# -f:显示文件系统状态而非文件状态;
# -t:以简洁方式输出信息;
# --help:显示指令的帮助信息;
# --version:显示指令的版本信息。

1.2、访问目录

cd /root/Docements  # 切换到目录 /root/Docements
cd ./path # 切换到当前目录下的 path 目录中,“.”表示当前目录
cd ../path # 切换到上层目录的 path 目录中,“..”表示上一层目录
cd .. # 返回上层目录
cd ../.. # 返回上上层目录
cd ~ # 前往 home目录

1.3、通配符

表达式 匹配对象
* 匹配所有
a* 所有 a 开头的文件
b*.txt 以 b 开头,中间有任意个字符,并以”.txt”结尾的文件
? 匹配一个
ab??? 以 ab 开头,其后紧接着3个字符的文件
[] 范围
[abc]* 以 a , b ,或 c 开头的文件
d.[0-9][0-9][0-9] 以 d. 开头,并紧接着3个数字的文件
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:upper] 匹配任意一个大写字母
[:lower:] 匹配任意一个小写字母
[[:upper:]]* 以大写字母开头的文件
[![:digit:]]* 不以数字开头的文件
*[[:lower:]123] 文件名以小写字母结尾,或以 1,2,或 3 结尾的文件件
[characters] 匹配任意一个属于字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符
{} 组合表达式
{[a-z.txt,.pdf]} 匹配 a~z 开头的 txt 文件,和 pdf 文件
^ 取反
[a-h].[^txt] 匹配以字母 a~h 开头并且后缀不是 txt 的文件

1.4、编辑目录/文件

cp 参数     #复制文件和目录
mv 参数 #移动文件和目录
rm 参数 #删除文件和目录

cp file /path/ab # 将当前目录文件 file 复制到目录 /path下,并改名为 ab
cp -R test path
# 将当前目录中 test 目录复制到 path 目录中,
# 若 path 目录存在则把 test 目录复制到 path 目录中
# 若 path 目录不存在则创建 path 目录,并把 test 目录中所有文件复制到 path 目录中

# -a:此参数的效果和同时指定 -dpR 参数相同;
# -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
# -f:强行复制文件或目录,不论目标文件或目录是否已存在;
# -i:覆盖既有文件之前先询问用户;
# -l:对源文件建立硬连接,而非复制文件;
# -p:保留源文件或目录的属性;
# -R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
# -s:对源文件建立符号连接,而非复制文件;
# -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
# -S:在备份文件时,用指定的后缀 SUFFIX 代替文件的默认后缀;
# -b:覆盖已存在的文件目标前将目标文件备份;
# -v:详细显示命令执行的操作。

1.5、新建目录/文件

mkdir (选项)(参数)      #新建目录

mkdir -p-m 750 test/ab
# 在当前目录中建立 test 和 test 下的 ab 目录,权限设置为文件主可读、写、执行,
# 同组用户可读和执行,其他用户无权访问

# -Z:设置安全上下文,当使用 SELinux 时有效;
# -m<目标属性>或--mode<目标属性>建立目录的同时设置目录的权限;
# -p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
# --version 显示版本信息。

rmdir (选项)(参数) #删除空目录

# -p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;
# --ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息;
# -v或-verboes:显示命令的详细执行过程;
# --help:显示命令的帮助信息;
# --version:显示命令的版本信息。

touch (选项)(参数) #新建文件

# -a:或--time=atime或--time=access或--time=use 只更改存取时间;
# -c:或--no-create 不建立任何文件;
# -d:<时间日期> 使用指定的日期时间,而非现在的时间;
# -f:此参数将忽略不予处理,仅负责解决 BSD 版本 touch 指令的兼容性问题;
# -m:或--time=mtime或--time=modify 只更该变动时间;
# -r:<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
# -t:<日期时间> 使用指定的日期时间,而非现在的时间;
# --help:在线帮助;
# --version:显示版本信息。

vi (选项)(参数) #新建文件并进入 vim 编辑器

# +<行号>:从指定行号的行开始先是文本内容;
# -b:以二进制模式打开文件,用于编辑二进制文件和可执行文件;
# -c<指令>:在完成对第一个文件编辑任务后,执行给出的指令;
# -d:以diff模式打开文件,当多个文件编辑时,显示文件差异部分;
# -l:使用lisp模式,打开 lisp 和 showmatch ;
# -m:取消写文件功能,重设 write 选项;
# -M:关闭修改功能;
# -n:不实用缓存功能;
# -o<文件数目>:指定同时打开指定数目的文件;
# -R:以只读方式打开文件;
# -s:安静模式,不现实指令的任何错误信息。

1.6、目录/文件属性/权限

chown (选项)(参数)
# 更改文件用户
# 只有文件主和超级用户才可以便用该命令。

chown -R user_name:staff /test
# 将目录 /test 及其下面的所有文件、子目录的所属用户改成 user_name ,所属组改成 staff
# 可单独更改用户或组
# chown -R :staff /test
# chown -R user_name: /test

# -c或——changes:效果类似“-v”参数,但仅回报更改的部分;
# -f或--quite或——silent:不显示错误信息;
# -h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
# -R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
# -v或——version:显示指令执行过程;
# --dereference:效果和“-h”参数相同;
# --help:在线帮助;
# --reference=<参考文件或目录>
# 把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
# --version:显示版本信息。

chmod -R -rwx-rwx-rwx file
# 全部用户全部权限
# -rwx -rwx -rwx
# 文件主 u 用户组 g 其他 o 全部 a

chmod u+rw file
# 文件主增加读写权限

# 更改文件权限
# r=读取属性  //值=4
# w=写入属性  //值=2
# x=执行属性  //值=1
# rwx=7,rw=6,rx=5, wx=3

# -c或——changes:效果类似“-v”参数,但仅回报更改的部分;
# -f或--quiet或——silent:不显示错误信息;
# -R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
# -v或——verbose:显示指令执行过程;
# --reference=<参考文件或目录>
# 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;

1.7、文件查找

locate (选项)(参数)
locate ~/.html
# 搜索用户主目录下,所有 html 的文件:

# find -name 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,
# 而是搜索一个数据库 /var/lib/locatedb,这个数据库中含有本地所有文件信息。
# Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。
# 为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库。
# -d<目录>或--database=<目录>:指定数据库所在的目录;
# -u:更新slocate数据库;
# --help:显示帮助;
# --version:显示版本信息。

find (选项)(参数)

find /home -name "*.txt"
# 在/home目录下查找以.txt结尾的文件名

# -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
# -anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
# -atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
# -cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
# -cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
# -ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
# -daystart:从本日开始计算时间;
# -depth:从指定目录下最深层的子目录开始查找;
# -expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
# -exec<执行指令>:假设find指令的回传值为True,就执行该指令;
# -false:将find指令的回传值皆设为False;
# -fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
# -follow:排除符号连接;
# -fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
# -fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
# -fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
# -fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
# -gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
# -group<群组名称>:查找符合指定之群组名称的文件或目录;
# -help或——help:在线帮助;
# -ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
# -iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
# -inum<inode编号>:查找符合指定的inode编号的文件或目录;
# -ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
# -iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
# -links<连接数目>:查找符合指定的硬连接数目的文件或目录;
# -iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
# -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
# -maxdepth<目录层级>:设置最大目录层级;
# -mindepth<目录层级>:设置最小目录层级;
# -mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
# -mount:此参数的效果和指定“-xdev”相同;
# -mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
# -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
# -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
# -nogroup:找出不属于本地主机群组识别码的文件或目录;
# -noleaf:不去考虑目录至少需拥有两个硬连接存在;
# -nouser:找出不属于本地主机用户识别码的文件或目录;
# -ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
# -path<范本样式>:指定字符串作为寻找目录的范本样式;
# -perm<权限数值>:查找符合指定的权限数值的文件或目录;
# -print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
# -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
# -printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
# -prune:不寻找字符串作为寻找文件或目录的范本样式;
# -regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
# -size<文件大小>:查找符合指定的文件大小的文件;
# -true:将find指令的回传值皆设为True;
# -typ<文件类型>:只寻找符合指定的文件类型的文件;
# -uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
# -used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
# -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
# -version或——version:显示版本信息;
# -xdev:将范围局限在先行的文件系统中;
# -xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。

2、编译安装

Linux 平台下,软件安装主要包括:源码包、二进制包和包管理器安装。

  • 源码包:即程序软件的源代码(一般也叫 Tarball ,即将软件的源码以 tar 打包后再压缩的资源包);
  • 二进制包:经过编译,不可以再看到源码,如 Red Hat发行版的.rpm包,Debian 发行版的 .deb 包;
  • 包管理器:常用安装方法,方便管理
    1. redhat系列,都是rpm格式的,通过yum 管理软件。
    2. debian系列,都是deb格式的,通过apt-get管理软件。
    3. gentoo系列,通过emerge管理软件。(无版本概念,滚动更新,特点是安装系统一般需要几十个小时,因为是通过源码方式编译安装系统的,但速度极快,优化做的好)
    4. archlinux系列,通过pacman管理软件。 (无版本概念,滚动更新,安装简单,二十多分钟即可,在x86架构下速度很快,管理简单,符合kiss原则)

2.1、源码包编译安装

常用过的 Tarball 封装格式有 .tar.gz.tar.bz2

# 1、下载,略...;

# 2、md5sum校验
# 2.1、输出 md5 ,并与官方提供的值相比较,判断是否一致
md5sum filename.tar.gz
# bcda6cb5c704664f989703ac5a88f112 filename.tar.gz
# 2.2、生成 md5 文件 filename.md5
md5sum filename.tar.gz > falename.md5
# 2.3对比 md5
md5sum filename.tar.gz -c filename.md5
# filename.tar.gz: OK
# filename.tar.gz: FAILED
# md5sum: WARNING: 1 computed checksum did NOT match

# 3、解包
# .tar.gz 格式
tar –zxf
# .tar.bz2 格式
tar -jxf
# tar 参数详解
# -A或--catenate:新增文件到以存在的备份文件;
# -B:设置区块大小;
# -c或--create:建立新的备份文件;
# -C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
# -d:记录文件的差别;
# -x或--extract或--get:从备份文件中还原文件;
# -t或--list:列出备份文件的内容;
# -z或--gzip或--ungzip:通过gzip指令处理备份文件;
# -Z或--compress或--uncompress:通过compress指令处理备份文件;
# -f<备份文件>或--file=<备份文件>:指定备份文件;
# -v或--verbose:显示指令执行过程;
# -r:添加文件到已经压缩的文件;
# -u:添加改变了和现有的文件到已经存在的压缩文件;
# -j:支持bzip2解压文件;
# -v:显示操作过程;
# -l:文件系统边界设置;
# -k:保留原有文件不覆盖;
# -m:保留文件不被覆盖;
# -w:确认压缩文件的正确性;
# -p或--same-permissions:用原来的文件权限还原文件;
# -P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
# -N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
# --exclude=<范本样式>:排除符合范本样式的文件。

# 4、配置 ./configure
# 配置安装目录,便于卸载,直接删除 folder 文件夹即可
./configure --prefix=/usr/local/folder

# 5、编译/检查
# 指定目录 make
make -f /download/filename
# make test 或 make check ,一般需要你有 root 权限,结果必须全 ok, error 0
make test
make check

# 6、安装
make install

3、进程操作

3.1、用户/用户组

# 查
cat /etc/passwd # 查看所有用户
cat /etc/group # 查看所有组
groups # 查看当前用户所属组
groups user_name # 查看指定用户所属组
id -a user_name # 查看用户所属组的详细信息
whoami # 查看当前用户

# 增
useradd (选项) user_name
useradd –d /usr/user_name -m user_name
# 命令创建了一个用户 user_name ,
# 其中 -d 和 -m 选项用来为登录名 user_name 产生一个主目录 /usr/user_name
# ( /usr 为默认的用户主目录所在的父目录)。
useradd -s /bin/sh -g group –G adm,root user_name
# 命令新建了一个用户 user_name,该用户的登录 Shell 是 /bin/sh,
# 它属于 group 用户组,同时又属于 adm 和 root 用户组,其中 group 用户组是其主组。

# -c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
# -d<登入目录>:指定用户登入时的启始目录;
# -D:变更预设值;
# -e<有效期限>:指定帐号的有效期限;
# -f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
# -g<群组>:指定用户所属的群组;
# -G<群组>:指定用户所属的附加群组;
# -m:自动建立用户的登入目录;
# -M:不要自动建立用户的登入目录;
# -n:取消建立以用户名称为名的群组;
# -r:建立系统帐号;
# -s<shell>:指定用户登入后所使用的shell;
# -u<uid>:指定用户id,默认用户的缺省UID从500向后顺序增加,500以下作为系统保留账号。

# 删
userdel (选项) user_name
# -f:强制删除用户,即使用户当前已登录;
# -r:删除用户的同时,删除与用户相关的所有文件。

# 改
usermod (选项) user_name
# -c<备注>:修改用户帐号的备注文字;
# -d<登入目录>:修改用户登入时的目录;
# -e<有效期限>:修改帐号的有效期限;
# -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
# -g<群组>:修改用户所属的群组;
# -G<群组>;修改用户所属的附加群组;
# -l<帐号名称>:修改用户帐号名称;
# -L:锁定用户密码,使密码无效;
# -s<shell>:修改用户登入后所使用的shell;
# -u<uid>:修改用户ID;
# -U:解除密码锁定。

3.2、查看进程

# 常用组合
ps aux|grep php-fpm

prep (选项) # 队列中查找进程
# -o:仅显示找到的最小(起始)进程号;
# -n:仅显示找到的最大(结束)进程号;
# -l:显示进程名称;
# -P:指定父进程号;
# -g:指定进程组;
# -t:指定开启进程的终端;
# -u:指定进程的有效用户ID。

ps (选项) # 报告系统进程
# -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
# a:显示现行终端机下的所有程序,包括其他用户的程序。
# -A:显示所有程序。
# -c:显示CLS和PRI栏位。
# c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
# -C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
# -d:显示所有程序,但不包括阶段作业领导者的程序。
# -e:此选项的效果和指定"A"选项相同。
# e:列出程序时,显示每个程序所使用的环境变量。
# -f:显示UID,PPIP,C与STIME栏位。
# f:用ASCII字符显示树状结构,表达程序间的相互关系。
# -g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
# g:显示现行终端机下的所有程序,包括群组领导者的程序。
# -G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
# h:不显示标题列。
# -H:显示树状结构,表示程序间的相互关系。
# -j或j:采用工作控制的格式显示程序状况。
# -l或l:采用详细的格式来显示程序状况。
# L:列出栏位的相关信息。
# -m或m:显示所有的执行绪。
# n:以数字来表示USER和WCHAN栏位。
# -N:显示所有的程序,除了执行ps指令终端机下的程序之外。
# -p<程序识别码>:指定程序识别码,并列出该程序的状况。
# p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
# r:只列出现行终端机正在执行中的程序。
# -s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
# s:采用程序信号的格式显示程序状况。
# S:列出程序时,包括已中断的子程序资料。
# -t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
# t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
# -T:显示现行终端机下的所有程序。
# -u<用户识别码>:此选项的效果和指定"-U"选项相同。
# u:以用户为主的格式来显示程序状况。
# -U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
# U<用户名称>:列出属于该用户的程序的状况。
# v:采用虚拟内存的格式显示程序状况。
# -V或V:显示版本信息。
# -w或w:采用宽阔的格式来显示程序状况。 
# x:显示所有程序,不以终端机来区分。
# X:采用旧式的Linux i386登陆格式显示程序状况。
# -y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
# -<程序识别码>:此选项的效果和指定"p"选项相同。
# --cols<每列字符数>:设置每列的最大字符数。
# --columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
# --cumulative:此选项的效果和指定"S"选项相同。
# --deselect:此选项的效果和指定"-N"选项相同。
# --forest:此选项的效果和指定"f"选项相同。
# --headers:重复显示标题列。
# --help:在线帮助。
# --info:显示排错信息。
# --lines<显示列数>:设置显示画面的列数。
# --no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
# --group<群组名称>:此选项的效果和指定"-G"选项相同。
# --Group<群组识别码>:此选项的效果和指定"-G"选项相同。
# --pid<程序识别码>:此选项的效果和指定"-p"选项相同。
# --rows<显示列数>:此选项的效果和指定"--lines"选项相同。
# --sid<阶段作业>:此选项的效果和指定"-s"选项相同。
# --tty<终端机编号>:此选项的效果和指定"-t"选项相同。
# --user<用户名称>:此选项的效果和指定"-U"选项相同。
# --User<用户识别码>:此选项的效果和指定"-U"选项相同。
# --version:此选项的效果和指定"-V"选项相同。
# --widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

4、网络配置todo



下一篇 别样三月三
上一篇 第一次 PHP 面试
查看评论