Linux教程

Linux命令学习笔记

本文主要是介绍Linux命令学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.基本命令

日期

date

日历

cal [month] [year]
cal 2015
cal 10 2015

数据同步写入磁盘

sync

关机

shutdown

重启

reboot 

2.文件相关命令

列出文件

ls -al

修改用户组

chgrp [-R] 用户组名称 文件或目录

修改拥有者

chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:用户组名称 文件或目录

修改权限

一般权限
chmod [-R] 777 文件或目录 # rwxrwxrwx 系数(r:4, w: 2, x: 1)
chmod u=rwx,go=rx 文件或目录 #rwxr-xr-x
chmod a+w 文件或目录    #给owner groud other都加上w权限
chmod u-x 文件或目录    #给owner 减去x权限

特殊权限
SUID、SGID、SBIT(系数分别为,4,2,1)
SUID:仅对二进制程序有效,执行者在执行该文件期间具有该程序拥有者权限
SGID:仅对二进制程序有效,执行者在执行该文件期间具有该程序用户组权限
SBIT:仅对目录有效, 用户在该目录下建立文件,仅有root和该用户才有权利删除该文件

chmod 4755 test # 加入SUID权限 rwsr-xr-x
chmod 6755 test # 加入SUID/SGID权限 rwsr-sr-x
chmod 1755 test # 加入SBIT权限 rwxr-xr-t

切换目录

cd [相对或绝对路径]

显示当前路径

pwd

创建新目录

mkdir test
mkdir -m 711 test
mkdir -p test1/test2/test3

复制文件和目录

cp 源文件 目标文件
-p: 连同文件属性一起复制
-r: 目录的递归复制
-i: 覆盖时询问
-a: 全部属性复制 

删除文件和目录

rm 文件或目录
-r: 递归删除
-f: 忽略不存在文件,不报错

移动文件和目录

mv source1 source2 source3 ... 目录
-i: 询问覆盖 
-f: 直接覆盖,不询问

获取文件名和目录名

basename 路径
dirname 路径

查看文件

cat
less #可翻页
head -n 10 文件   #查看头部10行
tail -n 10 文件   #查看尾部10行
od -t [acdfox] 文件   #查看非纯文本文件

新建文件或修改文件时间

touch 文件
-d: 后接时间
-c: 仅修改时间,不建立新文件

文件默认权限

umask
umask 002 # rwxrwxr-x 后接数值是对应减掉的权限

查看文件格式

file 文件名
# ascii文件、data文件、二进制文件

查找文件

which command  # 查找命令的位置,根据环境变量PTAH查找

whereis 文件和目录名

locate keyword # 根据数据库记录查询, updatedb 更新数据库
-r: 表明后接正则
-l: 输出行数
-i: 忽略大小写

find [PATH] [OPTION] [ACTION]
-mtime n: 在前第n那天被修改的文件
-mtime +n: 在n天前被修改的文件
-mtime -n: 在n天内被修改的文件
-uid 用户id
-gid 用户组id
-user 用户名
-group 用户组名
-name 文件名
-size [+-]文件大小:查找比指定文件size大或者小的文件
-perm mode:权限等于mode的文件
-perm -mode: 权限等于或包含mode的文件
-perm /mode: 包含任一mode权限的文件
# 根目录下找出文件名包含passwd的文件
find / -name passwd 
# 根目录下找出在前第三天被修改的文件
find / -mtime 3
# 根目录下找出含有SUID、SGID、SBIT权限的文件
find / -perm /7000

3.磁盘和文件系统

列出文件系统及其容量

df -h
-h:人性化显示
-i: 显示inode数量

列出目录容量

du -sh 文件和目录
-s: 列出总量
-h:人性化显示

建立链接

ln -s 源文件 目标文件 # 不加-s为硬链接,否则为符号链接

列出系统上磁盘列表

lsblk

4.压缩和解压缩

压缩

tar -jcv -f filename.tar.bz2 文件或目录
-z: gzip[*.tar.gz]
-J: xz[*.tar.xz]
-j: bzip2[*.tar.bz2]

解压

tar -jxv -f filename.tar.bz2 文件或目录

5.shell

查询命令

type 命令

列出环境变量

env

列出所有变量

set

键盘输入读取变量

read 变量名

命令别名设置

alias rm='rm -i'

查看输入的历史命令

history

管道

cat > test # 新建test文件
> 标准输出(覆盖)
>> 标准输出(追加)
< 标准输入(覆盖)
< 标准输入(追加)

查找信息

grep '查找字符或正则' [file or stdin]

排序

sort [file or stdin]

去重

uniq [stdin]

参数代换

xargs 命令
find /usr/sbin -perm /7000 | xargs ls -l

文本处理

sed [n1[,n2]] function [stdin]
function: a新增, c替换, d删除, i插入, p打印, s正则替换
nl /etc/passwd | sed '2a drink tea' # 在第二行后加上drink tea

awk '条件类型1(操作1)条件类型2(操作2)...' [filename | stdin]
NF:每行字段总数
NR:当前为第几行
FS:分隔符

last -5 | awk '{print $1 "\t" $3}' # 打印出last命令第1列和第三列
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' #以:为分隔符,打印符合条件第3列小于10的行中的第1和3列

文件对比

diff fromFile toFile

在当前bash进程中执行shell文件

source xxx.sh

检测文件相关属性

test [options] [文件名]

shell脚本的变量

$0 命令文件名
$1, $2, $3, $4....   接在后面的参数
$# 参数的个数
$@ 所有参数

shell文件调试

sh [option] 文件名
x: 输出当前执行的命令脚本
v: 输出所有脚本内容

shell语法

数组
array_name=(value1 value2 ... valuen)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

算术运算符
val=`expr 1 + 1`
val=`expr 1 - 1`
val=`expr 1 \* 2`
val=`expr 1 / 2`

[$a 运算符 $b]
关系运算符包括:-eq, -ne, lt, -gt, -le, -ge
布尔运算: !(非运算),-o(或),-a(且)
逻辑运算: &&、||
字符运算: 字符串是否相等(=)、不等(!=)、-n(字符串长度不为0返回true)

条件语句
if [ $a == $b ] then
  echo "a 等于 b"
fi 

if [ $a == $b ] then
   echo "a 等于 b"
elif [ $a -gt $b ] then
   echo "a 大于 b"
elif [ $a -lt $b ] then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

case "$site" in
   "runoob") echo "菜鸟教程"
   ;;
   "google") echo "Google 搜索"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac

循环
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while(( $int<=5 ))
do
    echo $int
    let "int++"
done

for((i=1;i<=5;i++))
do
    echo "这是第 $i 次调用";
done
跳出循环:break
跳到下一循环: continue

函数
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

6.账号相关

查看当前用户支持的用户组

groups

切换当前用户用户组(必须是已加入的用户组)

newgrp 用户组名

新增用户

useradd [-u UID] [-g 初始化用户组] [-d 家目录绝对路径] [-s shell] 账号名称

设置或修改密码

paaswd [账号名称]

修改用户账号属性

usermod [options] [账号名称]

删除用户

userdel [-r] [账号名称]

查看用户信息

id 账号名称
finger 账号名称

用户组的增删改

groupadd [-g gid] 用户组名称
groupmod [-g gid] [-n 新组名] 用户组名称
groupdel 用户组名称

切换用户

su [-lm] [-c 命令] 用户名
su -  #切换到root
su - zjw #切换到zjw 

使用某账号的身份执行命令

sudo [-u 账号] 命令
# 通过/etc/sudoers 来查看用户是否有sudo权限

查看当前登录的用户

who

查看用户登录历史记录

lastlog
last

发送邮件

mail -s 邮件标题 用户
mail -s "hello" zjw < ~/test

7. 计划任务

一次性任务

at [-mldv] 时间
at -c 任务号码
at now + 5 minutes
at -c 1
at 23:00 2020-09-08

列出当前的一次性任务

atq

删除当前的一次性任务

atrm 任务号

在cpu任务负载小于0.8时执行计划任务

batch

循环计划任务

crontab [-u 用户名] [-e | -l | -r]
-e: 编辑
-l: 查看
-r: 删除所有任务


0 12 * * * mail -s "at 12:00" zjw < ./test
# 每天12点都发送邮件到zjw邮箱

0 3,6 * * * 命令
# 每天3点和6点执行命令

20 8-12 * * * 命令
# 8点至12点,每小时的20分都执行命令

*1/5 * * * * 命令
# 每隔5分钟执行命令


# 系统配置文件
/etc/crontab、/etc/cron.d/*

8. 进程

将命令放到后台执行

命令 &

将目前任务放到后台中暂停

[crtl] + z

查看后台任务状态

jobs [-lrs]

取出后台任务

fg %任务号
fg %1  # 取出1号任务

将后台任务状态由暂停转变为运行

bg %任务号

杀掉进程

kill -signal %任务号
killall -signal 命令名称 
-1: 重新读取配置文件,reload
-2: ctrl + c
-9: 强制结束
-15: 正常结束

脱机后台运行任务

nohup 命令 &

查看进程

ps -l # 查看当前bash相关的进程
ps aux  # 查看系统所有进程
ps -ez # 查看进程的selinux相关信息

状态:
R: 运行
S: 休眠
+: 处于前台
s: 一些子进程的leader进程

动态监测进程状态

top [-d 间隔秒数] [-p 指定PID]

查看进程树

pstree -A [-up]

调整nice值,影响进程执行优先级

# 执行命令时,指定nice值
nice -n 数字 命令
# 调整已有进程的nice值
renice 数字 PID

数字范围: -19 - 20

查看系统信息

uname -a

查看网络连接服务信息

netstat [option]
-a: 列出所有信息
-t: 列出tcp链接
-u: 列出udp链接
-p: 列出pid
-l: 列出正在监听的服务
-n: 显示端口号

发出网络请求

# Get请求
curl https://www.example.com

# POST请求
curl -d'login=emma&password=123'-X POST https://google.com/login 

# 带header
curl -H 'Accept-Language: en-US' https://google.com

# 将响应保存为为文件
curl -o example.html https://www.example.com

# 显示响应的头部信息
curl -i https://www.example.com

查看系统资源信息

vmstat

查找进程pid

pidof 程序名

查找进程所使用的文件

lsof [-aUu] [+d 目录]
-a:条件同时成立
-u:接用户名
-U:列出socket文件
+d:后接查找目录

查看/设置SELinux模式

getenforce
# enforcing: 开启并正常运行
# permissive: 开启但不限制,只触发警告
# diabeld: 完全关闭

setenforce [0|1]
# 0: 对应permissive
# 1: 对应enforcing

查看当前SELinux策略

sestatus

查看当前SELinux规则的布尔值

getsebool

9. 服务

管理单一服务

systemctl [命令] [服务unit]

命令:
start 启动服务
stop 关闭服务
restart 重启服务
reload 重新加载配置文件
enable 下次开机时,启动unit
disable 下次开机时,不启动unit
status 列出服务状态
is-active 查看目前有没有运行
is-enable 查看目前有没有启用
mask 注销服务,服务不可被自启动或被唤醒
unmask 取消注销服务
show 查看服务详细信息

服务类型包括:service、socket(内部程序交换)、target(服务集合)、mount(挂载相关)、timer(循环执行的服务)等

服务状态:
active(running、exited、waiting):运行、一次运行、等待执行
inactive:未运行
enabled:开机时会被启动
disabled:开机时不会被启动
static:不可自己启动,可被其他服务唤醒
mask:无论如何都无法启动

# 关闭atd服务
systemctl stop atd.service

查看所有服务

systemctl [命令] [--type=类型] [--all]

命令:
list-units: 列出当前启动的unit,加上--all才会列出没启动的
list-unit-files: 依据/usr/lib/systemd/system/内的文件,进行列出说明

类型: 服务类型 service、socket、target等

查看/设置操作模式 target

systemctl [命令] [操作模式]

命令:
get-default: 取得目前的target
set-default:设置后面接的target为默认模式
isolate: 切换到后接的模式

操作模式:
graphical.target: 图形界面
multi-user.target: 纯命令行
rescue.target:临时系统
emergency.target: 紧急处理
shutdown.target: 关机模式
getty.target: 设置tty数量

快捷操作:
systemctl poweroff 关机
systemctl reboot 重启
systemctl suspend 挂起
systemctl hibernate 休眠

分析服务依赖

systemctl list-dependencies [服务unit] [--reverse]

服务配置文件

位置:/usr/lib/systemd/system/、/etc/systemd/system/

示例配置文件
[Unit] 执行服务依赖性相关
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service] 与执行的命令参数有关
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install] 挂载unit到哪个target
WantedBy=multi-user.target

新增或修改服务配置文件后,使systemd重新读取配置

systemctl daemon-reload 

10. 日志

各类服务日志文件常见位置:/var/log/

rsyslog.service 的配置文件: /etc/rsyslog.conf

# info级别以上的mail信息都记录到/var/log/maillog_info中
mail.info    /var/log/maillog_info

#重要服务类别
0 kern 内核产生信息
1 user 用户层级产生的信息,例如logger命令
2 mail 邮件
3 daemon 系统服务
4 auth 认证、授权相关
5 syslog rsyslogd程序本身产生的信息
6 lpr 打印机相关
7 news 新闻组
9 cron 计时任务
11 ftp相关任务
16-23 保留给本地终端用户使用

# 信息等级
debug
info
notice
warning
err
crit
alert
emerg

查看日志

journalctl  [-nrpf] [--since 起始时间] [--until 终止时间] [选项]

-n 后接显示行数
-r 颠倒顺序,从最新到最旧的信息
-p 后接信息等级,info、err等
-f 持续刷新显示

选项:
_PID=pid 只输出该pid相关信息
_UID=uid 只输出该uid相关信息
_SYSTEM_UNIT=unit.service 只输出该服务相关信息
SYSLOG_FACILITY=[0-23] 只输出对应服务类别的信息

示例
journalctl --since "2020-06-01 00:00:00" --until "2020-06-02 00:00:00"
journalctl --since today
journalctl -p err
journalctl _SYSTEM_UNIT=crond.service -n 10

输出信息到日志保存

logger [-p 服务名称.等级] “信息”

示例
logger -p syslog.info "1234"

11. 内核和软件源码编辑

Centos Linux内核启动流程:

  • BIOS:Basic Input Output System,加载CMOS内主机硬件配置信息,读取MBR(Master Boot Record,主引导记录)中 boot loader
  • boot loader: 操作系统启动引导程序
  • kernal + inittramfs:操作系统内核、虚拟文件系统用于启动系统模块
  • systemd: 启动 default.target 中的各种系统和用户服务

makefile

目标(target): 目标文件1、目标文件2
<tab>	gcc -o 建立的可执行文件名称 目标文件1 目标文件2

OBJ = main.o haha.o sin_value.o # 变量
main: ${OBJ}
	gcc -o main ${OBJ}
clean: # 清除
	rm -f main.o haha.o sin_value.o

详细语法:https://seisman.github.io/how-to-write-makefile/introduction.html

安装软件

yum [选项] [命令] [参数]
选项:
-y: 执行自动提供yes
--installroot=/some/path: 将该软件安装到/some/path
命令:
search: 搜索某个软件
list: 列出目前所有软件与版本
info: 列出某软件的详细信息
provides: 从文件去查找软件
install: 安装
update: 更新
remove: 删除

yum配置文件
/etc/yum.repos.d/CentOS-Base.repo

12. 相关概念及命令扩展阅读

inode: http://www.ruanyifeng.com/blog/2011/12/inode.html
SELinux: https://zhuanlan.zhihu.com/p/30483108
curl命令:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
磁盘阵列RAID:https://zh.wikipedia.org/wiki/RAID
make命令语法: https://seisman.github.io/how-to-write-makefile/introduction.html
linux 父/子进程: http://wuchong.me/blog/2014/07/24/linux-process-manage/

这篇关于Linux命令学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!