Linux

在Linux中,一切皆文件。

快捷键

ctrl+l: 清屏
ctrl+c: 强制终止当前命令
ctrl+a: 光标移动到命令行首
ctrl+e: 光标移动到命令行尾
ctrl+u: 从光标所在位置删除到行首
ctrl+z: 把命令放入后台
ctrl+r: 在历史命令中搜索
一次tab: 补全
两次tab: 提示
shift+pageup: 向上翻页
shift+pagedown: 向下翻页

切换目录

# 切换到主目录,等价于 cd ~
cd

# 切换到上一次工作目录
cd -

# 切换到当前目录下其他目录
cd ./demo

# 切换到上一级目录
cd ..

# 切换到其他盘
cd E:

# 显示当前目录路径
pwd

列表显示

# 显示所有文件
ls

# 显示所有文件,包括隐藏文件
ls -a

# 列出每个文件更详细的信息
ls -l

# 查看当前目录属性
ls -ld

# 列出目录中每个文件的大小( K/M/G 单位)
ls -lh

# 递归地列出子目录的内容
ls -R

# 按最后一次修改时间的顺序显示文件
ls -t

# 显示所有以app开头的文件
ls app*

权限

格式

类型: -: 普通文件、d: 目录文件、b: 块设备、c: 字符设备、l: 链接、s: 套接字

权限: r读,w写,x可执行

-rw-r--r--: 第一个-表示是普通文件,rw-表示拥有者有读写权限,r--表示组内用户有读权限,最后一个r--表示其他用户有读权限

修改权限

+: 添加权限、-: 去掉权限、=: 设置权限、u: 用户、g: 组、o: 其他

# 给文件添加可执行权限
$ chmod +x file

# 去掉文件的可执行权限
$ chmod -w file

# 给文件所有者添加可执行权限
$ chmod u+w file

# 给文件同组去掉可写权限
$ chmod g-w file

# 所有者读写执行、同组读执行、其他读执行
$ chmod u=rwx, g=rx, o=rx file

八进制设置权限

读的值是4,写的值是2,执行是1,最高权限是7(4 + 2 + 1)。

chmod 755 filechmod u=rwx, g=rx, o=rx file效果一样

显示文件内容

# 显示file1文件的内容
$ cat file1

# 依次显示file1和file2的内容
$ cat file1 file2

# 把file1和file2文件的内容结合起来,复制到file3。file3原有内容会被清除
$ cat file1 file2 > file3

# 把file1和file2文件的内容结合起来,复制到file3。file3原有内容不会被清除
$ cat file1 file2 >> file3

# 重写file1文件的内容,内容输入完毕后使用 Ctrl+d 保存
$ cat > file1

# 显示file1的开头n行
$ head -n file1

# 显示file1的结尾n行
$ tail -n file1

# 分页显示,每次显示一屏。空格键向下翻一屏(只能向下),回车键向下翻一行,q退出
$ cat file1 | more

# less 和 more 操作方式一样,唯一不同点是less可以通过上下键进行翻行
$ cat file1 | less

文件和文件夹

# 新建文件。如果存在同名文件,会修改文件的访问和修改时间
$ touch file

# 新建一个文件夹
$ mkdir folder

# 强制删除一个文件或文件夹
$ rm –rf [file | folder]

# 复制a.txt,副本为b.txt
$ cp a.txt b.txt

# 复制a.txt b.txt,副本保存到test目录
$ cp a.txt b.txt test

# 递归复制test目录,副本保存到test2目录
$ cp -R test test2

# mv命令可以对文件重命名。把a.txt重命名为aa.txt
$ mv a.txt aa.txt

# 把aa.txt文件移动到test目录下
$ mv aa.txt test

# 把aa.txt文件移动到test目录下,并改名为aaa.txt
$ mv aa.txt test/aaa.txt

# 把test目录移动到test2目录
$ mv test test2

文件搜索

find 命令和 grep 命令用于查找文件,grep 支持通过正则的方式检索文件

find

格式: find [目录] [条件] [动作] 目录:要搜索的目录及其子目录,默认为当前目录 条件:搜索文件的筛选方式 -name: 指定文件名 -type: 指定文件类型(b/c/d/p/l/f) -size: 指定文件大小,单位可以是K/M/G。+表示大于,-表示小于 -user: 指定用户 -group: 指定组 动作:匹配特定的搜索结果,也可以是文件名
# 查找根目录下名字为install.log的文件
$ find / -name install.log

# 查找/etc/目录下,大于20KB的文件
$ find /etc -size +20K

# 查找/etc/目录下,小于50KB的文件
$ find /etc -size -50K

grep

格式: grep [选项] pattern [文件名] 选项: -i: 忽略大小写; -n: 显示行号 pattern: 所要匹配的正则表达式字符串
# 在 /etc/passwd 文件中,查找包含fa字符串的行
$ grep -n fa /etc/passwd

# 过滤ls /bin输出的内容,只显示以m开头的行
$ ls /bin | grep '^m'

压缩

-c: 打包 -z: 压缩包为.tar.gz格式 -v: 显示过程 -f: 指定打包后的文件名 -x: 解压
# 把a.txt打包成a.tar.gz
$ tar -czvf a.tar.gz a.txt

# 解压a.tar.gz
$ tar -xzvf a.tar.gz

# 显示压缩包的信息
$ tar -tzvf a.tar.gz

用户管理

Linux允许创建用户和组,可以把某个用户归属于某个组。可以针对组或者用户单独设置权限

# 创建用户
$ useradd username

# 为用户设置密码,修改密码也是同样命令
$ passwd username

# 彻底删除用户
$ userdel -r username

# 切换用户
$ su username

组管理

# 创建用户组
$ groupadd groupname

# 向组中添加用户
$ gpasswd -a username

# 删除组中的用户
$ gpasswd -d username

# 设置文件所属的组
$ chgrp groupname filename

# 设置文件所有者
$ chown username filename

# 删除用户组
$ groupdel groupname

系统目录

/: 系统的根目录

/boot: 系统启动目录,存放了系统的引导程序

/bin: 存放程序的启动文件、命令。Linux 中的软件都是通过命令操作的,这些命令文件存放于 bin 目录,这个目录添加到了系统的 Path 中,所以当我们使用ls、vi等这些命令时,系统就会去 /bin 目录下面查找是不是有 ls 这个程序。

/sbin: 存放超级用户(root)的程序启动文件、程序的命令

/dev: 存放设备相关文件(包括外设),比如磁盘驱动、USB驱动、打印机驱动

/etc: 存放程序的可编辑配置文件(Editable Text Configuration)

/home: 用户目录

/root: 超级用户目录,拥有系统的所有权限

/lib: 存放库文件

/lib64: 给64位操作系统提供的库文件存放目录

/lost+found: 系统非正常关机时存放的临时文件,平常这个目录是空的

/media: 自动识别一些设备的时候(如U盘、CD),会挂载到这个地方

/mnt: 安装临时文件系统的挂载点,让用户可以挂载其他的文件系统。比如 Linux 使用的是 ext2 文件系统,你可以在这里挂载 Windows 分区的 NTFS 文件系统

/proc: 虚拟文件系统目录,用来获取系统信息。它是系统内存的映射,所以可以动态的获取系统信息

/tmp: 用于存放各种临时文件。有些linux系统会定期自动对这个目录进行清理,所以不要把重要数据放到该目录

/usr: 用来存放一些应用程序。通常我们使用包管理器下载的软件都在这个目录下(usr/local),它下面有很多子目录,用于存放不同的系统资源

/opt: 用来存放一些可选的应用程序,比如 beta 版的程序,你可以安装到这个目录下,用完之后不满意直接删除对应的文件夹即可,不会影响到其他应用程序

/sys: sysfs 文件系统挂载点,sysfs 是一种基于内存的文件系统

/selinux: Security-Enhanced Linux 的缩写,用来加强系统的安全。可以通过getenforce获取当前状态,setenforce修改状态。默认是关闭状态,可以修改/etc/selinux/config中的SELINUX=disabled永久关闭

/srv: 系统启动时可以访问的数据库目录

/var: 用于存放运行时需要改变数据的文件,比如日志文件

PATH变量

PATH变量指环境变量,使用echo $PATH可以查看当前配置的环境变量。

在全局执行某个某个命令时,会依次查找这些目录直到找到命令为止。

# echo $PATH
/Users/wmui/.bun/bin
:/Users/wmui/Library/pnpm
:/Users/wmui/.nvm/versions/node/v18.16.0/bin
:/Library/Developer/CommandLineTools/usr/bin
:/usr/local/bin
:/System/Cryptexes/App/usr/bin
:/usr/bin
:/bin
:/usr/sbin
:/sbin
:/Library/Apple/usr/bin
:/Users/wmui/.orbstack/bin
:/Users/wmui/flutter/bin

可以自己添加环境变量,打开用户目录下的.bashrc文件,文件末尾添加export PATH=$PATH:dir1[:dir2],添加好后重启命令行终端让配置生效。

防火墙

# https 部署失败可能是端口关闭导致的,开启80  443端口
ufw allow 80 # 开启 80 端口
ufw allow 433 # 开启 443 端口

ufw delete allow [port] # 删除某端口
ufw enable # 开启
ufw disable # 关闭
ufw status # 状态查询
ufw reload # 重启

当端口被占用后,使用下面命令释放端口

lsof -i:80 # 查看 80 端口应用程序的pid
kill -9 $pid # 关掉 80 端口应用程序

免密登录

配置本机免密登录服务器

# 本机和服务器分别生成公钥和私钥
git config --global user.name "wmui" # 换成自己的名字
git config --global user.email "qq22337383@gmail.com" # 换成自己的邮箱
ssh-keygen -t rsa -C "qq22337383@gmail.com" # 换成自己的邮箱

# 把本机的公钥,复制到服务器的 ~/.ssh/authorized_keys 文件
ssh-copy-id -i ~/.ssh/id_rsa.pub root@xxx.xxx.xx.xx

# 如果复制失败,修改ssh权限
chmod 700 -R .ssh && cd .ssh && chmod 600 authorized_keys