第一章
- 文件系统的构成
文件系统是磁盘以及逻辑分区的目录结构,一个磁盘设备包含一个或多个文件系统,但每个文件系统必须占据一个单独的分区。
Linux 文件系统采用带链接的树形目录结构,即只有一个根目录。根目录可含有下级子目录或文件,子目录中又可有更下级的子目录或者文件。这样一层一层延伸下去,构成一颗倒置的树。
Linux 根目录下各文件的作用
/dev 设备的特殊文件
/home 用户主目录
/etc 系统管理和配置文件
/proc 系统内存的映射,存放系统信息
/opt 第三方安装文件
/kernel 系统代码
- 工作目录
控制台或者终端在某个时刻总是对应着一个目录,该目录即工作目录。用“.”表示,工作目录上层目录父目录用“..”表示。
cd / 返回该文件系统的跟目录
cd .. 返回父目录
cd ~ 控制台或终端会将“~”符号替换成用户起始目录的绝对路径。
文件描述符 0,1,2 分别表示 标准输入,标准输出,标准错误。
- Linux 黑洞
使用 /dev/null 语句,它是空/设备,看作“黑洞”,他非常等价于一个只写件,所有写入他的文件都会消失,而尝试从他那里读则什么内容也读不到,然而这条语句对命令行和脚本都非常有用。
/dev/null 通常用来处理进程中那些不想要的输出流,或者作为一个方便的空文件给输出流去做重定向。
如快速清空一个文件的内容 cat /dev/null > 文件名字
- 用户管理
useradd 名字
passwd 名字
userdel 名字
groupadd 名字
groupdel 名字
whoami
查看登录用户:who –a 显示所有用户的所有信息
who –H 显示列标题
某一时刻用户的行为 w
用户之间的切换
sudo su 切到root , su zhangxinghe 切到zhangxinghe用户
创建一个用户 jc 这个用户只能在/home/jc上面增加删除文件,jc不能在其他目录加减文件
useradd –d /home/jc/ -m jc
passwd jc
chown jc –R /home/jc
su jc
- 文件目录管理
mkdir 名字
mkdir -p c/usa/uk 递归创建多个目录
mkdir c/test c/china 创建多个目录
rmdir 名字 删除空目录
rm –r 目录名字 删除非空目录
pwd 显示当前工作目录
ls –a
ls –l
mv 原目录名字 现在目录名字 目录重命名/目录移动
cp –r 原目录名字 现在目录名字
拷贝原目录下所有的文件、 目录到现在目录下
- 文件管理
vim 名字
rm -i 名字 系统提示 是否删除
rm -f 名字 删除之前不提示任何结果
ln –s 原文件名字 现在文件名字 文件链接
用ls –li 查看会显示 现在文件名字 -> 原文件名字
more 文件名字 一次一屏显示文件内容,空格或回车显示下一屏
less 文件名字 同样效果
cat 文件名字 一次全部显示
cat 文件1名字 文件2名字>文件3名字 将1,2的内容写到3,覆盖3的原内容
cat 文件1名字>>文件2名字 将文件1的内容追加到文件2中
head –n 文件名字 显示文件的前n行
tail –n 文件名字 显示文件的后n行
nl 文件名字 以编号的形式一次全部显示文件的内容,不计算回车换行
mv 原文件名字 现在文件名字 文件重命名/文件移动
cp –p clock.c /home/zhangixnghe/cynhard 复制当前目录下的文件并保留文件属性
cp –p clock.c /home/zhangixnghe/cynhard 复制当前目录下的文件,但是操作时间等属性发生改变
find . -name “Linux” –print
find –atime -2 2天内修改过的文件
find . –name “*.c” 查看当前目录下后缀为.c的文件
find . –name “c*” 查看当前目录下c开头的文件
find –perm 755 查看当前文件夹下权限为755的文件
反常规的find命令(假设当前目录下有sh为后缀的文件)
find . –name ?.sh
题目一
答案:
题目二
grep 强大的文本搜索工具(第二章还有)
grep “main” clock.c 查找文件含main的文本行
grep “printf” –n clock.c (引号可以没有)
查看文件含printf的文本行及编号
ls | grep ‘^b’ 查看当前目录下,以b开头的文件(重要)
- 重定向
符号
> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
例子:
[test @test test]# ls -al > list.txt
将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代!
[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!
[test @test test]# ls -al 1> list.txt 2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err
[test @test test]# ls -al 1> list.txt 2> &1
将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!
[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。
- 权限管理
ls –l 查出的首字母代表的意思
- 普通文件
b 块设备文件
c 字符设备文件
d 目录
l 链接文件
p 命令管道文件
s 本地套接口
chmod u/g/o/a+/-/= 文件名字
其中:+:增加指定的权限
-:去掉指定的权限
=:清除所选的权限并将其设置为制定的权限
chmod允许使用八进制符号作为模式,改变权限。
假定clock.c最初具有这样的权限rwxrwxrwx,连续操作如下
改变文件/目录的属主(change owner)
chown Owner FileName/DirecName
如:chown Dave haison.c
改变文件/目录的属组(change group)
chgrp Group FileName/DirecName
如:chgrp Dave haison.c
改变文件/目录的属主和属组
chown owner:group FileName/DirecName
如:chown Dave:Dave haison.c
第二章
- shell
用于linux系统管理和软件开发的脚本语言
Shell 脚本是一个写入系列命令文本文件里,可以一次性执行的可执行文件
Linux 大量采用Shell 脚本来完成重复性或系统维护工作
我们常说有几种shell,其实说的是shell脚本解释器
有 bash(linux 默认) sh(unix默认) csh ash ksh
sh 下工作的命令,可以在bash中工作,反之不行
cat /etc/shells 系统安装shell的版本
- shell程序编写
注意点:1第一行写#!/bin/bash 2变量赋值不加空格,且在双引号内给变量赋值 3使用echo 命令显示 4使用$符号来引用 5shell变量不需要定义
简单shell程序
#!/bin/bash
A=”zhangxinghe”
echo $A
{}保护引用的变量
var1=hello
echo ${var}world
空值置换
echo var1
echo ${var1:-12}
echo $var1
空值赋值
echo var2
echo ${var2:=13}
echo $var2
空值出错
echo var3
echo ${var3:?”zhangxinghe”}
echo $var3
num1-eq num2 | 等于 | [ 3 -eq $mynum ] |
num1-ne num2 | 不等于 | [ 3 -ne $mynum ] |
num1-lt num2 | 小于 | [ 3 -lt $mynum ] |
num1-le num2 | 小于或等于 | [ 3 -le $mynum ] |
num1-gt num2 | 大于 | [ 3 -gt $mynum ] |
num1-ge num2 | 大于或等于 | [ 3 -ge $mynum ] |
- 系统变量 和 环境变量
查看单个环境变量 echo $PATH
查看所有环境变量 (全局) env 或者 (所有)set
常用系统变量
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码 是返回0,不是返回1
例子见下图
例一
例二
$* 以“参数1 参数2() ... ” 形式保存所有参数
$@ 以“参数1” “参数2” ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID
- Shell 表达式运算
1echo $((1+3))
2expr 2 + 4 expr 3 \* 5 注意空格
3let x=1+3;echo $x
4var=`expr 2 + 4`;echo $var 这里是`, 即ESC下面键,不是’
- Shell 程序
if语句
test 3 –gt 4 && echo Ture || echo False
[ 3 –gt 4 ] && echo Ture || echo False
if [ -a clock.c ];then echo ture;else echo flase;fi
[ -a clock.c ] && echo ture || echo false
[ "$(whoami)" != 'root' ] && echo “you are using a non-privileged account”
case实例
#!/bin/bash
echo "1 Restore"
echo "2 Backup"
echo "3 Unload"
echo "Enter Choice:"
read CHOICE
case "$CHOICE" in
1) echo "Restore";;
2) echo "Backup";;
3) echo "Unload";;
*) echo "Sorry $CHOICE is not a valid choice “
Esac
for 循环
1#!/bin/bash
for time in moring noon afternoon evening
do
echo “this time in $time”
done
2#!/bin/bash
#从1加到100
s=0
for((i=0;i<100;i++))
do
s=$(($s+$i))
done
echo “the sum is $s”
while循环
1#!/bin/bash
#从1加到100
s=0
i=0
while [ $i –lt 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo “this sum is $s”
2#!/bin/bash
x=1
while ((x<=10))
do
echo “hello is $x”
x=$(($x+1)) #let x=x+1
done
3#!/bin/bash
x=1
until ((x>10))
do
echo “循环输出$x”
x=$(($x+1))
done
select 语句
#!/bin/bash
echo “what is your favorite os ”
select var in “linux” “free bas” “other”
do
break
done
echo “you have select $var”
函数shell
#!/bin/bash
myvar=”hello he h”
myfunc(){
local x
loca myvar=”one two three”
for x in $myvar
do
echo $x
done
}
myfunc
echo $myvar
- Shell程序调试
bash –x for1.sh 执行该脚本并显示所有值
- grep命令 强大的文本抓取命令,打印含有特殊内容的文件
grep NW file # 打印出file中所有包含NW的行
grep '^n' file # 打印出以n开头的行
grep '4$' file # 打印出以4结尾的行
grep '5\..' file # 打印出第一个字符是5,后面跟着一个.字符,再后面是任意字符的行
grep '\.5' file # 打印出所有包含.5的行
grep '^[we]' file # 打印出所有以w或e开头的行
grep ‘^[0-9]’ file # 打印出所有不是以0-9开头的行
grep '[A-Z] [A-Z]' file # 打印出所有前一个字符是大写,后跟一个空格及一个大写字母的行
grep '[a-z]\{9\}' file # 打印所有包含至少有9个连续小写字符的字符串的行
grep '\<north' file # 打印所有以north开头的单词的行
grep '\<north\>' file # 打印所有包含单词north的行
grep '^n\w*' file # 第一个字符是n,后面是任意字母或者数字
egrep 'NW|EA' file # 打印所有包含NW或EA的行。或grep -E
grep 'NW\|EA' file # 对于标准grep,若在扩展元字符前面加\,grep会自动启用-E
- awk 强大的文本分析工具
内置变量:
ARGC: 命令行参数个数
ARGV: 命令行参数数组
ARGIND: 当前文件索引(从1开始)
FILENAME:当前输入文件名
FS: 输入字段分隔符(默认空格)
NR: 当前记录数
NF: 当前记录字段数
OFS: 输出字段分隔符(默认空格)
ORS: 输出记录分隔符(新行)
RS: 输入记录分隔符(新行)
RSTART: 被匹配函数匹配的字符串首
RLENGTH: 被匹配函数匹配的字符串长度
OFMT: 数字的输出格式(%.6g)
IGNORECASE:控制大小写敏感(0:敏感)
内置函数
vim emp 录入内容
tom jones 4424 5/12/66 543354
mary adams 5346 11/4/63 28765
aslly chang 1654 7/22/54 650000
billy black 1683 9/23/44 336500
awk ‘/mary/’ emp 打印包含mary的行
awk ‘{print $1}’ emp 打印每行的第一个域
awk ‘/sally/{print $1,$2}’ emp 打印包含sally这行的第一第二各区域
awk ‘/sally/{print “\t\t have a nice time,” $1,$2”!”}’ emp
- sed 对文本进行过滤和替换,一次读取一行内容
sed把当前行存储在临时缓冲区中(称为“模式空间”),用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
删除命令:d命令
$ sed '2d' file # 删除file文件的第二行
$ sed '2,$d' file # 删除file文件的第二行到末尾所有行
$ sed '$d' file # 删除file文件的最后一行
$ sed '/test/d' file # 删除file文件所有包含test的行
选定行的范围:逗号
$ sed -n '/test/,/check/p' file # 打印所有在模板test和check所确定的范围内的行
$ sed -n '5,/^test/p' file # 打印从第五行到第一个包含以test开始的行之间的所有行
$ sed '/test/,/love/s/$/xxx/' file # 对于模板test和love之间的行,每行的末尾用xxx替换
替换:s命令
$ sed 's/test/xxx/g' file # 把行中所有的test替换为xxx;若无g,则只替换第一个
$ sed -n -r 's/(love)ab/1rs/' file # love被标记为1,所有loveab会被替换成lovers
$ sed 's#10#100#g' file # “#”紧跟s后,是分隔符,代替了默认的“/”分隔符
追加命令:a命令
$ sed '/^test/axxxx' file # 在以test开头的行后插入新行xxxx
插入命令:i命令
$ sed '/^test/ixxxx' file # 在以test开头的行前插入新行xxxx
- 管道
使用管道可以将一个命令的输出传入到一个命令的输入中。
ls –l | grep for 查看该目录下名字中有for的目录和文件
ls | grep ‘^b’ 查看当前目录下以b开头的文件
第三章
- gcc 预处理,产生汇编语言,产生目标语言,产生二进制语言
gcc -E hello.c -o hello.i #预处理 hello.c hello.i
gcc -S hello.i
#编译为汇编文件 hello.c hello.i hello.s
gcc -c hello.s
#转换成目标文件 hello.c hello.i hello.o hello.s
gcc hello.o -o hello #链接成一个名为hello的二进制可执行文件 hello hello.c hello.i hello.o hello.s
-c只编译,即只产生.o文件, -o 产生目标文件
-E 预处理 -S 汇编
本来,每一个c文件都可以直接 gcc **.c编译,结果如下图
注意
当遇到 gcc max.o min.o hello.c 时,表示编译并链接
- 静态库
执行make lib
执行make
另一个例子:
- make文件编写
实际上,make工程管理器是一个自动编译管理器,这里的自动是指他能够根据文件的时间戳自动发现更新过的文件,从而减少编译的工作量。同时他能够通过读入makefile文件的内容执行大量的编译工作。
makefile 是make读入的唯一配置文件,makefile文件一旦写好,仅仅需要一个make命令,整个工程即可自己主动编译。在其他ide中也有make命令,如delphi 下的make,visual c++ 下的nmake ,linux 下的make。
make命令运行时,须要一个makefile 文件,来告诉make命令怎样去编译和链接一个程序。
执行的顺序:
***.c ->编译->***.o->链接->可执行文件
实例 简单的helloworld
先编写一个hello.c
#include <stdio.h>
int main()
{
printf(“zhagnxngieh”); //故意写错的
return 0;
}
编写makefile文件
hello: hello.o
gcc –o hello hello.o
hello.o: hello.c
gcc –c hello.c
clean:
rm hello hello.o
执行make 完成编译
./hello
输出 zhagnxngieh
修改hello.c
printf(“zhangxinghe”);
./hello
依然输出 zhahnxnhieh
然后make一下
再./hello
结果正确输出 zhangxinghe
make clean
自定义变量的用法
预定义变量和自动变量
预定义变量
自动变量
- gdb 调试
可以调试c , java, c++ 调试的对象是可执行文件
gcc –g add.c –o add 确保被调试程序的可执行文件内添加了调试信息
l
info b
r
n
p i 打印变量i的值 (只有next后才会打印)
bt 查看函数堆栈
finish 推出函数
q 退出gdb
第四部分:(实训的增加知识)
对操作系统的理解,硬件都有接口,编写一个操作系统,对接口操作上就行了。
- ps –ef | grep bash
抓取出当前所有的与bash相关的进程
- alias h = ‘history’
把history 命令简化写成 h
- 在linux 里所有东西的都是文件
- 路径 注意区分
windows操作系统 \
linux 操作系统 /
- 设置管理员密码
sudo passwd
输入当前用户密码 briup
然后会要求输入 unix密码(即管理员用户的密码)
重新输入一遍即可ubantu
su 操作即可
进入用户后可以改密码 passwd 即可
所有用户的密码 全是 zhangxinghe
- linux的软链接相当于windows的快捷方式
ls 开头是 c
- file 名字 查看
- redhat 关机,重启命令
关机
halt poweroff shutdown –h now shutdown –h 10(10分钟后自动关机, shutdown –c 取消) init 0
重启
Reboot shutdown –r 10(10分钟后重启) shutdown –r 20:35(20:35 重启) shutdown –c(取消重启) init 1\
- Redhat 6忘记密码 进单用户模式 passwd
重启系统
1、在出现第一个红色界面右上角五秒倒计时开始时输入e后出现下图
2、再次输入e,选择kernel开头的那一行
3、再次输入e,在行末尾增加一个空格和single,然后回车
注意:也可以增加一个空格和1(代替single)
4、在下图输入b,开始启动系统进入单用户模式
5、成功进入单用户模式后的界面,这一步直接进入,没有输入密码什么的,之后就可以修改root密码,修改文件什么的。
- Redhat 7
Linux – RedHat7 / CentOS 7 忘记root密码修改
1.(a) 开机出现grub boot loader 开机选项菜单时,立即点击键盘任意鍵,boot loader 会暂停。
(b) 按下’e’,编辑选项菜单
(c) 移动上下鍵至linux16 核心命令行
linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=449d53d1-84c2-40c0-b05e-d1900591d71b ro rd.lvm.lv=vg_kvm7usb/swap crashkernel=auto vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_kvm7usb/root rhgb quiet LANG=en_US.UTF-8 rd.break |
(d) 在核心命令行最后加入rd.break 。
(e) 再按下Ctrl+x 重新以这个设定开机。
●开机后的互动式命令环境,並不是正常开机的系統,正常开机系統挂载在 /sysboo 且挂载成只读,必須重新挂载成可写入,才能修改密碼,步骤如下:
(a) 重新挂载/sysroot 成可读可写。
switch_root:/# mount –o remount,rw /sysroot
(b) chroot 工作目录到/sysroot。
switch_root:/# chroot /sysroot
(c) 设定新的root 密码。
sh-4.2# passwd root
(d) 因为在此情況下,SELinux 並沒有启动,对所有文件的更改,可能会造成文档的context 不正确,为确保开机时重新设定SELinux context,必
須在根目录下添加隐藏文件.autorelabel。
sh-4.2# touch /.autorelabel
(e) 退出chroot
sh-4.2# exit
switch_root:/#
(f) 退出系統,系統会自动重新开机。
switch_root:/# exit
重启后,使用修改后root密码登入即可。