linux常用操作
Easul Lv6

这里主要是命令行中常用的代码片
常用命令操作可以参考
shell脚本中的常用命令片段可以参考

常用路径含义

YAML
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
/bin: 系统启动和运行所必须的二进制程序
/boot: Linux 内核、初始 RAM 磁盘映像,启动加载程序
/vmlinuz: linux内核
/dev: 所有设备列表
/etc: 系统层面的配置文件
/crontab: 定义自动运行的任务
/fstab: 存储设备的列表及挂载点
/home: 用户目录.普通用户只能在自己的目录写
/lib: 核心系统程序使用的共享库文件
/media: 可移动介质挂载点:U盘,鼠标等
/opt: 安装外部软件
/proc: linux内核维护,可查看内核如何维护计算机
/sbin: 存放系统二进制文件,为root用户保留
/tmp: 临时文件
/usr: 存放普通用户的程序与文件
/bin: 大多数系统程序安装目录
/lib: 包含/usr/bin程序所有的共享库
/local: 安装非系统自带程序
/bin: 存放源码编译程序
/src: 存放用户源码
/sbin: 存放系统管理程序
/share: 存放/usr/bin程序的共享数据
/doc: 软件包文档
/var: 动态文件
/log: 日志文件,活动记录

网络相关

查看mac和网卡名称

BASH
1
2
3
4
5
6
7
8
9
10
11
12
# 一般可以使用这个命令
# 第一行冒号前边的是网卡名称,ether是mac
ifconfig

# 如果没有网络,也没有安装ifconfig
# 查看mac
ip addr
# 查看网卡的UUID和网卡名称
nmcli con show
# 如果没有nmcli,但是可以从ip addr看到网卡名称
# 可以使用如下方法生成网卡的UUID
uuidgen 网卡名

SSH连接命令

BASH
1
2
3
4
5
6
7
8
# 直接在terminal连接ssh
# -p 服务器端口
# -i 指定连接服务器的私钥
ssh username@ip -p 22 -i private_key_id_rsa
# 跳板机连接
# 这里想要连接192.168.199.5,通过192.168.199.6这个跳板机进行流量转发
# 参考链接:https://article.itxueyuan.com/JZDBeP
ssh -o ProxyCommand="ssh 192.168.199.6 -W %h:%p" 192.168.199.5

设置代理

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置http代理
export http_proxy=http://127.0.0.1:1080
export http_proxy=socks5://127.0.0.1:1080
# 设置https代理
export https_proxy=http://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
# 统一设置代理
export ALL_PROXY=http://127.0.0.1:1080
export ALL_PROXY=socks5://127.0.0.1:1080
# 查看代理是否设置成功
curl http://ip-api.com/json/?lang=zh-CN
# 取消终端代理
unset http_proxy
unset https_proxy
unset ALL_PROXY

路由相关

路由添加

BASH
1
2
3
4
5
6
# 不添加网关
sudo ip route add 192.168.1.110 dev enp0s25
# CIDR带网关
sudo ip route add 10.111.0.0/16 via 10.111.160.1 dev enp0s25
# 固定IP带网关
sudo ip route add 10.29.225.11 via 10.111.160.1 dev enp0s25

路由删除

BASH
1
2
3
4
# 不添加网关
sudo ip route del 192.168.1.110 dev enp0s25
# 添加路由时携带网关,删除时也携带网关
sudo ip route del 10.111.8.4 via 10.111.160.1 dev enp0s25

持久化路由表添加

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 如果想要永久添加,可以放到 /etc/rc.local 中,该脚本会由 /lib/systemd/system/rc-local.service 服务来启动
# 但 rc.local 中的服务是在 After=network.target 后启动的,此时只是 网络功能目标已启用 ,它不保证 所有网卡配置、IP 地址、路由都已经就绪。
# 所以可以使用 After=network-online.target ,保证网络真正上线了再启动
# 这里为了不影响原本的 rc-local.service,所以可以新建一个 systemd unit
tee /etc/systemd/system/custom-route.service <<-'EOF'
[Unit]
Description=Custom Route
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/sbin/ip route add 10.111.0.0/16 via 10.111.160.1 dev eth2
ExecStop=/sbin/ip route del 10.111.0.0/16 via 10.111.160.1 dev eth2
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF
# 重启服务
systemctl daemon-reload
systemctl enable custom-route.service
systemctl start custom-route.service

ssh相关

创建免密登录时的证书

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 在用户目录下一路回车即可
ssh-keygen
# 然后提示公钥和私钥的存储位置
# # 私钥路径
# Your identification has been saved in /home/easul/.ssh/id_rsa.
# # 公钥路径
# Your public key has been saved in /home/easul/.ssh/id_rsa.pub.
# 拷贝公钥为authorized_keys
cat ~/.ssh /id_rsa.pub >> ~/.ssh/authorized_keys

# 如果现在可以使用免密登录,则下边的操作不需要配置
# 打开并配置SSH的配置文件
vi /etc/ssh/sshd_config

# 确保下边两项配置都为yes,没有的话可以加上,然后保存退出
RSAAuthentication yes
PubkeyAuthentication yes

# 重启ssh
systemctl restart sshd

# 免密登录可以使用如下命令行
ssh user@ip -p port -i id_rsa

ssh远程连接发送命令行

需要已经配置ssh免密码登陆

  • 命令少的情况

    BASH
    1
    2
    # 双引号包住命令,命令之间用分号隔开
    ssh user@remoteNode "cd /home ; ls"
  • 命令多的情况
    可以创建一个执行脚本

    BASH
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # << eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
    # 重定向目的在于不显示远程的输出了
    # 在结束前,加exit退出远程节点

    #!/bin/bash
    ssh user@remoteNode > /dev/null 2>&1 << eeooff
    cd /home
    touch abcdefg.txt
    exit
    eeooff
    echo done!

    ssh远程连接发送命令行

系统相关

三种加环境变量的方式

BASH
1
2
3
4
5
6
7
8
9
10
# 1. 加到/usr/bin
sudo ln -s /opt/software/coding/apache-maven-3.8.4/bin/mvn /usr/bin/mvn
# 2. 修改/etc/profile
sudo vim /etc/profile
JAVA_HOME=/opt/jdk-11
PATH = $JAVA_HOME/bin:$PATH
export PATH
# 3. 修改.bashrc
vim ~/.bashrc
alias mvn='/opt/software/coding/apache-maven-3.8.4/bin/mvn'

创建自启动服务

  • 直接修改rc.local,该脚本一般由 /lib/systemd/system/rc-local.service 服务来启动

    BASH
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 打开rc.local,在最后添加启动命令即可,要放到exit 0前边
    sudo vi /etc/rc.local

    # 如
    mkdir /home/test/test1
    # 如果需要用普通用户权限,则写成如下格式
    su - easul -c "mkdir /home/easul/test && touch /home/easul/test/`date +%Y-%m-%d`.log"

    # 修改后文件权限设置为755
    sudo chmod 755 /etc/rc.local
    # 可通过执行如下命令测试脚本是否可用
    sudo /etc/rc.local
  • init.d文件夹下创建启动脚本

    BASH
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    # centos
    # chkonfig后面是启动级别和优先级,description后面是服务描述
    # 服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,停止的优先级是10(数字越大,优先级越低)
    # 启动脚本也可以在 /etc/rc.d/init.d
    scriptName="myscript"
    sudo echo '#!/bin/bash
    ' > /etc/init.d/$scriptName
    sudo echo "# chkconfig:2345 80 90
    # decription:$scriptName

    ### BEGIN INIT INFO
    # Provides: $scriptName
    # Required-Start: \$network \$syslog
    # Required-Stop: \$network
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: $scriptName
    # Description: $scriptName
    ### END INIT INFO

    # start sshd
    /usr/sbin/sshd -D &

    exit 0
    ">> /etc/init.d/$scriptName
    # 为脚本添加执行权限
    sudo chmod +x /etc/init.d/$scriptName
    # 添加服务
    sudo chkconfig --add $scriptName
    # 添加自启动
    sudo chkconfig $scriptName on
    # 删除服务
    sudo chkconfig --del $scriptName
    # 关闭自启动
    sudo chkconfig $scriptName off
    # 列出所有服务
    sudo chkconfig --list
    # 其他解释可以看这里:https://blog.csdn.net/hexiaan/article/details/125210062
    ##################################################
    # ubuntu
    scriptName="code-server"
    sudo echo '#!/bin/bash
    ' > /etc/init.d/$scriptName
    sudo echo "### BEGIN INIT INFO
    # Provides: $scriptName
    # Required-Start: \$network \$local_fs \$remote_fs
    # Required-Stop: \$network \$local_fs \$remote_fs
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: $scriptName
    # Description: $scriptName
    ### END INIT INFO

    cd `pwd`
    nohup ./bin/code-server > ./logs/\$(date +%Y-%m-%d).log 2>&1 &
    exit 0" >> /etc/init.d/$scriptName
    sudo chmod +x /etc/init.d/$scriptName
    # 添加自启动
    sudo update-rc.d -f $scriptName defaults
    # 删除自启动
    sudo update-rc.d -f $scriptName remove

    参考

  • 创建xx.service

    BASH
    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
    52
    53
    54
    # [Unit]部分主要是对这个服务的说明
    # Description 用于描述服务
    # After 用于描述服务类别
    # 如果为 network.target ,则表明该服务只在 网络功能目标已启用 后再运行,此时不保证所有网卡配置、IP 地址、路由都已经就绪
    # 如果为 network-online.target ,则相当于网络已经上线,获取到IP后在运行该服务
    # Wants 用于指定在该服务启动的时候,需要顺带拉起的服务
    # 可以指定为 network-online.target ,保证获取到IP后再启动服务
    # [Service]部分是服务的关键,是服务的一些具体运行参数的设置
    # Type=forking 如果自身可以以daemon运行,用forking
    # 不然就用simple
    # 如果服务只运行一次,执行完命令就退出,不是常驻后台的进程,用oneshot。
    # User=easul 如果服务需要在普通用户下运行,则需要添加用户和组
    # Group=gitea 如果服务需要在普通用户下运行,则需要添加用户和组
    # PIDFile 为存放PID的文件路径
    # WorkingDirectory 为工作目录,放了就可以不用cd到工作目录了
    # ExecStart 为服务的具体运行命令
    # ExecReload 为重启命令
    # ExecStop 为停止命令
    # PrivateTmp=True 表示给服务分配独立的临时空间
    # RemainAfterExit=yes 该项设置为yes后,即使 ExecStart 里的命令已经执行完并退出,systemd 仍然认为这个 service 是 active 。
    # 注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
    #
    # [Install]部分是服务安装的相关设置
    # WantedBy=multi-user.target是设置为多用户的
    sudo echo "
    [Unit]
    Description=httpd
    After=network.target

    [Service]
    Type=forking
    WorkingDirectory=/home/easul/software/nginx
    ExecStart=/usr/local/apache2/bin/apachectl start
    ExecReload=/usr/local/apache2/bin/apachectl restart
    ExecStop=/usr/local/apache2/bin/apachectl stop
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target" > /usr/lib/systemd/system/httpd.service
    # 这里的 xxx.service 的目录可以有如下几种:
    # /etc/systemd/system: 优先级最高,会覆盖 /usr/lib/systemd/system/ 里的 unit
    # /run/systemd/system: 优先级第二,系统运行时动态创建,重启后会消失
    # /usr/lib/systemd/system: 优先级最最低,也可以用 /lib/systemd/system/ ,如果软件更新的话,这里原本属于软件的 xx.service 会被覆盖
    # 建立好系统服务文件后,把其权限改成754
    sudo chmod 754 /usr/lib/systemd/system/httpd.service
    # 设置开机自启动
    sudo systemctl enable httpd

    # 如果这里的 service 是给普通用户创建呢,那么可以将配置指向到用户目录下的如下目录
    # user改成自己的用户名
    echo "" > /home/user/.config/systemd/user/httpd.service
    # 然后就可以设置在当前用户下的 自启动 和 开启运行
    systemctl --user enable x11vnc
    systemctl --user start x11vnc

    xxx.service的建立
    Type=forking与simple的区别

查看系统版本

BASH
1
2
3
4
5
6
7
8
9
10
11
# 显示电脑以及操作系统的相关信息
uname -a
# 显示内核命令
uname -s
# 查看正在运行的内核版本
cat /proc/version
# 显示发行版本信息
cat /etc/issue
# 适用于所有的linux,包括Redhat、SuSE、Debian等发行版
# 但是在debian下要安装lsb
lsb_release -a

用户相关

创建新用户

BASH
1
2
3
4
5
6
7
8
9
10
11
12
# 新增普通用户
useradd easul
# 修改普通用户密码
passwd easul

# 设置easul可以用sudo执行root的所有命令,且使用的时候不用输入密码
su root
chmod u+w /etc/sudoers
vi /etc/sudoers

# 可以找到与这个命令相同的示例下添加
easul ALL=(ALL) NOPASSWD: ALL

如果创建新用户后没有用户目录,可以进行如下操作

BASH
1
2
3
4
5
# 删除刚刚的用户
userdel easul
# 使用adduser添加用户
# useradd较低级,很多操作无法直接完成
adduser easul

参考

用户组相关

BASH
1
2
3
4
5
6
# a: 将用户追加到该组
# G: 指定附加哪个组
# 这里是将 easul 用户追加到 wheel 组中
# wheel 组主要用于给 普通用户 sudo 权限,而不必授予其完整 root 权限
# 并不是所有的 linux 发行版都有 wheel 组
usermod -aG wheel easul

uid和gid

BASH
1
2
3
4
5
# 查看当前用户的 uid 和 gid
# groups 中显示的是该用户的所有的用户组
id
# 查看其他用户的 uid 和 gid
id easul

进程相关

查看某端口下进程

BASH
1
2
3
4
5
6
7
8
# 查看当前运行进程信息
netstat -lntp
# 查看端口被那个进程占用
netstat -lntp | grep 8080
# 查看固定端口
lsof -i :8080
# 查看某进程详细信息
ps pid

批量关闭进程

BASH
1
2
3
4
5
6
7
8
9
# 管道符 | 用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入
# ps -ef Red Hat 里查看所有进程的命令。这时检索出的进程将作为下一条命令grep gitlab的输入。
# grep gitlab 输出结果是,所有含有关键字gitlab的进程,这是gitlab进程的共同特点。
# grep -v grep 在列出的进程中去除含有关键字grep的进程。
# cut -c 9-15 截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
# xargs kill -9 xargs命令是用来把前面命令的输出结果(PID)作为kill -9命令的参数,并执行该命令。
# kill -9 强行杀掉指定进程
# 这样就成功清除了gitlab所有进程。其它类似的任务,只需要修改grep gitlab中的关键字部分就可以了。
ps -ef | grep gitlab | grep -v grep | cut -c 9-15 | xargs kill -9

批量kill多个进程

文件与目录相关

文件查找

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 只从环境变量查找可执行文件
which mysql
# 2. 用于程序名的搜索
# -b 指定二进制文件名
# -m 指定man说明文件
# -s 指定源代码文件
whereis mysql
# 3. 使用debian的包管理器查找
# 找寻chrome的包名
dpkg -l | grep chrome
# 找到包名安装位置
dpkg -L cn.google.chrome
# 4. 使用locate查找
# 找到idea名字的路径
locate idea
# 更新locate的数据库
updatedb

用正则列出文件信息

可用于匹配某些文件路径

YAML
1
2
3
4
5
6
7
8
9
10
单个[*]: 匹配0-多个字符  
?: 匹配一个字符
[abc]: 匹配中括号中任意一个字符
[!abc]: 匹配不是中括号中的任意一个字符
[[:class]]: 匹配任意类型的一个字符,类似\s
[:alnum:]: 匹配任意一个字母或数字
[:alpha:]: 匹配任意一个字母
[:digit:]: 匹配任意一个数字
[:lower:]: 匹配任意一个小写字母
[:upper:]: 匹配任意一个大写字母
BASH
1
2
# 列出当前目录中没有.的文件
ls -al *[!\.]*

创建层级文件夹

BASH
1
mkdir -p test/test/test

递归复制

BASH
1
cp -R -n ./test/图片/* ~/Pictures/Wallpapers/

硬件相关

命令行访问声卡

这里是在 deepin 下尝试的

BASH
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
# 安装必备软件
apt-get install -y alsa-utils pulseaudio pulseaudio-utils
# 将声卡插到电脑,然后将耳机插到声卡
# 在 deepin23.1 的 设备管理器 里查看 音频适配器 ,如果有 KT USB Audio 相关的字样即识别到设备
pactl list cards short
# 使用如下命令查看 KT USB Audio 在声音设备的 声卡号 和 设备号,即 card 和 device 后边的数字
aplay -l
# 然后使用如下命令测试 wav 的播放。这里只能播放 wav 格式的音频,需要自备测试音频。
# hw: 后边的数字,第一个是 card号,第二个是 device号。我这里 card 是 2,device 是 0
aplay -D hw:2,0 /home/easul/Music/OneLastKiss.wav
# 使用如下命令查看 KT USB Audio 在麦克设备的 声卡号 和 设备号,即 card 和 device 后边的数字
arecord -l
# 然后使用如下命令测试 wav 的录制。
# plughw: 后边的数字,第一个是 card号,第二个是 device号。我这里 card 是 2,device 是 0
# -f cd: 音质指定为cd,质量会大一些,后边可以转码来减小音频体积
# -d: 音频录制5秒
arecord -D plughw:1,0 -f cd -d 5 test.wav
# 使用如下命令查看 card 为 2 的声卡都有哪些可以调节的选项,我这里有 Headphone(耳机) 和 Mic(麦克风)
# Simple mixer control 'Headphone',0
# Simple mixer control 'Mic',0
amixer -c 2 scontrols
# 然后调节耳机的音量到 50%
amixer -c 2 set Headphone 50%
# 将麦克音量调到 80%
amixer -c 2 set Mic 80%
# 边录边播
arecord -D plughw:2,0 -f S16_LE -r 16000 -c 1 | aplay -D plughw:2,0 -f S16_LE -r 16000 -c 1

特殊命令

双中划线

符号长这样 --,主要是用于参数的隔离。
他前边的参数会给前边的命令,他后边的参数会被认为是位置参数。
主要是用于后边的参数中有中划线的情况,如下

BASH
1
2
3
4
5
6
# 如果在 mv 的时候,需要移动以 - 开头的文件,如果没有 -- 作为分隔符的话,那么 - 开头的内容会被当做是参数
# 而使用了 -- 之后,他后边的参数就会只被认为是文件名了,如对 -hello-world.txt 进行移动操作
touch -- -hello-world.txt
mv -- -hello-world.txt new-name.txt
# 在这里,由于 -p 在 -- 后边,故被认为是一个目录的名字,而不是 mkdir 的参数
mkdir hello/world -- -p

重命名某个命令

如果需要在命令行中添加自己的特殊的标识,可以通过修改命令的名称来实现。

BASH
1
2
3
4
5
6
# 这里相当于用 exec 为 sleep 命名为了 auto_text_response_sleep 
# 在 ps aux | grep auto_text_response_sleep 就可以找到该命令了
exec -a 'auto_text_response_sleep' sleep 100
# 或者使用sh进行整个命令的运行,也可以实现效果
# 在 ps aux | grep asdfadf 找特殊标识,就可以找到该命令了
sh -c 'echo asdfadf; sleep 100'
 评论