Linux学习笔记
一、安装
VM15
CentOS7(以下所有操作均以该系统运行)
安装教程:https://blog.csdn.net/qq_44714603/article/details/88829423
后期安装图形界面:
# 安装Gnome包 |
然后设置默认运行级,重启:
$sudo systemctl set-default graphical.target |
二、系统介绍
2.1 目录结构
【转】https://www.runoob.com/linux/linux-system-contents.html
系统启动必须:
/boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
/etc:存放所有的系统需要的配置文件和子目录列表,更改目录下的文件可能会导致系统不能启动。
/lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中
指令集合:
/bin:存放着最常用的程序和指令
/sbin:只有系统管理员能使用的程序和指令。
外部文件管理:
/dev :Device(设备)的缩写, 存放的是Linux的外部设备。注意:在Linux中访问设备和访问文件的方式是相同的。
/media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下。
/mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
临时文件:
/run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
/lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件。
/tmp:这个目录是用来存放一些临时文件的。
账户:
/root:系统管理员的用户主目录。
/home:用户的主目录,以用户的账号命名的。
/usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
/usr/bin:系统用户使用的应用程序与指令。
/usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src:内核源代码默认的放置目录。
运行过程中要用:
/var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。
/proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。
扩展用的:
/opt:默认是空的,我们安装额外软件可以放在这个里面。
/srv:存放服务启动后需要提取的数据(不用服务器就是空)
2.2 运行级
Linux系统在任何时候都运行于某个运行级上,且不同运行级运行的程序和服务都不同,所要完成的工作和要达到的目的都不同。
运行级0:关闭计算机,使用shutdown-h命令时,系统转入该状态。
运行级1:单用户模式,不带网络,运行最小系统,用于系统修复,不进行用户身份验证,一般默认运行级不用1
运行级2:多用户模式(与运行级3相似,不带网络功能)
运行级3:带有网络支持的多用户模式,常用的运行级别,但是没有图形界面。
运行级4:系统保留备用
运行级5:用于自动启动 XFree886系统(图形方式),常用的默认运行级
运行级6:重新启动,使用shutdown–r命令时,系统转入该状态。
查看当前系统的运行级:
$systemctl get-default |
注:如果系统启动后,不是运行级5,则启动字符界面(shell),要想进入图形界面可用命令 startx
切换运行级:
$systemctl set-default TARGET.target |
系统运行级服务:
可以在 /etc/rc.d 目录下查看,不同运行级下的开启的不同服务。
也可以运行一下命令查看:可以看到1-6运行级下,哪些服务会启动。
$chkconfig --list |
2.3 守护进程
一般以d结尾,表示daemon。(一般是需要一直运行的程序,如网页服务器)
查看一个服务状态:
systemctl [status | start | stop] serverName |
如:
$systemctl status sshd |
2.4 引导与启动
三、系统基本命令
3.1 man 系统调用使用手册
man name # 查询name使用说明(下面的命令具体情况都可以进行查看) |
参数解析:
name:名称
section:章节数(常见编号如下)
- 1:命令
- 2:系统调用
- 3:库函数
- 5:配置文件
refexp:正则表达式
3.2 系统时间
3.2.1 获取系统当前时间
[root@centos7 ~]# date |
3.2.2 校准时间
需要root权限才能更改:
[root@centos7 ~]# ntpdate 0.pool.ntp.org |
如果没有安装ntpdate的话,先执行安装指令:
yum -y install ntpdate |
3.2.3 系统运行时间
[wbw@centos7 ~]$ uptime |
结果解析:
17:02:19:当前时间
up 52 min:系统自动后到当前已经运行的时间
3 users:当前有3个用户登录系统
load average: 0.00, 0.01, 0.05:近期1、5、15分钟内系统CPU负载平均调度队列长度
3.3 日历
cal # 查看当月日历 |
3.4 计算器
bc |
安装指令:
yum -y install bc |
3.5 系统资源
3.5.1 top 资源占用进程
top:列出资源占用排名靠前的进程
top |
3.5.2 ps 进程状态
ps:查阅进程状态
[root@centos7 ~]# ps |
3.5.3 free 内存使用情况
free:内存使用情况
free |
3.5.4 vmstat 系统负载
vmstat:了解系统负载
vmstat |
3.5.5 df 系统资源使用情况
df [-h]
[wbw@s201 /home/wbw]$df -h |
3.6 who 查看系统登录用户
who:列出当前已登录系统的用户
[wbw@centos7 ~]$ who |
tty:打印当前终端设备文件名
[wbw@centos7 ~]$ tty |
who am i:列出当前终端上登录的用户
[wbw@centos7 ~]$ who am i |
whoami:仅列出当前系统用户名
[wbw@centos7 ~]$ whoami |
3.7 关机、重启
重启
$reboot |
关机
$shutdown [-t sec] [-rkhncfF] time [warning-message] |
-t sec:发送警告信息。(一个服务器,可能有多个用户连接)
-r:重启
-h:关机
time:可以用绝对时间00:00:00 也可 相对+mm
四、Linux 基础操作
4.1 tab 命令补全
只需要打命令的前几个字符,然后按下tab键,会进行自动补全。
4.2 alias 别名
我们可以对一些命令进行取别名操作:
$ alias ll |
我们还可以自定义命令别名:
$ alias wbwll='ls -l' |
但是换一个终端就失效了,如果想一直实现的话可以修改~/.bashrc文件,在末尾添加:
# 别名描述 |
4.3 clear 清屏
清空当前屏幕的内容
4.4 pwd 打印当前目录
$ pwd |
4.5 sudo 临时超级管理权限
添加普通用户临时使用root权限
切换root用户
添加sudo文件的写权限
Codechmod u+w /etc/sudoers
修改/etc/sudoers文件
Codevim /etc/sudoers
添加如下内容:
Code## Allow root to run any commands anywhere
root ALL=(ALL) ALL
# 如给XXX添加sudo权限
XXX ALL=(ALL) ALL撤销sudoers文件写权限
Codechmod u-w /etc/sudoers
sudo + command时,提示找不到命令
切换root用户
添加sudo文件的写权限
Codechmod u+w /etc/sudoers
修改/etc/sudoers文件
Codevim /etc/sudoers
找到
Defaults env_reset
, 将其改为Defaults !env_reset
撤销sudoers文件写权限
Codechmod u-w /etc/sudoers
切换到当前用户
修改配置文件~/.bashrc
Codevim ~/.bashrc
末尾添加
Codealias sudo='sudo env PATH=$PATH'
重启系统
4.6 $PS1 一级提示符
[wbw@centos7 ~]$ |
其中[wbw@centos7 ~]就是一级提示符,我们可以对其自定义修改:
编辑profile文件,添加环境变量PS1
Code[/etc/profile]
export PS1='[\u@\h `pwd`]\$'更新配置
Code$>source /etc/profile
[wbw@centos7 /home/wbw]$
4.7 touch 创建文件
将文件的最后一次修改时间设置为当前时间,但不修改文件内容。例如: touch*.[ch]
touch <filePath文件路径> |
4.8 mkdir 创建目录
mkdir [-p 创建父目录] <dirPath目录路径> |
4.9 ln 链接
ln [参数][源文件或目录][目标文件或目录] |
软链接:
- 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 2.软链接可以跨文件系统 ,硬链接不可以
- 3.软链接可以对一个不存在的文件名进行链接
- 4.软链接可以对目录进行链接
硬链接:
- 1.硬链接,以文件副本的形式存在。但不占用实际空间。
- 2.不允许给目录创建硬链接
- 3.硬链接只有在同一个文件系统中才能创建
必要参数:
- -b 删除,覆盖以前建立的链接
- -d 允许超级用户制作目录的硬链接
- -f 强制执行
- -i 交互模式,文件存在则提示用户是否覆盖
- -n 把符号链接视为一般目录
- -s 软链接(符号链接)【不带s为硬链接】
- -v 显示详细的处理过程
注意!
如果判断不是绝对路径(/开头),那么以相对路径解析:
设当前目录(bash进程的当前目录)为d |
4.10 ls 文件列表
控制列表格式,有选择的为每个项目列出某些属性。
-F(现在终端有颜色了,少用)
若列出的是目录,就在名字后面缀以斜线/ |
-l :长格式列表
例:$ls -l arg |
-h:便于人阅读的方式打印
[wbw@s201 /home/wbw]$ls -lh |
-a:显示隐藏信息
[wbw@s201 /home/wbw]$ls -la |
-i:列出文件的i节点号
[wbw@s201 /home/wbw]$ls -li |
4.11 cp 拷贝文件
cp file1 file2 |
4.12 mv 移动(重命名)文件
mv file1 file2 |
4.13 rm 删除文件
rm file1 file2 ... filen |
4.14 cd 改变当前目录
cd /a/b/c |
4.15 rsync 数据备份工具
远程同步 remote sync,可以镜像整个目录树。优化的流程,增量文件传输,效率高。
rsync用一精巧的算法,将文件分块,在两主机间传播数据块的hash值,据此推出两版本文件之间区别,使得网络只传输文件的增、删、改部分。
示例:(拷贝文件到另一台主机上)
[wbw@s201 /home/wbw]$rsync test.tmp wbw@s202:~/test.tmp |
4.16 find 遍历目录树
find命令的三个基本功能
- find命令从指定的查找范围开始,递归地查找子目录
- 凡满足条件的文件或目录
- 执行规定的动作
命令的特点
功能强,选项较多
递归式查找,提供了一种遍历目录树的手段
find命令提供的灵活性:
在“动作”中可以指定任何命令(也包括用户自己编写的处理程序),使得find成为一个任意处理命令可以借用来进行目录遍历的壳(类似awk对文本的逐行扫描,find对目录森林中的文件和目录逐个扫描)
-name:
find verl.d ver2.d -name '*.c' -print |
-regex:整个路径名与正则表达式匹配
find xxx -regex pattern |
-type:根据类型查找
f:普通文件 |
其他条件选项:
(文件属性字段可用来对遍历到的目标进行筛选,查阅find手册) |
复合条件
◆非: |
find的动作选项
|
4.17 tar 文件归档
选项第一字母指定要执行的操作,是必需的
c: Create创建新磁带。从头开始写,以前存于磁带上的数据会被覆盖掉 |
除功能字母外的其它选项
v: Verbose冗长。每处理一个文件,就打印出文件的文件名,并在该名前冠以功能字母 |
例子:
# 打包文件 |
4.18 程序后台挂起与恢复
【转】https://blog.csdn.net/carolzhang8406/article/details/51314894
linux下我们如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令。
Codectrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
jobs
查看当前有多少在后台运行的命令
bg
将一个在后台暂停的命令,变成继续执行
fg
将后台中的命令调至前台继续运行nohup 命令(推荐)
Code用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部
---------------------------------------
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 该命令的一般形式为:
nohup conmmand &
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1
在上面的例子中,输出被重定向到myout.file文件中Code真实例子:
$nohup java -jar cygf-web-1.0.1.jar > cygf-web-1.0.1.log 2>&1 &
[1] 1617
结束该进程:
jobs // 找到该进程编号
fg 1 // 将该进程调回前台界面
Ctrl+C // 结束该进程
4.19 crontab 定时任务
【测试网址】http://tool.lu/crontab
说明: |
使用步骤
crontab -e |
五、用户管理
【转】https://www.cnblogs.com/dubhlinn/p/11055010.html
5.1 用户(组)配置文件
/etc/passwd:用户的配置文件,存放用户信息;从左至右:用户名,密码(不显示明文),用户id,组id,家目录,登录shell。
/etc/shadow:口令的配置文件,用于存放加密口令、修改事件、失效时间等信息。
/etc/group:组配置文件,用于存放组名、组id。
5.2 用户
用户分类:
普通用户
超级用户(root)
5.2.1 useradd 创建新用户
用户信息存放再/etc/passwd文件中,包括用户名和ID以及对应的home目录。
[root@centos7 ~]# useradd userName [-d homePath] [-g groupName] |
参数介绍:
userName:用户名
homePath:家目录(可选,不指定时默认为/home目录下同用户名)
groupName:组名(可选,不指定时默认为同用户名)
5.2.2 passwd 更改密码
passwd userName |
参数介绍:
userName:用户名
5.2.3 id 查看用户信息
id username
[wbw@centos7 /home/wbw]$id wbw |
5.2.4 su 切换用户
su suername |
5.2.5 userdel 删除用户
userdel [-r] username |
username:为要删除的用户名
-r:是可选项,表示同时删除该用户的家目录。一般情况下删除用户时并不需要删除他的家目录。
5.3 组
组信息存放在 /etc/group
5.3.1 groupadd 添加组
groupadd groupName |
其中,groupName为要添加的组名,注意不能重复添加同名的组,如果groupName已经存在,会返回错误提示。
5.3.2 groupdel 删除组
groupdel groupName |
其中,groupName为要添加的组名,注意如果这个组是一个或多个用户的主组,则不能删除。
5.3.3 usermod 修改用户所属组
这个是用户的默认所属组
usermod -g groupname userName |
其中,groupname为新组名,userName为要修改的用户名。
5.3.4 usermod 修改用户家目录
usermod -d homepath username |
其中homepath为新的家目录,username为要修改的用户名。
5.3.5 gpasswd 从组中添加、移除用户
$gpasswd -h |
添加一个用户到组中
# 先创建一个组 |
将用户移出组
# 移除用户从组中 |
六、文本操作
6.1 重定向
一般情况下都为标准输入输出
输出重定向
Codels -l > filelist.txt
ls -l >> filelist.txt # 追加输入重定向
Codesort < filelist.txt
6.2 管道机制
使用|符号,可以将一个程序的结果传递给下一个程序作为它的输入,这样的操作可以使我们的程序更加的灵活,例如:
ll | sort |
这个例子为将 ll 原本打印在屏幕上的内容,作为 sort 的输入。结果还是打印在屏幕上。如果配合重定向,那么可以直接写到文件中,如:
[wbw@centos7 ~]$ ll | sort > file.txt |
6.3 more&less
可以查看文本,以及一些快捷操作。类似一个文本查看器。
more 文件名 |
帮助:
Most commands optionally preceded by integer argument k. Defaults in brackets. |
6.4 cat & od
cat:文本格式打印
- -n:行号
[wbw@centos7 ~]$ cat nums.txt |
od:逐字节打印
- -c、-t c、-t x1、-t d1、-t u1
[wbw@centos7 ~]$ od -t x1 file.txt |
6.5 echo
echo:输入什么就打印什么。
[wbw@centos7 ~]$ echo 123456 |
通常echo配合重定向,快速向文本文件添加信息:
[wbw@centos7 ~]$ echo 123456 > nums.txt |
还可以进行追加:
[wbw@centos7 ~]$ echo append >> nums.txt |
6.6 head & tail 显示文件头尾
显示文件前(后)N行信息
head -n 15 ab.c # 显示ab.c文件前15行 |
实时打印文件尾部被追加的内容(一般可以用来查看实时日志)
tail -f debug.txt |
6.7 tee 抄送
tee:将从标准输入的数据抄送到标准输出,同时存入磁盘文件。
./myap | tee myap.log |
6.8 wc 字计数
wc:字计数,可以看文件有多少行数据
# 查看file.txt文件的行数 |
6.9 sort 排序
sort:排序
具体使用情况用man查看。
6.10 tr 翻译字符
tr:翻译字符
tr string1 string2 |
将标准输入拷贝到标准输出,string1中出现的字符替换成string2中的对应字符,如:
[wbw@centos7 ~]$ cat file.txt |
6.11 正则表达式相关命令
6.11.1 正则表达式
【菜鸟教程】https://www.runoob.com/regexp/regexp-syntax.html
6.11.2 grep
- -n:显示时每行前面显示行号
- -v:显示所有不包含模式的行
- -i:字符比较时忽略字母的大小写
6.11.3 sed
sed -e ‘s/被替换的内容/替换后的内容/g’
替换操作
Codecat hh.txt | sed [-e 's/被替换的字符串/目标字符串/g']
------------------
g : 一行里面全部
[] : 可以接着多个替换操作Codesed -e 's/.*\([0-9][0-9]*\)万/\1/g'
------------------
\(.......\) 里面的内容看成一个整体与\1对应。即两者值相同。如果有多个,\2\3\4依此下去
6.11.4 awk
awk 的一般语法如下:
Code
># awk 'script' filename此处
'script'
是一个由 awk 可以理解并应用于 filename 的命令集合。它通过读取文件中的给定行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。
该脚本
'script'
中内容的格式是'/pattern/ action'
,其中pattern
是一个正则表达式,而action
是当 awk 在该行中找到此模式时应当执行的动作用{}括起来。
用法
Codeawk '程序' 文件名列表
awk -f 程序文件名 文件名列表
程序 条件 {动作}
awk自动对每行文本执行条件判断,满足条件执行动作(内循环)
多段程序间用空格或分号隔开
也可以用重定向流的方式给数据
ls -s | awk ....处理方式
输入文件的每行作为一个“记录”,变量NR就是行号
每行用空格分隔开的部分,叫做记录的“域”
内置变量$1是第一域的内容,依次$2、$3
awk的处理为:符合条件的行,执行相应的动作
- 条件1:C语言的逻辑关系表达式,<>=!|&
- 条件2:正则表达式 /regexpr/
- 特殊条件:
- 不指定任何条件,默认对所有文本执行动作
- BEGIN:处理文本前执行的动作
- END:之后
动作
自定义变量
加减等算术逻辑运算
正则表达式匹配运算(用作条件判断) ~ !~
Code$2 ~ "[1-9][0-9]*"
表示第二个域要匹配后面的正则表达式流程控制:
Codeif
for
print 变量 变量
printf("%s", $2) 类C语言
推荐:https://www.cnblogs.com/ftl1012/p/9250541.html
6.12 vi 编辑器
注意:vi命令状态下的按键命令没有回显
配置(也可以直接修改配置文件)
Code:set number 显示行号
光标单字符移动
Code5h 光标左移5列
6j 光标下移6行
23k 光标上移23行
10l 光标右移10列行首行尾
CodeCtrl-b 向后翻页(PgDn)
Ctrl-f 向前翻页(PgUp)快速移动
行首行尾
Code^ 行首
$ 行尾移动一个单词
Codew 右移
b 左移
也可以前面跟数字 5w 6b移动指定行
Code:256 + 回车 定位到256行
删除命令
Codex 删除光标处字符
dd 删除当前行
3dd 删除当前行开始的3行字符替换 r
Codera 当前光标字符替换为a
rarbrc 当前光标位置替换为abc撤销(undo)
Codeu
重复上次操作
Code.
存盘
CodeZZ <==> :wq 保存退出
:W 仅保存
:q! 退出不保存文件操作
读入文件xyz.c插入到当前行下
Code:r xyz.c
写文件,把第50行至行尾的内容写到文件file1中(可以用在编辑了半天文件,发现没有权限修改时候用)
Code:50,$w file1
:50,$w! file1 强制覆盖
剪贴板
删除,并拷贝到剪贴板
Code:10,50d 删除第10-50行
:1,.d 删除文件首至当前行的部分
:,$d 删除当前行至文件尾不删除,仅拷贝
Code:10,50y
粘贴剪贴板
Codep
查找
Code/pattern
例子:/[0-9][0-9]*
----------------------
n 向下继续查找
N 向上查找
循环模式,当到达文件尾时,返回文件头继续搜索替换
Code:n1,n2s/pattern/string/g
例子:
:1,50s/abc/xyz/ 仅替换一次
:1,50s/abc/xyz/g 替换所有
:50,80s/^/ / 右移4列
:50,80s/^ // 左移4列
:1,$s/ *$// 消除尾巴多余的空格
--------------------
注意:编辑c文件的时候要小心s/a[i]/b[j]/g 这里只匹配ai,也不能把s/a*b/x+y/g。需要用转移字符\其他操作
CodeJ 行合并,当前行以及下一行合并
Ctrl-l 刷新屏幕(防止其他程序打印消息打乱文件内容)
Cirl-g 打印当前文件的名字,总行数,当前行号,文件是否被修改等信息
七、文件目录管理
7.1 文件信息
例:$ls -l arg |
7.2 文件比较
MD5
SHA-1
diff 求出两个文件的差别
Codediff file1 file2
diff -u file1 file2 (-u后面跟数字表示,打印多少行一样的)
7.3 文件权限管理
7.3.1 chown 修改所有者
chown [-R] username source |
其中,username为修改后的用户名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所有者。
7.3.2 chgrp 修改所在组
chgrp [-R] groupname source |
其中,groupname为修改后的组名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所在组。注意修改文件的所有者和所在组是相互独立的事件,互不影响。
7.3.3 同时修改所有者和所在组
chown [-R] username:groupname source |
其中,username为修改后的用户名,groupname为修改后的组名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所在组。这里的用户和组没有必然联系,即username不一定要属于groupname的那个组。
7.3.4 chmod 修改文件权限
(1) 使用权限代码赋值
chmod role1=auth source
其中,role为角色代码,可以设置其中的一个或多个,多个角色之间用逗号(,)分隔且不能有空格,其取值范围如下:
u-文件或目录的所有者; |
auth为权限码组合,例如读写执行权限为rwx,读和执行权限为rx,写权限为w,根据需要选择。
source为文件或目录的路径名称。
下面是几个实例:
chmod u=rwx,g=rx,o=rx /home/dubhlinn |
(2) 使用加减号添加或减少权限
chmod role+auth source
chmod role-auth source
role、auth、source的含义同上,同样可以设置一个或多个角色,以下是几个实例:
chmod u-x,g+rw /home/dubhlinn/description.txt |
(3) 使用数字赋值
chmod xyz source
其中,x、y、z是三个数字,分别表示文件或目录的所有者、所在组的用户、其他组的用户的”权限值”。
权限值是这样计算的:
r=4 |
将这个用户的权限代码对应的数字加起来就是”权限值”,所以其取值范围可能是0、1、2、3、4、5、6、7。
例如:
chmod 754 /home/void |
7.4 STICKY 粘着位(防删除)
drwxrwxrwt. 33 root root 4096 Apr 22 14:02 tmp |
目录有写权限并且带STICKY属性,此目录下的文件仅文件主可以删除,其他用户删除操作会失败。
7.5 SUID
【转】https://www.jianshu.com/p/71acd8dad454
一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。
如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。
SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。
八、网络管理
8.1 ip addr IP配置信息
配置联网
8.2 ping 计算机连通性
测试本机与网络中其他计算机的连通性。
$ping wangbowen.cn |
8.3 netstat 网络(端口)状态
安装
Code$ sudo yum install -y net-tools
查看
Code$ netstat
查看端口占用情况
Code$ netstat -lntp
8.4 hostname/hosts 主机名、映射
更改主机名
Codevi /etc/hostname
将里面的内容替换为需要的主机名配置主机名(域名)映射文件
Codevi /etc/hosts
新增:
127.0.0.1 localhost
192.168.xxx.xxx XXX
8.5 firewalld 防火墙
服务的启动与关闭
Codesystemctl enable firewalld.service //"开机启动"启用
systemctl disable firewalld.service //"开机自启"禁用
systemctl start firewalld.service //启动防火墙
systemctl stop firewalld.service //停止防火墙重新加载配置
Codefirewall-cmd --reload
查看状态
Codesystemctl status firewalld.service //查看防火墙状态
查看所有配置
Codefirewall-cmd --list-all
查看当前开放的端口
Codefirewall-cmd --zone=public --list-ports
查看某个端口是否开放
Codefirewall-cmd --zone=public --query-port=80/tcp
开放指定端口
以开放80端口为例:
Codefirewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload移除端口
以开放80端口为例:
Codefirewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --reload查看允许指定IP访问的端口规则
Codefirewall-cmd --zone=public --list-rich-rules
开放指定端口(只允许指定IP访问)
以“只允许192.168.1.1的主机连接3306端口”为例:
Codefirewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent
firewall-cmd --reload移除端口(只允许指定IP访问)
以“移除只允许192.168.1.1的主机连接3306端口”为例:
Codefirewall-cmd --remove-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent
firewall-cmd --reload
九、程序命令
9.1 运行时获取信息方式
配置文件
一般较复杂的程序会提供配置文件以存储配置信息或者偏好配置信息,分为系统级偏好设置和用户级偏好设置。
例如 bash 的 /etc/profile 和 ~.bash_profile
配置文件提供了灵活性(同一个程序文件因用户不同读取的配置文件不同而表现不同),变更这些信息不很方便,一般不需要变化的配置信息或选项信息存入配置文件,持久化存储
环境变量
命令env可以打印出当前的环境变量。
一般是些与“环境”相关的配置或选项信息,信息量不大。这些选择在一段时间内反复使用同一个命令或者不同命令时保持不变。
虽然运行的程序(可执行文件)是完全相同的一个文件,程序通过获得环境变量感知环境的不同,控制自己的行为。
性能问题:比读取配置文件需要的系统开支要小。(但是越来越多的用配置文件)
命令行参数(三种风格)
类似find和gcc的风格(gcc -O0 -Wall -c shudu.c)
类似dd命令风格(dd if=/dev/urandom of=test.dat)
类似ls和grep风格(现今流行)
Codels --classify --all --site --human-readable --width=80 /home/jiang长选项
ls -Fashw80 /home/jiang 多个选项挤在一起
ls -F -a -s -h -w 80 /home/jiang 多个选项分开
ls -F -w80 /home/jiang -has 可以把选项放到后面
用独立的命令行参数--显式地标识选项结束
选项的处理统一由C语言标准动态链接库libc.so中库 getopt函数_long()完成
人机交互方式(Linux很少用)如C语言的scanf
9.2 启动 bash
自动执行的一批命令
用户偏好
[wbw@centos7 /home/wbw]$ls -al |
- 当bash作为注册shell被启动时:自动执行用户主目录下的 .bash_profile
- 退出时: .bash_logout
- 交互式: .bashrc
系统级
- 注册shell(启动时):/etc/profile
- 交互式shell:/etc/bash.bashrc
- 注册shell(退出时):/etc/bash.bash.logou
9.3 Shell 编程
9.3.1 变量
变量名和等号之间不能有空格。
不能使用bash里的关键字(可用help命令查看保留关键字)
赋值(定义变量)
addr=1.1.1.1 |
引用(使用变量)
使用一个定义过的变量,只要在变量名前面加美元符号即可。但注意,第二次赋值的时候不能写$your_name=”alibaba”,使用变量的时候才加美元符。
命令行中有$符号的变量引用,会先被完成替换。
引用未定义的变量,变量值为空字符串。
addr 或 ${addr} |
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myUrl="http://www.google.com" |
删除变量
使用 unset 命令可以删除变量。语法:
unset variable_name |
变量被删除后不能再次使用。unset 命令不能删除只读变量。
9.3.2 命令替换
now=`date` |
9.3.3 位置参数
0 # 脚本文件本身的名字 |
9.3.4 字符串
单引号
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
示例:
shell打印:Don't remvoe dir "C:\PETER"!
echo 'Don'\''t remove dir "C:\PETER"'
双引号
除$和`外特殊字符的特殊含义被取消,用于替换。需要转义的有:
\" |
字符串长度
string="abcd" |
子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site" |
注意:第一个字符的索引值为 0。
9.3.5 数组
my_array=(A B "C" D) |
9.3.6 注释
# ..... |
9.3.7 流程控制
可以用 [ ] 来作为一个条件判断!?
命令组合的两种方式:
- { list;} :
- 在当前shell中执行一组命令。
- 左花括号后必须有一个空格!
- 多行并为一行一定要注意有分号
- (list) :在子shell中执行一组命令
条件判断
test 文件特性检查
test -t /etc/motd # 判断该文件是否可读可执行 |
字符串的比较
# 注意!一定要在等号左右加空格 |
整数的比较
-eq = |
复合条件
! :NOT(非) |
if-else
if
if 语句语法格式:
if condition |
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi |
末尾的fi就是if倒过来拼写,后面还会遇到类似的。
TIP:有时候为了图方便也可以这样
[ true ] && command |
if else
if else 语法格式:
if condition |
if else-if else
if else-if else 语法格式:
if condition1 |
以下实例判断两个变量是否相等:
a=10 |
输出结果:
a 小于 b |
if else语句经常与test命令结合使用,如下所示:
num1=$[2*3] |
输出结果:
两个数字相等! |
case 多条件分支
case word in |
其中;;是一个整体
for 循环
与其他编程语言类似,Shell支持for循环。有break,break2,continue,exit 0(返回码,不一定是0)
for循环一般格式为:
for var in item1 item2 ... itemN |
写成一行:
for var in item1 item2 ... itemN; do command1; command2… done; |
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。
in列表是可选的,如果不用它,for循环使用命令行的位置参数。
例如,顺序输出当前列表中的数字:
for loop in 1 2 3 4 5 |
输出结果:
The value is: 1 |
顺序输出字符串中的字符:
for str in 'This is a string' |
输出结果:
This is a string |
*没有 for (i=0;i<n;i++)语法,但是可以用seq命令生成序列: *
for i in `seq 1 254` |
while 语句
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition |
以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。
#!/bin/bash |
运行脚本,输出:
1 |
以上实例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令
9.3.8 expr 表达式运算
shell不支持除字符串意外的数据类型,不支持四则运算等!需要这些功能,借助于shell外的可执行程序/usr/bin/expr实现,为了提高执行效率这里内置了。也可以实现自己的命令来达到复杂运算的目的。
如果直接进行运算会出问题,简单的加法运算如下,需要用到expr命令:
!/bin/bash |
运算表达式:
括号 |
注意:
应该有空格的地方不允许漏掉
应该转义的地方必须要加反斜线,如计算 3*(1+2),和1<2判断:
Code#!/bin/bash
x=`expr 3 \* \( 1 + 2 \)`
echo "x = ${x}, `expr 1 \< 2`"
# 这里的*会被翻译成通配,所以要转移成普通的*表示乘法运算
# 这里<是重定向,因此需要转移
9.3.9 eval 命令
将参数以命令的方式运行:
#!/bin/bash |
输入 |
9.3.10 函数
语法:
name() {list;} |
参数引用:
函数定义完成后,该函数名作为一个自定义内部命令执行,后面可以调用。
调用时函数名后附加上0到多个参数
在函数体内部以$1 , $2 等方式引用
返回值
return 0 |
十、文件系统
10.1 文件系统的创建和安装(挂载)
10.1.1 U盘挂载
教程:https://www.jianshu.com/p/74b8a204b36f
主要命令
fdisk -l // 列表 |
10.1.2 新增磁盘
教程:https://blog.csdn.net/hanpengyu/article/details/7475645
主要命令
fdisk |
10.2 文件系统的结构
把整个逻辑设备以块(扇区)为单位划分,编号0,1,2……(每块512字节或其他更大的2^n字节大小,因此不能取1字节,最小也要取512)
引导块(0号块):用于启动系统,只有根文件系统的引导块有效
专用块(1号块):也叫管理块,或者超级块
存放文件系统的管理信息。
如:文件系统的大小,i节点区的大小,空闲空间大小,空闲块链表的头等等
mkfs命令时初始化,df命令读出部分信息,df-i和df
i节点区:i节点(index node,简记为i-node)
每个文件都对应一个i节点,i节点中的信息包括:
指向文件存储区数据块的一些索引(index)
指针(组成文件的逻辑块与硬盘的物理块之间的映射)
文件类型,属主,组,权限,link数,大小,时戳(i节点内不含文件名)
i节点信息查看
Code[wbw@s201 /home/wbw]$stat anthorized_keys
File: ‘anthorized_keys’
Size: 390 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 17284854 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ wbw) Gid: ( 1000/ wbw)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-26 21:08:42.211841272 +0800
Modify: 2020-02-26 21:09:17.293839845 +0800
Change: 2020-02-26 21:09:17.293839845 +0800
数据存储块:每块可容若干个i节点,每个节点的大小是固定的(比如64字节)