Linux 笔记本

博客内容如题,记录自己比较欠缺的 linux 基础知识。包括一些常用的 linux 系统指令,文件结构,系统权限等相关知识。

UNIX 哲学

  • 每个程序只做一件事情,并把这件事做好
  • 一个程序的输入可以作为另一个程序的输出,不输出无关内容
  • 编写处理字符流的程序,因为那时通用接口
  • 编写可以相互协作的程序

文件权限

权限

4:代表 r 权限
2:代表 w 权限
1:代表 x 权限
权限组合也可以用其他的八进制数字表示出来,如:

1
2
3
rwx = 4 + 2 + 1 = 7 
rw = 4 + 2 = 6 
rx = 4 + 1 = 5

用户身份

u:代表所有者(owner)
g:代表所属组(group)
o:代表其他人(others)

例如 740:
owner:7 可读可写可执行 group:4 可读
others:0 没有权限

常用指令栗子

1
2
3
4
5
6
7
8
# 所有人可读写执行
chmod 777 filename (等价于chmod u=rwx,g=rwx,o=rwx filename 或 chmod a=rwx filename)

# 拥有者可读写
chmod 600 filename (等价于chmod u=rw,g=---,o=--- filename 或 chmod u=rw,go-rwx filename) 

# 把 xx.txt 这个文件的所有者改成 root
chown root xx.txt   

配置 ssh 免密登入

免密登入步骤如下:

  • 客户端通过 ssh-keygen 生成自己的公钥和私钥。
  • 手动将客户端的公钥放入远程服务器的指定位置。
  • 客户端向服务器发起 SSH 登录的请求。
  • 服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
  • 客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
  • 服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

首先需要在自己的客户端使用指令 ssh-keygen 生成一对ssh密钥,可以后面加 -t 参数指定加密算法,如 ssh-keygen -t dsa ,之后可以一路回车。
生成的秘钥对保存在 ~/.ssh 目录下。 id_rsa 是私钥, id_rsa.pub 为公钥。
之后再 .ssh 目录下 vim 一个 config 文件,里面配置服务器的别名 IP 等信息。

1
2
3
4
Host aliDocker
    HostName 47.101.131.122
    User niku
    Port 2000

使用 ssh-copy-id aliECS 指令,自动将公钥上传到刚刚配置的服务器 aliECS 上。

用户管理指令

1
2
3
4
5
6
7
8
# 删除用户
userdel -r newuser

# 添加用户
adduser username

# 用户提权
sudo usermod -G sudo username 

常用命令

  • man 查看命令手册
  • whereis 查询命令文件搜索位置
  • file 查看文件类型
  • who 查看当前在线的用户
  • whoami 查看自己登入的账户
  • pwd 查看当前所在路径
  • clear 清屏
  • history 查看命令历史(加 -c 清楚历史命令记录)
  • reboot 重启
  • uname -r 查看系统内核
  • lsmod 显示载入的系统模块
  • grep 查找字符串
  • head/tail 显示文件的前十行和后十行(默认),添加参数 -f 会实时打印出文件的改动
  • which 查看命令的路径位置
  • mv 剪切+粘贴(重命名)

一些符号

  • $ 环境变量和 win 的差不多
  • ~ 表示家目录
  • - 用于表示参数(一般简写用- 全单词用--)

. 和 ..

linux 文件目录下中如果使用 ls -a 命令时会发现所有文件都存在一个 . 文件和一个 .. 文件。

  • . 表示当前文件目录
  • .. 表示上一级文件目录

有 / 和无 /

  • 文件目录下有 / 一般表示绝对路径,即根目录开始。
  • 无 / 表示当前目录下开始。

管道 |

可以连接指令,将上一个指令的标准输出作为下个指令的标准输入。支持多个工作流,管道的命令如果没有依赖关系则会并行执行。

1
man less | grep -n sim | grep that >> that.txt

重定向符号 > 和 »

  • 重定向:改变标准输入和标准输出设备。
  • 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
  • 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

>: 会清空原有文件内容后输入 >>: 在文件后追加输入

1
2
echo hello world >> 1.txt
cat < 1.txt

linux 文件目录结构

在 linux 系统中文件系统和 win 的差别非常大,你甚至可以用文件方式去查看一个进程。在启动一个进程时,Linux 会在 /proc 下创建一个以 PID 命名的文件夹,在该文件夹下会有我们的进程的信息。

  • bin 可执行的命令脚本等
  • boot 系统引导,一般装系统时需要单独分出一块给 boot
  • dev 包含了所有linux中使用的外部设备,但是不包含外部设备的驱动信息
  • etc 下面会放一些零零碎碎的配置文件
  • home 普通用户的家目录
  • lib 库文件
  • mnt 一些存储设备挂载信息
  • opt 用户程序目录
  • proc 进程文件
  • run 系统运行时的临时文件系统,存储系统启动以来的信息
  • sbin 管理员可执行的二进制命令文件
  • srv/sys 系统文件
  • tmp 临时文件目录,文件重启后可能会清除
  • var 经常被修改的目录放在这个目录下,包括各种日志文件重启不会清除
  • usr 各个用户共用的一个应用安装目录

系统服务指令

系统进程

Systemd,后缀 d 表示守护进程(deamons)。守护进程可以理解为 win 下的后台服务,使用 pstree 命令可以看到后缀带有 d 的就是守护进程。linux 中的进程主要分为交互进程、批处理进程、守护进程三种。

  • 交互进程:用户命令行上运行的进程
  • 批处理进程:与命令行无关的进程,如系统备份
  • 守护进程:后台动态服务 以下为守护进程指令

systemctl

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 重启系统(实际平时的reboot的完整命令就是这个)
$ sudo systemctl reboot


# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service


# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service

# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service

# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service



# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

日志 journalctl

1
2
3
4
5
6
# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

软件黑名单 blacklist.conf

在安装英伟达的显卡驱动时会用到 blacklist ,需要把 Linux 自带的显卡驱动 Nouveau 禁用并加入到黑名单中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 用gedit编辑系统黑名单
sudo gedit /etc/modprobe.d/blacklist.conf

# 最后添加上
blacklist nouveau
options nouveau modeset=0

# 更新配置文件
sudo update-initramfs -u

# 重启
reboot

# 开机后查看下载入的系统模块,若无输出则禁用成功。
lsmod | grep nouveau

modeset=0 这样系统启动时不会自动启动 Nouveau 驱动。

环境变量

系统级文件

/etc/profile: 在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。这个文件一般就是调用 /etc/bash.bashrc 文件。

在这里面配置环境变量后,需要重启才能生效。

1
source /etc/profile

/etc/bash.bashrc:系统级的 bashrc 文件,为每一个运行 bash shell 的用户执行此文件 .bash shell 被打开时,该文件被读取。

用户级文件

~/.bashrc: 该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该该文件被读取。不推荐放到这儿,因为每开一个 shell,这个文件会读取一次,效率 上讲不好。

~/.bash_profile:每个用户都可使用该文件输入专用于自己 使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的 .bashrc 文件。 ~/.bash_profile 是交互式、login 方式进入 bash 运行的 ~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

1
2
# 临时环境变量,关闭终端后失效
export PATH="$PATH:$HOME/.local/bin"

开放端口

需要通过修改 ufw。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看防火墙状态
sudo ufw status verbose

# 打开/关闭防火墙
ufw enable/disable 

# 重启防火墙
ufw reload 

# 查看已经定义的ufw规则
ufw status

# 外来访问默认允许/拒绝
ufw default allow/deny

# 允许/拒绝访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。
ufw allow/deny 20

# 允许自192.168.0.0/24的tcp封包访问本机的22端口。
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 22

# 删除以前定义的"允许/拒绝访问20端口"的规则
ufw delete allow/deny 20

例子

1
2
3
4
5
sudo ufw allow 9200 允许外部访问9200端口(tcp/udp)
sudo ufw allow 3690 允许外部访问3690端口(svn)
sudo ufw allow from 192.168.25.125 允许此IP访问所有的本机端口
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 22 允许指定的IP段访问特定端口
sudo ufw delete allow smtp 删除上面建立的某条规则,比如删除svn

其他小技巧

扫描局域网设备 ip

比如我想用手机的客户端链接本地的服务调试代码。

1
2
3
4
5
6
7
8
sudo apt-get install arp-scan

sudo apt install net-tools

ifconfig

# 查看无线网链接设备的 IP 和 mac 地址
sudo arp-scan -I wlo1 --localnet

这个指令可以查看链接的局域网网卡。

  • wlo1 : WiFi 无线网接口 NIC 可以查询 WiFi的 SSID
  • enp4s0:以太网信息
1
2
3
4
5
6
7
8
enp0s0:
| | |
v | |
en| |   --> ethernet
  v |
  p0|   --> bus number (0)
    v
    s0 --> slot number (0)

查看端口占用

1
sudo netstat -tunlp

磁盘挂载

1
2
# 查看磁盘挂载
df -lh
0%