Jimmy小站
小明也有大梦想 — 蒋明/铭Linux学习笔记
2020-03-23 / 开发环境配置 / 2893 次围观 / 0 次吐槽Linux学习笔记
linux100讲学习笔记,课程零碎的记录
vim 四种模式
正常模式:
复制
yy复制整行
数字yy (如 5yy) 复制从当前行到往下数5行
y$从当前复制到末尾
剪切
dd 同yy
d$
粘贴 p
重做 (ctrl+ r)
撤销 u
进入插入模式:
i 直接进入,并且插入位置在光标位置
I 光标所在行的行首
a 光标位置后一位
A当前行最后
o当前所在行的下一行(产生新一行)
O当前行上一行插入新行
单个字符删除 x
单个字符替换 光标移动到指定字符 按r 接着输入新的字符
光标移动到指定行 数字+ G (shift +g)
首 g 行尾 G
正常模式下光标到行首^ 行尾 $
插入模式:
命令模式:
:set nu 文本显示行号
:q q! wq
查找 /需要查找的字符 查找到之后 按u查找下一个 U上一个
替换
:s /将被替换的字符/替换字符 (光标所在行)
:%s 整个文本查找
:3,5s 从3~5行查找替换
:s /将被替换的字符/替换字符/g 对找到的所有匹配项全部替换
视图模式:
v V ctrl+v
用户与用户组管理
id 用户名 查看用户的用户组信息
useradd 用户名 添加用户 (root 用户才有权限) 可知直接新建时指定组 useradd -g 组名 用户名
/etc/passwd 和 /etc/shadow 中会记录系统中的用户 /etc/group
passed 用户名 给指定用户设置其他人的密码,不加用户名 则设置自身密码
userdel 删除用户 userdel -r 同时删除用户的家目录
usermod 修改用户属性 usermod -g 修改后的组 用户名
chage 限制用户在什么情况下可以登录
groupadd groupdel
visudo 授权普通用户执行指定的高权限用户(不需要密码)
进入编辑界面 授予的用户 ALL(host) 命令路径 参数
文件与目录
文件与目录权限drwxrwxrwx
网络
网络管理
/vim /etc/default/grub 在GRUB_CMDLINE_LINUX=””中添加
再执行:grub2-mkconfig -o /boot/grub2/grub.cfg 修改成eth0格式的网卡命名方式
查看网卡物理连接情况 mii-tool eth0
net-tools
ifconfig
route
netstat
iproute
ip
ss
网络配置
查看网络配置
修改网络配置
网络故障排除命令
tranceroute 查看每一跳 tranceroute -w (wait) 1 (时间 单位s)
mtr 检查中间是否又数据包丢失
nslookup 域名对应的IP是否解析正确
telnet 检查端口是否正确
tcpdump
tcpdump -i any -n host XXX and port XXX -w /tmp/dumpfile
netstat -n(显示IP不是域名) -t(tcp方式截取) -p(进程) -l(listening状态的服务)
ss
网卡配置文件地址:/etc/sysconfig/network-scripts/ifcfg-eth0
强制修改Root密码
启动选项界面,按e进入编辑模式,找到Linux16开头的行,在最后加入 rd.break (cetos7)
这时候是Root用户,但是是一个临时系统。真正的体统根目录在 /sysroot
重新挂载sysroot为可读写模式 mount -o remount ,rw /sysroot
修改临时系统的根目录为真实体统的根目录 chroot /sysroot 这样对临时root用户做的操作,就会实际修改真实的操作系统中的信息
echo 123456 | passwd –stdin root
SELinux会检测修改密码的操作不是标准修改,导致无法进入系统,这里需要关闭它
关闭SELinux vim /etc/selinux/config 把 SELINUX=enforcing改为disabled
最后重启
进程管理
运行./a.sh 后台运行 ./a..sh &
如果是在后台运行,通过jobs命令查看有几个后台程序(会带有编号),然后使用 fg 编号 调到前台运行。
如果是在前台运行,可以使用Ctrl+Z暂停,再 jobs 再 bg 编号 (后台运行) fg 编号 (继续前台运行)
kill -9 pid 强制关闭某个进程
systemctl
/lib/systemd/system中
内存与磁盘管理
使用率查看
内存使用率 free top
free -m 按兆现实 top实时更新
磁盘使用率 fdisk df du
du与ls区别 du 查到的是实际占用的空间。ls查到的是文件从头到尾的计算值
dd if=afile of=bfile bs(块大小)=512 count=1(一块)
df -h
EXT4文件系统
超级块 记录整个文件系统/分区中包含多少文件 df查看的就是这里
超级块副本
i节点 记录每一个文件 名称 大小 编号 权限 注意:文件名记录在父母离的i节点
数据块 如果i节点(一个数据块)存不下,会在i节点挂在更多数据块。因此根据实际使用的数据块的多少就能统计数据块的大小(du 命令),而ls统计的是i节点当中记录的文件大小信息(i节点有可能挂载空的block)
文件操作
touch cp mv 而vim(会修改i节点,实际修改的是一个临时文件,保存是替换)
创建链接 (类似于windows的快捷方式)实际通过i节点连接 命令为ln (跨分区或文件系统无效,可以通过软链接实现,ln -s)
chmod chown 修改链接文件的权限 无效,实际还是以被链接的文件实际权限为准
facl文件权限高级操作
getfacl 文件名 获取用户的属主、属组 及对应角色的权限
setfacl -m(赋予) -x(回收) u:用户名(或者g:组名):rwx 文件名
分区和挂载
常用命令
fdisk 创建分区 如fdisk 、/dev/sdb
mkfs 格式化分区 mkfs.ext4(这里有好几个选项。不同的格式) /dev/sdb1
parted 大于2T的磁盘需要这个分区
mount 分区是无法被读取的,需要挂载到指定的目录上,对该目录读写,就会落入磁盘对应的分区上
先mkdir /mnt/sdb1 再 mount /dev/sdb1 /mnt/sdb1
mount 不带参数就是查挂载的情况
常见配置文件/etc/fatab 将常用命令指令固化(常用命令关机失效,上面的挂载关机后就没了)
Shell篇
什么是shell shell 是命令解释器,用于解释用户对操作系统的操作
Linux 启动过程 BIOS-MBR-Bootloader(grub)-kernel-systemd-系统初始化-shell
看MBR
dd if=/dev/sda of mbr.bin bs(块大小)=512 count=1(一块) 导出整个sda中的启动引导文件(固定512字节)
chmod u+rx filename 给文件赋予可执行的权限(可读可执行)
命令的执行
- bash ./filename.sh 在终端产生子进程执行,无需赋予执行权限
- ./filename.sh 同上,需要在命令文件首行指定解释器,需要赋予执行权限
- source ./filename.sh 在当前进程运行,命令执行会影响当前运行环境
- . filename.sh 同上
内建命令和外部命令:
- 内建命令不需要创建子进程,而外部命令需要
- 内建命令对当前shell生效
管道与重定向
管道
管道与管道符:管道符 | 将一个命令的执行结果传递给后面的命令。如
ps | cat
echo 123 | ps
管道符将后面的命令创建子进程,将左边进程的标准输出与右边进程的标准输入建立管道通信
管道符是通过创建子进程的方式连接两个命令,因此在管道符右边的命令使用了cd/pwd等内建命令不会影响当前环境
子进程与子shell
重定向符号
输入重定向 <
输出重定向 > 覆盖 >> 追加 2> 文件描述符2重定向(错误信息重定向) &> 正确错误全部输出到指定文件
输入与输出重定向组合:一般用于生成配置文件
#! /bin/bash
# 将生成一个新a.sh文件,内容为"generate new sh"
cat > /root/a.sh <<EOF
echo "generate new sh"
EOF
变量
变量赋值
变量名=变量值 不能有空格
l=ls 将命令赋给一个变量 相当于给命令其别名
let c=$(ls -l /etc) 将命令执行结果赋值给变量
变量作用范围
定义的变量在子进程 父进程 子Shell(bash命令)平行shell 都无效,旨在自身进程有效
如 bash ./filename.sh 脚本中定义了变量,是不会传递到当前环境的。如果需要传到当前环境,需要使用source ./filename.sh
在父进程执行 export var1 则在子进程就能获取到var1这个变量
unset 变量名 删除赋值
环境变量
$PATH
PATH=$PATH:/root 在环境变量后面追加一个路径,这个方法对自身和子Shell生效,新开启的Shell无效。如果需要全局生效,可以在bashrc配置文件中配置。
预定义变量
$? 确认上一条命令是否正确执行,正确0 不正确1
$$ 显示当前进程的PID (脚本监测 脚本运行状态时使用)
$0 当前进程的名称
位置变量
$1 $2 $3 $…${10}…
$0 表示脚本名称
$* 表示所有传入参数的数组
$# 参数的数量
执行脚本时传入的参数
避免读入空值,如果参数没有指定,指定默认值”_“ :${2}_
如果对位置变量进行赋值,这样的操作会在传入值后面多出一个下划线,解决方案:替换语法:pos1=${2-_} 如果是空才用下划线赋值。
环境变量配置文件
- /etc/profile
- /etc/profile.d
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
按以上顺序加载。如果有重复,则后面会替换前面的
bashrc profile的区别 用户登录时加“-”号 所有配置都生效,如果切换用户时不加 “-”号,则只有bashrc中的配置生效。
数组
定义 var1=(aaa bbb ccc)
echo ${var1[@]} 取全部数据
echo ${#var1[@]} 统计数组个数
判断
test判断程序中的细节问题
test -f filename 检测是否存在并且是一个常规文件
也可以简化成 [-t filename]
echo $? 为0表示test正常退出,1表示异常,即文件不存在或者不是标准文件类型
结合if和test
# 如果是Root用户,就显示条件体中的内容
if [$UID = 0]
then
echo "root user"
fi
实际上if也可以判断一个命令执行是否成功
# 如果是Root用户,就显示条件体中的内容
if [pwd = "sss"]
then
echo "sss working directory"
fi
if else
#! /bin/bash
# if else demo
if [$USER = root]; then
echo "root user"
else
echo "other user"
fi
case
#!/bin/bash
#
case "$1" in
"start"|"START")
echo $0 "starting"
;;
"stop"|"STOP")
echo $0 "stop"
;;
"restart"|"reload")
echo $0 "restarting"
;;
*)
echo "usage hint"
;;
esac
for
while until
break continue
使用循环处理位置参数
#!/bin/bash
for parm in $*; do
if[ "$param" = "help" ]
echo "include help parameter"
fi
done
自定义函数
function cdls() {
cd /$1
ls
# 函数内的变量
local local_var
#$1 $2 ... 传参
}
#使用,/tmp是传入的一号参数
cdls /tmp
========================================
#!/bin/bash
# function可以省略
checkpid() {
local i
for i in $*; do
# if test 的简单写法
[ -d /proc/$i ] && return 0
done
return 1
}
信号
trap命令能够捕获传给进程的信号,-9是不能捕获的,kill -9 pid 会强制关闭进程
#!/bin/bash
# signal demo
# 捕获15号信号,如果收到就输出相应提示
trap "echo sig 15" 15
# 2号信号表示 Ctrl+C
trap "echo sig 2" 2
# 输出当前进程号
echo $$
#保持进程不结束
while :
do
:
done
vim sed awk
- vim是交互式的。有正常模式、输入模式、视图模式等等,实时与用户进行交互的编辑器。sed awk 是非交互的,在执行之前就要指定好逻辑
- sed awk 是 行编辑器
sed末世空间
将文件以行为单位读取到内存
使用sed的每个脚本对该行进行操作
处理完后输出该行
sed ‘s/被替换内容/替换内容’ 只替换匹配的第一个
额 本文暂时没人评论 来添加一个吧
发表评论