这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记。
记录自己比较欠缺的 linux 基础知识。包括一些常用的 linux 系统指令,文件结构,系统权限等相关知识。
UNIX 哲学
- 每个程序只做一件事情,并把这件事做好
- 一个程序的输入可以作为另一个程序的输出,不输出无关内容
- 编写处理字符流的程序,因为那时通用接口
- 编写可以相互协作的程序
文件权限 chmod
权限
4:代表 r 权限
2:代表 w 权限
1:代表 x 权限
权限组合也可以用其他的八进制数字表示出来,如:
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 没有权限
常用指令栗子
# 所有人可读写执行
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 等信息。
Host aliDocker
HostName 47.101.131.122
User niku
Port 2000
使用 ssh-copy-id aliECS 指令,自动将公钥上传到刚刚配置的服务器 aliECS 上。
常用命令
- man 查看命令手册
- whereis 查询命令文件位置
- file 查看文件类型
- who 查看当前在线的用户
- whoami 查看自己登入的账户
- pwd 查看当前所在路径
- clear 清屏
- history 查看命令历史(加 -c 清楚历史命令记录)
- reboot 重启
- uname -r 查看系统内核
- lsmod 显示载入的系统模块
- grep 查找字符串
- head/tail 显示文件的前十行和后十行(默认),添加参数
-f会实时打印出文件的改动 - which 查看脚本的路径位置
- mv 剪切+粘贴(重命名)
一些符号
- $ 环境变量和 win 的差不多
- ~ 表示家目录
- - 用于表示参数(一般简写用- 全单词用--)
. 和 ..
linux 文件目录下中如果使用 ls -a 命令时会发现所有文件都存在一个 . 文件和一个 .. 文件。
- . 表示当前文件目录
- .. 表示上一级文件目录
有 / 和无 /
- 文件目录下有 / 一般表示绝对路径,即根目录开始。
- 无 / 表示当前目录下开始。
管道 |
可以连接指令,将上一个指令的标准输出作为下个指令的标准输入。支持多个工作流,管道的命令如果没有依赖关系则会并行执行。
man less | grep -n sim | grep that >> that.txt
重定向符号 > 和 >>
- 重定向:改变标准输入和标准输出设备。
- 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
- 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。
>: 会清空原有文件内容后输入
>>: 在文件后追加输入
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 各个用户共用的一个应用安装目录
软件黑名单 blacklist.conf
在安装英伟达的显卡驱动时会用到 blacklist ,需要把 Linux 自带的显卡驱动 Nouveau 禁用并加入到黑名单中。
# 用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 文件。
在这里面配置环境变量后,需要重启才能生效。
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 运行的通常二者设置大致相同,所以通常前者会调用后者。
# 临时环境变量,关闭终端后失效
export PATH="$PATH:$HOME/.local/bin"
开放端口
需要通过修改 ufw。
# 查看防火墙状态
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
例子
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
比如我想用手机的客户端链接本地的服务调试代码。
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:以太网信息
enp0s0:
| | |
v | |
en| | --> ethernet
v |
p0| --> bus number (0)
v
s0 --> slot number (0)
查看端口占用
sudo netstat -tunlp