Linux & Mac terminal

Linux basic command

command repo

普通命令

  • cd

cd ../.. 直接回到根目录,对应在finder中使用 ⇧+⌘+h

  • ls

ls -al == ls -la

ls -l == limit

ls -a 看全部的

ls -l 看权限 (可以查看某一个文件的权限 : ls -l myfile)

左到右 一共十位 构成是 type | rwx | rwx | rwx

type: p、d、l、s、c、b和-

  • p表示命名管道文件
  • d表示目录文件
  • l表示符号连接文件
  • -表示普通文件 //myfile作为一个txt文件 属于普通文件
  • s表示socket文件
  • c表示字符设备文件
  • b表示块设备文件

剩下9位 每3位一组 分别表示文件所有者的权限,同组用户的权限,其他用户的权限

⚠️ 首先描述的是所有者的权限 而不是根用户的权限

  • r表示可读,可以读出文件的内容
  • w表示可写,可以修改文件的内容
  • ==x表示可执行,可运行这个程序 // execute==
  • 没有权限的位置用-表示 「所有者 是否可读、可写、可执行|同组用户是否可读…」

.作为分割, 之后则是文件的其他属性

  • 1 $\Rightarrow$ 有一个硬连接
  • root $\Rightarrow$ 所属用户 | 之后的 root $\Rightarrow$ 用户所属的组
  • 0 $\Rightarrow$ 文件字节数
  • 时间 $\Rightarrow$ 最后修改时间
  • mkdir

    • rmdir 删除目录
  • pwd 显示路径 「print working directory」

  • cat 显示文件 + 文件连接

    • cat -n 显示行号

cat textA > textB 我们把A中的内容给拿到B里了,但B里的内容会被overwrite

cat testA >> textB 这次则是追加

  • touch 文件存在=>修改时间戳|文件不存在=>创建文件

  • echo 显示一行的内容

  • rm 删除文件

    • rm -rf (r $\Rightarrow$ recursive | f $\Rightarrow$ force) 可以删除目录 子目录和其中的文件一起全部删除
  • mv 移动文件 也可以改名

  1. 文件 $\Rightarrow$ 文件 改名字
  2. 文件 $\Rightarrow$ 目录 移动到目录中(⚠️工作目录)
  3. 目录 $\Rightarrow$ 目录 | 如果后面的目录存在,就移动到这个目录下|如果不存在就改目录名
  4. 目录 $\Rightarrow$ 文件 报错
  • cp 文件和目录复制

语法: cp[options] source dest

-r 复制目录时的参数 可以把目录下所有的文件都复制。 ⚠️ 如果不加这个参数 目录的复制会直接跳过

  • more & less

  • grep 文本字符串过滤

  • wc 文本内容信息统计

  • file 可以测试文件类型


su & sudo

  • su是直接切换成超级用户 su- / su + 用户名 可以拿来登陆
  • 使用sudo命令时不需要知道超级用户的口令 使用的是自己的口令

用户&组

  • linux中有三种权限不同的用户: 超级用户 root伪用户(不能直接登陆系统) | 普通用户(可以登陆 但只可以管理自己的目录)
  • 伪用户存在的意义:在使用特殊服务时 我们会自己以伪用户登陆(比如匿名访问ftp客户端 使用ftp客户)
  • 是用户的集合 用户被加入组来获得额外的存取权限,因为组中所有的用户都可以共享属于该组的文件。 以下介绍 私有组主组的概念
  • 在linux中 如果创建用户时没有制定他所属的组,那么系统将会建立一个和用户同名的私有组,这个私有组里只有这个用户「这样在这个新用户中创建的文件不会在公共组中被查到」(私有组都只有一个用户)
  • 在linux中 用户可以同时属于多个组 但只能在一个主组中(在创建用户时 指定一个标准组 那这个用户就属于这个标准组,否则它自己的私有组就是自己的主组)

用户管理命令

users 查看可登陆用户

  • useradd [-options] username
    • -d 指定这个用户的主目录 缺省时会在/home创建
    • -g 指定新建用户所在主组名称 缺省时创建和用户名相同的组
    • -G 指定新建用户所在附加组名称 系统会在这之后创建和用户名相同的组作为新建用户的主组
  • usermod 属性修改 (不能修改正在线上的用户的名称、不能修改正在系统上执行程序的用户ID)
    • -c comment 账户注释
    • -d home_dir 设置用户主目录
    • -e expiredate 设置过期日期
    • -u uid 修改用户ID 格式:usermod -u NATSU natsumi //把natsumi改成NATSU
    • -l login 修改用户名 格式:usermod -l NAT natsumi // 把natsumi改成NATSU
    • -g group 强制修改用户的新主组 | -G groups 修改附加组列表
      • 比如: usermod -g groupf natsumi //把natsumi加入到groupf组里 (主组)
      • usermod -aG sudo natsumi 把组sudo添加到natsumi的附加组列表 这样natsumi可以执行sudo命令 -G是不行的
    • -L / -U 锁定、解锁用户账户
    • -s shell 设置登录后的shell
  • userdel
    • -f 强制删除 (现在正登陆的用户也可以删除)
    • -r 递归删除 会同时删除用户的主目录

组管理命令 groups [username] 查看用户加入的组

  • groupadd
    • -g 可以指定新建组的ID
  • groupmod 属性修改
    • -n 修改组名 和修改名字一样 是先输改动之后的名字 后输改动之前的名字
  • groupdel ⚠️ 如果组里有用户 需要先删除用户 再删除这个组
  • gpasswd
    • -a [username] [groupname] 添加一个成员到组内
    • -d [username] [groupname] 从组内删除一个成员
    • -M [usernames] [groupname] 设置成员列表
    • -A [usernames] [groupname] 设置组的管理员列表
    • -r 删除组的密码
    • newgrp 切换用户当前的主组(这个切换需要输入密码 并且是暂时的)

用户密码管理 passwd

  • 普通用户根据原密码修改自己的密码 而超级用户可以重置包括root在内的所有用户密码
  • passwd [-options] [username]
  • -d delete 删除密码
  • -l lock 锁定账户
  • -u unlock 解锁账户
  • -S status 显示状态信息

与用户管理相关的文件有

  • –/etc/passwd 用户名和 UID 保存在此

    • 如图 UID < 1000的 是系统用户(伪用户) /sbin/nologin
    • 超级用户 UID = 0, GID = 0
  • –/etc/shadow 用户口令(密码)

    • 使用:作为分隔符 共有9个字段
    • 用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
  • –/etc/group 组和GID

  • –/etc/gshadow 组口令被保存在

  • –/etc/login.defs 相关配置参数

  • –/etc/default/useradd

成批生成用户

newusers [filename] filename 的格式要和 /etc/passwd 一样才行 利用filename文件生成

成批创建密码

chpasswd [filename] filename 每行都应为如下格式: username:passwd

我们还可以使用pwgen命令 它可以批量生成口令


linux文件系统 在linux中不同分区构成一颗唯一的目录树

文件类型

  • 普通文件
    • 文本文件 行是其基本结构
    • 数据文件 (电子表格 数据库)
    • 可执行二进制文件
  • 目录文件 就是目录 它也是一种文件 存储一组相关文件的位置、大小等与文件有关的信息
  • 符号连接文件 指向同一索引文件 使用ls查看时 以字母l开头 -> 指向链接的文件
  • 设备文件 外设在linux中也被看作文件 它们被放在/dev 目录中
    • /dev/fd0 $\Rightarrow$ 软盘 | /dev/hda $\Rightarrow$ 硬盘

隐藏文件 :以 . 开头 使用ls不显示

  • /bin Binaries 存放二进制命令 | /usr 存放普通用户的应用程序、库文件、文档 | /lib Libraries
  • /dev Device 设备目录(disk screen)
  • /etc 系统配置文件
  • /sys System 系统信息 | /tmp Temporary files 临时文件 | /var Variable files 属性经常变化的文件(文件大小、时间、内容经常变化)

文件名通配符 这个很好用

  • 号 file * 可以匹配0个和任意多个字符 如file123、fileac 「rm file 这几个文件全都被删除」
  • ?号 只和一个字符匹配 file? $\Rightarrow$ file1 但不可以实现file? $\Rightarrow$ file23
  • []号 和方括号中的 一个字符匹配(但可以同时输入多个字符) 加入!后的是excluded
    • file[1-4] $\Rightarrow$ file1 .2 .3 .4 //
    • file[!1234] $\rightarrow$ file 1,2,3,4 之外的其他所有
ln file1 file2 让file1和file2 建立硬链接 | ln -s file1 file2 则是建立软链接

硬连接: file1 和 file2同时指向某个储存空间 (删除file1 对 file2没有影响)

软链接: file2指向file1 而file1才指向一个存储空间 所以file1如果被删除了file2就废了

文件权限

root用户(超级用户)享有最高权力 它可以修改/etc/shadow 账户管理的文件

rwx 在list命令中已经讲解过 但==值得注意的是 在管理目录文件时 x 是指进入目录(使用cd命令)这也是rw命令的基础 没有x命令权限 也不能进行rw== ⚠️ 在只有x权限时 不可以删除文件 也不能列举出文件夹所有文件 比如知道文件名才能访问

在目录中 w权限是最高权限

  • chown [change owner]改变文件/目录的所有者 ⚠️只有root用户才可以改变文件所有者(文件的所有者可以改变文件所属的组)

    • chown natsumi file1 //把file1 的主人换成natsumi
    • -R recursive 只适用于目录 | -v verbose 为处理的所有文件显示诊断信息 显示chown命令所做的工作
    • chown -R natsumi:group1 /tmp //把/tmp 目录的主人变成 matsuri 和 组 group1
  • chgrp 改变文件/目录所属的组

  • chmod 改变文件/目录的权限 同样支持 -R / -v

    • linux 不允许用户在创建一个普通文件时 就赋予其可执行权限 必须使用chmod修改
    • chmod [who] [+|-|=] [permission] [filename]
      • +/- 添加或减少某权限
      • = 直接赋予某权限 但取消其他所有权限
    • u 主人 g 同组 o 其他 a 所有 (权限有3组 user | 同组 | 其他人) (这个放在 who 一栏 不需要-)
    • chmod a+x file1 // 使所有用户都可以执行file1文件
  • umask 设置文件的缺省生成掩码 「umash规定 不允许 的权限」

    • 文件权限的二进制写法: rwx 用0/1 3个二进制表示 然后转十进制数 一共3组
    • 缺省状态下 文件的默认权限为 0666(所有人具有读写权限 但无法执行) 文件夹则为0777「⚠️ 这是缺省时的权限 不是缺省时的mask」
    • 大多数情况下 root默认mask 0022 普通用户则是 0002 实际权限 = 缺省权限-mask
    • 那么实际上的权限就是 root:文件 0644 文件夹0755 | 普通:文件 0664 文件夹 0775

FACL(ACL) 「File Access Control Lists」

如果要细化规定 组内的每个成员具有的不同的权限时 就需要用到ACL权限

  • getfacl [file/dir]

  • setfacl

    • -R recursive| -m 修改ACL | -x 删除ACL | -r 要设置的ACL规则

      setfacl -x u:st /project 删除用户的ACL权限

      setfacl -b project/ 删除目录上所有的ACL权限

默认的ACL权限只对目录有效

设置默认facl后该目录下新建立的文件和目录都会自动用于ACL权力

setfacl -m d:u:用户名:权限 文件名 更改默认facl

setfacl -R-m u:用户名:权限 文件名 只有已经创建的文件会被更改文件权限 其他的则不会

特殊权限

  • 可执行文件
    • SUID 使用命令的所属者的权限来运行 (而不是命令执行者的权限) ⚠️ 只对二进制可执行文件生效
      • 占用文件主人的x位 变为s 如修改普通用户修改密码 虽然只有root用户可以访问和修改 但由于s位 普通的用户也可以访问/etc/shadow 「可以访问 但是cat读取不了!」
    • SGID 使用命令的组权限来运行 占用组的x位 变为 s
  • 目录的特殊权限
    • SGID 设置该权限的目录中创建的文件 会具有该目录的组权限
    • Sticky-bit 带有粘滞位的目录中的文件只能被文件的所属用户和root用户删除(无视权限设置)
      • 占用 other的x位 变为 t

文件系统

查看分区情况:

•fdisk -l

•df -lh

•lsblk

•blkid

mkfs

lsblk

fdisk /dev/sdc

+5G


vi编辑器

  • 强退 q! //⚠️ !+cmd $\Rightarrow$ 回到SHELL

  • 重做 $\Rightarrow$ ⌃ + r

  • u $\Rightarrow$ undo

  • :下

    • set nu 加入行号
    • set nonu 不要行
    • syntax on: 开启语法高亮
    • :set number: 显示行号
    • :set tabstop=4: 设置 Tab 键宽度
    • :set expandtab: 使用空格替代 Tab
    • :set softtabstop=4: 设置软件 Tab (自动Tab)宽度为 4
    • :set shiftwidth=4: 设置自动缩进宽度为 4
    • :set autoindent: 开启自动缩进,通常用于编写程序
    • :set textwidth=20设置行的宽度
    • :set wrap 设置自动换行

管道与重定向

管道:将前面命令的结果 作为下一个命令的输入来执行 |

  • echo 平常会使用”” 转义字符 在之前加上\ 就可以正常输出了

  • tr -c -d -s [“string1”] [“string2”] < input-file

    • -c 没有出现在字符串1中的 字母 将被替换为字符串2中的 最后一个字母(ASCII字符才可以)
    • -d 删除字符串1中出现了点所有输入字符
    • -s 如果没有string2 将string1字符去重 如裹有string2 去重之后再用string2替换1
    • input-file 是转换之后的文件名

进程管理

查看进程

  • ps process status 静态查看当前的进程
    • 输出 PID TTY(终端) 运行时间 ⌘(产生该进行的命令)
    • ps -l 获取PID
  • top 动态 3s刷新
    • P $\Rightarrow$ CPU使用率排序
    • M $\Rightarrow$ 内存使用率排序
    • N $\Rightarrow$ PID排序
    • q 退出top
  • pstree

杀死进程

  • kill 这个命令向进程发送信号 而不是直接杀死进程
    • kill -[sign] PID // kill -1 2246 让2246进程重启 ⚠️ - 不能去 所以 1 实际上是-1
      • 1 立即关闭进程然后重启
      • 2 终止前台进程
      • 9 强制终止
      • 15 优雅的退出(程序可以自己选择 退还是不退)
      • 18 唤醒暂停的进程
      • 19 暂停前台进程 == ctrl+z
  • killall
  • pkill 利用进程名称杀死进程 可以杀死终端

进程有其ProcessID 「PID」

还有4种识别号:

  • real user ID 「RUID」 | real group ID 「RGID」 $\Rightarrow$ 识别正在运行此进程的用户和组
    • 一个进程的RUID和RGID就是运行此进程的UID / GID
  • effect user ID 「EUID」| effect group ID 「EGID」$\Rightarrow$ 确定一个进程对其访问的文件的权限
    • 如果SetUID/SetGID 没有被设置 那么它们

进程优先级

优先级为 -20 - 19 共40级 数字越大 优先级越低 默认时为0

  • nice -n 5 top top命令来到优先级5 // 需要在运行命令前调整!
  • renice //可以调整正在运行的命令 分为 在top内调整 和 直接renice两种
    • 打开top命令 tpye r 输入调整进程号和优先级值
    • 10 18625 将PID为18625的进程优先级调整为10 ⚠️ centos 先输入PID 然后调进程
    • renice +10 -u natsumi //这时不在top里 直接输就行

进程调度 只能有一个前台进程 在不执行任何前台操作时 这个进程就是SHELL

通过jobs 查看后台的命令 「只能看自己终端的」 jobs -l 显示PID

  • -& 调入后台 sleep 10000 & //如果是需要交互的命令 放入后台也无法执行

    • find / -name install.log &
    • 执行命令时 ⌃+z 也可以放入后台
  • fg %工作号 $\Rightarrow$ 把暂停的工作恢复到前台(⚠️不是PID 是工作号)

  • bg%工作号 $\Rightarrow$ 把暂停的工作恢复到后台

  • -at

    • atq 查看没有执行的工作任务
    • atrm 删除已经设置的任务
    • at -c [jobnumber]
  • -batch

  • -cron


About mac terminal

  • ohmyzsh自动补全
    • git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
    • open ~/.zshrc 在这个文件里修改 plugins=(git)=>plugins=(git zsh-autosuggestions)
  • cd ~/.oh-my-zsh/themes && ls 查看当前主题

MAC中的冷门问题


Linux & Mac terminal
https://www.mementos.top/1976/04/01/linux & mac terminal/
作者
Natsumi
发布于
1976年4月1日
许可协议