操做系统的功能:
存储管理、进程和处理机管理、文件管理、设备管理、用户接口linux
[mengqc@localhost ~]$ 是shell主提示符。其中正则表达式
linux操做系统经常使用命令shell
ls:查看当前目录下的文件夹数据库
data:显示时间apache
cal:显示日历windows
passwd:更改密码数组
cp -f file1 file2:复制文件安全
who:显示谁在登陆以及时间bash
pwd:查看当前路径。网络
man ls :ls的帮助文档。
>;输出重定向,若是一个文件存在,删除后从新创建一个文件。
>>:输出重定向,若是一个文件存在,则追加到原文件末尾。
cat:打开一个文件
history:打开键入的命令列表。
打开后用!+ 编号 便可执行;!!:运行上一个命令;!-n:运行倒数第n个个命令;!cmd:运行cmd开头的命令。
当敲长命令时,输入几个字母+tab键,能够实现移动补充。
linux用户和组
介绍:登陆用户是进入Linux的途径,系统中将用户看做是32位的二进制数,便是一个userID,用户信息存储在/etc/passwd中,root的ID是0;出于安全考虑,显示密码的第二个字段显示为X,密码存储在/etc/shadow文件中。
passwd文件:
用户名|x|用户id|用户2所在组id|备注信息|家|登陆shell
shadow文件:
用户名:加密密码:最近更改密码的日期:密码不可更改的天数:密码更改期限前的警告时间:密码过时的宽限时间:帐号失效日期:保留字段
注:数字是距离1970.1.1多少天到如今
添加用户useradd、adduser
注:此命令实现了1.给用户分配最大的id号 二、在passwd文件中添加一行 三、在/home/下建立用户的家 四、在/etc/group/下添加用户的组
修改用户usermod
用户组:用户组文件的路径在/etc/group/下,用户组也有/etc/gpasswd
group文件内容:groupname:密码:groupID:用户列表
gshadow文件内容:gname:password:管路员列表:成员列表
添加用户组 groupadd
-n 修改用户组名
groups 注:显示用户所属的用户组
grpck grpconv 注:经过/etc/group和/etc/gshadow 的文件内容来同步或建立/etc/gshadow ,若是/etc/gshadow 不存在则建立;
grpunconv 注:经过/etc/group 和/etc/gshadow 文件内容来同步或建立/etc/group ,而后删除gshadow文件;
gpasswd -a 向名为 group 的组中添加用户 user
-d 从名为 group 的组中移除用户 user。
注:这里有关组安全的问题须要注意,组密码是当组中大于一个用户时,在组安全问题中被提出的,细节以后本身好好看看。
文件和目录:
普通文件:文本文件 二进制文件 数据文件
目录文件:I结点/文件名成对存在
i结点:存储文件相关的属性
文件名:存储的是一个字符串,标识该文件
如此作的目的是文件瘦身
设备文件:Linux把设备看做文件,实现设备无关性
符号连接文件:快捷方式
文件控制块:FCB,在linux中就是I结点
Linux树状目录结构
绝对路径名:从/下开始,即root目录下实现绝对目录
相对路径名:./表示当前目录下 ../表示父目录
工做目录:用户的当前目录
主目录:注册用户是建立的文件时的总目录,在/home下
改变工做目录
① 将当前目录改到/home/liuzh:
$ cd /home/liuzh
② 将当前目录改到用户的主目录:
$ cd 或 cd ~
③ 将当前目录向上移动两级:
$ cd ../..
④ 进入cauc的主目录:
$ cd ~cauc
⑤ 返回刚才的目录,即上一个工做目录
$ cd —
ls命令列出指定目录的内容
chmod命令
只有文件主或超级用户root才有权用chmod命令改变文件或目录的存取权限。
umask命令:
文件的权限是由666-掩码实现的
cp
-a:保留组信息
-r :复制子目录下的文件
-i:交互式复制
-s:复制为符号连接文件,注意,这里是赋值为符号连接文件
rm
-i:交互式删除
-rf:所有删除
mv 文件或目录 文件或目录
mkdir
-m 700 directory
-p 若是上层目录不存在也进行建立
rmdir
-p :删除此目录以上的全部空目录
cat
-n 显示行号
more
-c 清屏
-10 显示10行
-d 显示百分比
/字符串:向下搜索字符串
less 分屏显示文件
group
-g:添加用户到用户组
-ag:追加用户
head
-5 :显示前5行
-v:显示文件名
--bytes=-100 :显示最后一百个字节其余的全部内容
tail
-5 :显示最后5行
-n +10 :显示第10行开始后的全部内容
-c 100 :显示最后一百个字符
gzip
-r:递归压缩
-dv :解压文件而且显示百分比
uzip :解压zip文件
tar:
-cvzf 归档名.tgz 被归档的文件
-xvzf .tgz 解压
注:硬连接和软连接的区别是什么???
硬链接:建立一个文件的时候,首先在磁盘上申请一块空间,而后在目录文件下建立一个文件,这里面存储的是文件名+I结点号,这个文件指向内存中建立的i结点,硬链接的话,在目录上新建了一个文件,可是他们指向了同一个i结点,因此她们的i结点号是相同的。
软连接:建立了一个连接文件,是实实在在的一个属性为l的文件,系统分配新的节点号,磁盘中建立一个文件,文件内容是被连接文件的文件目录,这时候,若是删除被连接文件,是删除了文件目录下的文件名,而软连接的内容就是定向到这个文件下,因此删除文件后,软连接就找不到了。软链接的权限是777。
eval:
将后面的命令,进行相应的变量替换和命令替换,替换的结果做为一个新的命令行输出,并执行
例:
[root@localhost etc]# echo $cmd
echo a
[root@localhost etc]# eval $cmd
a
expr
例子: `expr $1 + 1` 注意:运算符先后有空格
[root@localhost /]# set 1
[root@localhost /]# `expr $1 + 1`
bash: 2: command not found
[root@localhost /]# echo `expr $1 + 1`
2
awk
模式:awk 'BEGIN { command } Pattern{ command } END{ command }'
每一行的数据复制给$0 ;一行内空格分开的值从$1开始一次
echo -e "1\n2" | sort -rn | awk '{ x+=$0 ;} END{ print x}'
echo
-e:激活转义字符
mkfs
进程管理
对于并发的程序,经过fork();生成子进程后,资源是两个进程之间各赋值了一份,因此两个进程之间并不影响各进程值的结果。
Linux shell脚本变量的使用
shell有两种执行命令的方式:
咱们要知道bash和sh不是一个东西,咱们须要了解,bash彻底兼容sh,也就是说,用sh写的脚本能够不加修改的在bash中执行
编写shell的通常习惯:
功能;做者;版本信息;历史记录;特殊的命令用绝对路劲表示;预先申明和设置脚本运行时的环境变量;
sheel的变量类型:
shell用$来解析shell变量;
变量赋值 :=;=两边不能有空格
建立变量:shell变量直接定义;环境变量是先定义一个shell变量,而后将export转换为环境变量
列出环境变量:set
列出已经被导出为环境变量的变量:env
export:实现了将父进程的私有数据转到公有区,当运行一个脚本的时候,其实是进入了一个新的shell环境,也能够说是一个新的进程,这个进程由父进程建立。当export后,就能够将公有区的数据给子进程再复制一份了,注意这不是fork。
shell中一些比较特殊的变量:
特殊变量含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的全部参数。
$@
传递给脚本或函数的全部参数。被双引号(" ")包含时,与 $* 稍有不一样,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
注:这些变量咱们留在这里备份,有用到就能够查。
HOME:用户主目录的全路径名。如/home/myname
LOGNAME:即用户注册名
PWD:当前工做目录的路径。
PATH:shell查找命令的路径(目录)列表,各个目录用冒号(:)隔开。 用户能够设置它: $ PATH=$PATH:$PWD
PS1:shell的主提示符。 $ PS1="$LOGNAME> "
SHELL:当前使用的shell。一般,它的值是/bin/bash。
TERM:终端类型。
MAIL:系统信箱的路径。
wc [选项] 文件…
说明:该命令统计给定文件中的字节数、字数、行数。若是没有给出文件名,则从标准输入读取。wc同时也给出全部指定文件的总统计数。字是由空格字符区分开的最大字符串。
该命令各选项含义以下:
- c 统计字节数。
- l 统计行数。
- w 统计字数。
vi
进入文本编辑的方式
光标移动
右移 方向键、l
左移 h、方向键
上移:
-:上移到行开头
k
Ctrl+P
方向键
移动到当前行的第一个字符:
移动到行尾:$
光标移动到第几行 :
Ctrl + G:显示行数
行号 G
移动那到下一个词的开头:w W
移动到前一个词的开头:b B
若是光标在一个词上,就移动到词尾:e E
文本修改
d0:删到行首
d3l:又删三个字符
d$:删到行尾
d5G:删到第5行
dw:删到词末尾
dL
dH
复员命令
回到插入或删除得上一个状态:u
恢复到刚开始编辑状态:U
修改命令:
取代命令:
r:用随后输入的字符取代光标所在的位置
R:至关于r的重复使用
替换命令:
s:用随后输入的字符取代光标所在的位置
S:用随后输入的字符替代整行
文本行合成 :J:把当前行与下一行和成一行
文本移动命令:
>:
>>
<
<<
!+光标移动命令+linux命令
编辑文件
字符串搜索:
字符串替换:
通常格式:g/模式/命令
g/s1/p:打印包含全部s1的行
g/s1/s//s2
shell使用
成组命令:
字符串匹配
grep:标准的正则表达式匹配
egrep:扩展的正则表达式匹配 至关与 -F
fgrep:快速对字符串进行匹配 至关与 -E
shell语言能够说是文本处理语言,可是它应该具有必定的运算能力
变量
环境变量:全局变量,会继承
普通变量:局部变量,不会继承
常量
对变量的管理有 readonly 和 export
shell变量的建立没有啥要求,是一种边定义边赋值的变量,须要的时候直接变量等于什么就行了,例如a=sdad
由于咱们说sheel变量就是给一个信息片建立的名字,它没有说什么浮点数之类的,因此说算术运算咱们须要在(())中实现,
他对变量的类型只有环境变量等,并且建立环境变量还须要export 普通变量
数组的建立
对于数组的建立一种办法直接就是
a[0]=1
a[1]=2
引用的时候是${a[0]},${a[1]}
或者你能够实现用declare
root@kali:/mnt/bdshare# declare -a c
root@kali:/mnt/bdshare# echo $c
root@kali:/mnt/bdshare# echo ${c[0]}
root@kali:/mnt/bdshare# c[0]=1
root@kali:/mnt/bdshare# echo ${c[0]}
1
root@kali:/mnt/bdshare# echo ${c[1]}
其实不必declare,想让他是数组就直接写成数组的形式就能够了
或者用圆括号 c=(e1 e2 e3),引用时c[0]
set命令
不加参数:显示已经定义的所有变量
设置指定位置参数
set 1 2 3:表示$1=1,$2=2,$3=3
env能够显示环境变量:后面还有
unset 用于删除变量和函数
替换运算符
echo ${d:-word}:若是变量存在且非空,返回值,不然返回word,use to test the varible exists or null
echo ${d:+word}:若是存在and非空,返回word,to test the exist of varible
echo ${d:=word}:若是存在且非空,返回值,不然,赋值为word,return word
echo ${d:?word}:if exist or is null,print word,and exit the script or command
above all,":" could is choosed or is not choosed,if not is choosed,cancel the option of null or not null
若是一个变量赋值是一个文件夹或者是一个目录,你去cat 或者cd的话是能够实现的,由于他会解析字符串,其实就和咱们输入的字符串是一个道理,你把它看成你的文件或目录就好了。
环境变量和普通变量的区别我来好好说一下
1,变量就是给一个信息片建立的名字,那就像是一片空间的数据,引用他就能够了
2,咱们说操做系统中的用户环境是怎么构成的?在用户注册过程当中,系统首先作的是建立用户环境,全部的进程都有独立且不一样与程序自己的环境,linux环境是由许多变量以及这些变量的值构成的,
在操做系统中进程是怎么构成的呢?程序+进程控制块+数据,一个用户环境其实就是一个进程,当你建立多个用户的时候,在不一样用户之间切换,其实就是进程之间的切换了。这些变量和变量的值决定了用户环境的外观,shell环境包括shell类型,主目录。
输入输出命令
read:从标准键盘上输入数据
read -p 提示变量名
root@kali:~# read -p "hahaha" x
hahahadsd
echo:直接显示后面的变量名和字符串
条件测试:$1是指输入的第一个参数
三种形式:
文件方面的测试
字符串方面的测试:注意:符号先后有空格
-z s1:空为真
-n s1:>0 true
s1 = s2 :true
s1 != s2
s1 < s2
s1 > s2
数值方面的测试
n1 -eq n2:==
n1 -ne n2: !=
n1 -le n2: <=
n1 -lt n2: <
n1 -ge n2: >=
n1 -gt n2: >
逻辑运算符
!,-a, -o
\(表达式\):总体判断
算术运算
(( 算术表达式)):对于这个,只有加入$((算术表达式))才能输出值
let "算术表达式"
例子:
root@kali:~# read x y
1 2
root@kali:~# echo $((x+y))
3
root@kali:~# echo $((z=x+y))
3
root@kali:~# echo z
z
root@kali:~# echo $z
3
root@kali:~# let "z=x*y+y"
root@kali:~# echo $z
4
双引号:除$,"",\,以外均做为普通字符对待
单引号:将全部获得字符都看作普通字符对待
到引号:将其中的内容解析为shell命令,有两种形式
x=`pwd`;将pwd解析的值做为变量x的值
x=$(pwd);和上面是一个道理
顺序执行:;
逻辑与:&&:这个逻辑与是命令之间的与,上一个与是条件测试的与
逻辑或:||
if控制结构
style1:
if 测试条件
then
command1
else
command2
fi
style2:
if 测试条件
then
command1
elif 测试条件
then
command2
else
command3
fi
while语句
while 测试条件
do
command
done
shift命令:将位置参数右移一位
until语句(测试条件为假时,才循环,为真是才终止循环)
until 测试条件
do
command
done
for语句
for 变量 in 值表
do
command
done
for((i=1;i<$1;i++))
do
command
done
$#——除脚本名外,命令行上参数的个数。
$? ——上一条前台命令执行后的返回值(也称“退出码”等)。
$$——当前进程的进程号。
$! ——上一个后台命令对应的进程号。
$*——表示在命令行上实际给出的全部实参。
gcc编译系统
三个过程:
preprocessing
gcc -E :分析伪指令,头文件 条件编译:生成.i
compiling :进行语法分析
gcc -S:生成.s的汇编文件
Assembler:将汇编代码翻译为机器代码
gcc -c :生成.o文件
linking
gcc -o :生成.out3文件
rpm
Linux控制台的使用
六个字符控制台
ctrl+alt+f1-f6,是六个字符控制台
Ctrl+alt+f7是图形界面即x+windows
在字符控制台下,Linux使用startx命令进行进入图形界面
linux外在设备的使用
首先咱们先来介绍一下分区和挂载的概念
分区是对硬盘进行格式化分区,只有按相应的格式进行分区才能将数据写入磁盘
而挂载呢,就是将逻辑位置的物理位置映射到该分区上,咱们说的文件系统类型是什么呢?就是分区的格式,只有肯定知道硬盘分区的格式才能写入数据呀。
接下来是设备文件和硬件
Linux中,设备do都是以设备文件的形式存在,那固然,不一样的设备类型就有不一样获得文件类型了
设备文件的命名方式是主设备号+次设备号,
好比说:
sd:scsi硬盘,sda:scsi硬盘的第一块硬盘,sda1:scsi硬盘的第一块硬盘的第一个分区(u盘被认为是sd类型)
fd是软盘。
经常使用的文件系统格式
了解这些以后,咱们就能够挂载使用了,当挂载好后,咱们访问这个挂在目录,就能够访问这个设备文件了
挂载方式
mount -t 文件系统类型 设备名就是设备文件 挂载点
例如 mount -t vfat /dev/sda1 /mnt/usb
设备的下载
unmount 挂载目录
Linux操做系统的内核获得功能有
内存管理
进程管理
进程间通讯
虚拟文件系统
Linux支持许多种文件系统,它用通用的文件系统模型表示各类不一样的文件系统,屏蔽了具体的文件系统之间的差别
能够分为逻辑文件系统和设备驱动程序
逻辑文件系统就是各类文件系统的格式
设备驱动程序就是每一种设备控制器所编写的设备驱动程序模块
网络接口:提供了对各类网络1标准的实现和各类网络硬件的支持
再讲一下linux初始化init系统
从BIOS开始,加载系统镜像到内存,进行内核初始化,内和初始化结束后建立PID=1的进程,而后须要一个系统去初始化init进程的行为,这个系统就是init系统。
这里要介绍一个系统服务管理工具
systemd,它是一个用户级别的管理工具
# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# CPU中止工做
$ sudo systemctl halt
# 暂停系统
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate
# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
# 当即启动一个服务
$ sudo systemctl start apache.service
# 当即中止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的全部子进程
$ sudo systemctl kill apache.service
# 从新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载全部修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的全部底层参数
$ systemctl show httpd.service
# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
显示操做系统相关参数
root@kali:~# uname
Linux
root@kali:~# uname -a
Linux kali 4.9.0-kali3-amd64 #1 SMP Debian 4.9.16-1kali1 (2017-03-24) x86_64 GNU/Linux
root@kali:~# uname -m
x86_64
root@kali:~# uname -n
kali
root@kali:~# uname -r
4.9.0-kali3-amd64
root@kali:~#
last:显示过去登录过系统的用户相关信息
读的是/var/log文件
top:至关于windows的任务管理器
split命令:切割文件
telnet 远程链接 Telnet 主机名+端口号
wget:下载软件
stty 用来控制终端的各类设置
好比
root@kali:~# stty -echo
用来关闭自动打印输入字符的功能,一旦关闭,输入的字符就看不到了
这时候就能够在人工输入密码的时候用到了
read pass < /dev/tty
经过这种方式录入密码从终端,当打开tty这个文件时,linux会自动将他定向到终端。
固然最后要将自动打印输入字符的功能打开
stty echo
MAKEFILE
下载源代码包后解压发现一个configur文件,运行它,它是用来检查当前机器的环境的,而后收集环境信息,若是环境检查经过,会生成一个Makefile文件,这个文件是用来编译的,和configur是同一个文件夹下,这个Makefile文件由make开发工具所能识别的,因此,经过make 编译Makefile文件。插入一个点:Makefile文件是一个文本形式的数据库文件,记录了一系列文件之间的依赖关系上所应执行的命令序列,即那但愿文件须要先编译,那些文件从新编译,一旦调用这个make命令,他就会自动查找Makefile文件而且去调用它。当肯定好依赖关系后,你就能够经过make install 安装这个源文件了。