让操作系统去做你指定的事,最直接的就是在终端里面发送指令,这里的指令一般就是去执行对应文件

Linux文件系统

精髓就是,一切皆文件

  • 树结构,即是文件目录结构的抽象
  • 路径,绝对路径、相对路径,顾名思义
  • 文件类型,常见有 7 种:
    1. 普通 *(比如一个文本文件)
    2. 目录 /(目录也是一个特殊的文件,它用来存储文件清单,比如”/“也是一个文件)
    3. 可执行(”/bin”里面的大都是可执行文件)
    4. 管道 (可用作排序sort、去重uniq、筛选grep、统计wc
    5. Socket =(网络插座,客户端和服务器之间同步数据的接口)
    6. 软链接 @(相当于指向另一个文件所在路径的符号)
    7. 硬链接(相当于指向另一个文件的指针)
  • 增删查改,对于文件的操作无非 4 种:

    1. touchmkdir>
    2. rm
    3. lscatless/morehead``/tailwhichfind
    4. vimnano>>

      Linux权限管理

      在一切皆文件的前提下,对于文件的权限管理有 3
  • r

  • w
  • 执行 x

对于角色的权限管理也有 3

image.png

举个例子,rw--wxr-x 代表用户维度不可以执行,组维度不可以读取,所有用户维度不可以写入 image.png ⚠️ 开头的- :普通文件,开头的d :文件夹

设计思想

  • 最小原则:权限边界清晰,相互隔离。
  • 分级保护:内核被多级保护,用户需要使用内核需要发送系统调用,并进行相关验证。
  • 权限包围:专权专用,普通用户需要执行高级权限的操作,可以临时提升

image.png

高频Linux命令汇总

记不住那么多指令含义?去问man(有中文版) image.png

命令 含义 基本功能
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日志

  1. # 不要用cat
  2. less access.log

image.png

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

image.png

  1. # 获取UV,简单用一个ip代表一个用户
  2. awk '{print $1}' access.log | sort | uniq | wc -l

image.png

集群部署管理

假定已经整了一个多台服务器的ip在iplist这个文件中,集群管理即批量操作这些ip

  • 遍历ip

    1. #!/usr/bin/bash
    2. # 将 iplist 文件中的每一行读取到变量ips中
    3. readarray -t ips < iplist
    4. # 循环遍历ips,$:代表求值,@:代表全部内容
    5. for ip in ${ips[@]}
    6. do
    7. echo $ip
    8. # bash -s会提示使用标准输入流作为命令的输入,而 < $script负责将脚本文件内容重定向到远程bash的标准输入流
    9. ssh $ip 'bash -s' < $script
    10. done
  • 权限最小化 > create_test.sh

    1. # 增加test用户
    2. sudo useradd -m -d /home/test test
    3. sudo passwd test
    4. # 添加test用户到sudo组
    5. sudo usermod -G sudo test
    6. # 设置test用户的初始化shell是bash
    7. sudo usermod --shell /bin/bash test
    8. # 拷贝bash配置
    9. sudo cp ~/.bashrc /home/test/
    10. sudo chown test.test /home/test/.bashrc
    11. # test账号 sudo 时可以免去密码输入环节
    12. sduo sh -c 'echo "test ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers'

    备注: /etc/profile:”系统所有用户设置环境信息 ~/.bash_profile、~/.profile:为当前用户设置环境信息 ~/.bashrc:为当前用户设置bash shell的bash信息

  • 遍历时为集群中每一台都创建一个test用户

    1. scp ~/remote/create_lagou.sh inpm@$ip:~/create_test.sh
  • 打通集群权限 > tranfer_key.sh

    1. ip=$1
    2. pubkey=$(cat ~/.ssh/id_rsa.pub)
    3. echo "execute on .. $ip"
    4. ssh test@$ip "
    5. mkdir -p ~/.ssh
    6. echo $pubkey >> ~/.ssh/authorized_keys
    7. chmod 700 ~/.ssh
    8. chmod 600 ~/.ssh/authorized_keys
    9. "
  • 为所有集群安装Java环境 > install_java.sh

    1. sudo apt -y install openjdk-11-jdk
    2. sudo useradd -m -d /opt/ujava ujava
    3. sudo usermod --shell /bin/bash ujava
    4. sudo sh -c 'echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/" >> /opt/ujava/.bash_profile'
  • 检查集群安装情况 > check_java.sh

    1. sudo -u ujava -i /bin/bash -c 'echo $JAVA_HOME'
    2. sudo -u ujava -i java --version