让操作系统去做你指定的事,最直接的就是在终端里面发送指令,这里的指令一般就是去执行对应文件
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日志
# 不要用cat
less access.log
# 获取前十行,日期 + ip
awk '{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[@]}
do
echo $ip
# bash -s会提示使用标准输入流作为命令的输入,而 < $script负责将脚本文件内容重定向到远程bash的标准输入流
ssh $ip 'bash -s' < $script
done
权限最小化 > create_test.sh
# 增加test用户
sudo useradd -m -d /home/test test
sudo passwd test
# 添加test用户到sudo组
sudo usermod -G sudo test
# 设置test用户的初始化shell是bash
sudo 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=$1
pubkey=$(cat ~/.ssh/id_rsa.pub)
echo "execute on .. $ip"
ssh test@$ip "
mkdir -p ~/.ssh
echo $pubkey >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
"
为所有集群安装Java环境 > install_java.sh
sudo apt -y install openjdk-11-jdk
sudo useradd -m -d /opt/ujava ujava
sudo usermod --shell /bin/bash ujava
sudo 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