让操作系统去做你指定的事,最直接的就是在终端里面发送指令,这里的指令一般就是去执行对应文件
Linux文件系统
精髓就是,一切皆文件
- 树结构,即是文件目录结构的抽象
- 路径,绝对路径、相对路径,顾名思义
- 文件类型,常见有 7 种:
- 普通
*(比如一个文本文件) - 目录
/(目录也是一个特殊的文件,它用来存储文件清单,比如”/“也是一个文件) - 可执行(”/bin”里面的大都是可执行文件)
- 管道
|(可用作排序sort、去重uniq、筛选grep、统计wc) - Socket
=(网络插座,客户端和服务器之间同步数据的接口) - 软链接
@(相当于指向另一个文件所在路径的符号) - 硬链接(相当于指向另一个文件的指针)
- 普通
增删查改,对于文件的操作无非 4 种:
读
r- 写
w - 执行
x
对于角色的权限管理也有 3 种

举个例子,
rw--wxr-x代表用户维度不可以执行,组维度不可以读取,所有用户维度不可以写入⚠️ 开头的
-:普通文件,开头的d:文件夹
设计思想
- 最小原则:权限边界清晰,相互隔离。
- 分级保护:内核被多级保护,用户需要使用内核需要发送系统调用,并进行相关验证。
- 权限包围:专权专用,普通用户需要执行高级权限的操作,可以临时提升
高频Linux命令汇总
记不住那么多指令含义?去问man(有中文版)
| 命令 | 含义 | 基本功能 |
|---|---|---|
| pwd | Print Working Directory | 查看当前所在路径 |
| cd | Change Directory | 切换到指定目录,cd ..表示回到父目录 |
| ls | List files | 显示文件或目录信息,-F输出类型,-a输出全部(包括隐藏文件) |
| touch | Touch | 修改一个文件的时间戳,如果文件不存在会触发创建文件,生成指定名称的新文件,对于只有扩展名的文件 |
| rm | Remove | 移除指定的文件,-r递归,-f强制 |
| vi | Visual editor | 编辑文件内容,退出时先按ESC键,然后需要输入模式关键字,最常见的是入:wq表示常规的保存后退出 |
| cat | Concatenate | 输出文件内容到终端,读取大文件占内存,建议小文件使用 |
| mkdir | Make Directory | 生成指定名称的文件夹 |
| chmod | Change Mode | 改变指定文件的读写权限 |
| cp | Copy | 复制+粘贴文件或文件夹 |
| mv | Move | 剪切+粘贴文件或文件夹,也可用于重命名 |
| zip/unzip | Zip/Unzip | 压缩文件和解压 |
| grep | Global Regular Pattern | 全局正则匹配模式,配合管道符“|”可以完成非常强大的串联任务 |
| netstat | Net State | 查看网络状态 |
| xargs | Xargs | 从标准数据流中构造并执行一行行的指令,xargs从输入流获取字符串,然后利用空白、换行符等切割字符串,在这些字符串的基础上构造指令,最后一行行执行这些指令 |
| ps | Process State | 查看进程状态 |
| ssh | Secure Shell | 远程登录 |
| scp | Secure Copy | 远程拷贝文件 |
| ifconfig | Ifconfig | 查看网络接口 |
| netstat | Network status | 查看网络状态,仅查看与TCP协议相关,netstat -t tcp |
| ping | Ping | 测试网络延迟 |
| telnet | Telnetwork | 可以交互式调试和服务端 |
| host / dig | host / dig | DNS 查询 |
| curl | Curl | 可以发送各种请求包括 HTTPS,以下是发送POST示例curl -d '{"x" : 1}' -H "Content-Type: application/json" -X POST http://localhost:3000/api |
| ln | Ln | 设置软连接,例如:ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx |
| awk | Awk | 处理文本的领域专有语言 |
Linux指令实战
分析Nginx日志
# 不要用catless access.log

# 获取前十行,日期 + ipawk '{print substr($4,2,11) " " $1}' access.log | head -n 10

# 获取UV,简单用一个ip代表一个用户awk '{print $1}' access.log | sort | uniq | wc -l
集群部署管理
假定已经整了一个多台服务器的ip在iplist这个文件中,集群管理即批量操作这些ip
遍历ip
#!/usr/bin/bash# 将 iplist 文件中的每一行读取到变量ips中readarray -t ips < iplist# 循环遍历ips,$:代表求值,@:代表全部内容for ip in ${ips[@]}doecho $ip# bash -s会提示使用标准输入流作为命令的输入,而 < $script负责将脚本文件内容重定向到远程bash的标准输入流ssh $ip 'bash -s' < $scriptdone
权限最小化 > create_test.sh
# 增加test用户sudo useradd -m -d /home/test testsudo passwd test# 添加test用户到sudo组sudo usermod -G sudo test# 设置test用户的初始化shell是bashsudo usermod --shell /bin/bash test# 拷贝bash配置sudo cp ~/.bashrc /home/test/sudo chown test.test /home/test/.bashrc# test账号 sudo 时可以免去密码输入环节sduo sh -c 'echo "test ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers'
备注: /etc/profile:”系统所有用户设置环境信息 ~/.bash_profile、~/.profile:为当前用户设置环境信息 ~/.bashrc:为当前用户设置bash shell的bash信息
遍历时为集群中每一台都创建一个test用户
scp ~/remote/create_lagou.sh inpm@$ip:~/create_test.sh
打通集群权限 > tranfer_key.sh
ip=$1pubkey=$(cat ~/.ssh/id_rsa.pub)echo "execute on .. $ip"ssh test@$ip "mkdir -p ~/.sshecho $pubkey >> ~/.ssh/authorized_keyschmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys"
为所有集群安装Java环境 > install_java.sh
sudo apt -y install openjdk-11-jdksudo useradd -m -d /opt/ujava ujavasudo usermod --shell /bin/bash ujavasudo sh -c 'echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/" >> /opt/ujava/.bash_profile'
检查集群安装情况 > check_java.sh
sudo -u ujava -i /bin/bash -c 'echo $JAVA_HOME'sudo -u ujava -i java --version
⚠️ 开头的

