Shell 脚本学习

前言

对长期使用的shell脚本产生了一丢丢的兴趣, 前来进行一些笔记来记录学习过程, 仅此而已;

查找文本

以grep程序查找文本(以UNIX的专业术语来说,是匹配文本(matching text)是相当方便的。在POSIX系统上,grep可以在两种正则表达式风格中选择一种,或是执行简单的字符串匹配。传统上,有三种程序,可以用来查找整个文本文件:

grep

最早的文本匹配程序。使用POSIX定义的基本正则表达式(Basic Regular Expression,BRE)。

egrep

egrep扩展式grep(Extended grep),这个程序使用扩展正则表达式(Extended Regular Expression,ERE)——这是一套功能更强大的正则表达式,使用它的代价就是会耗掉更多的运算资源。以现在的系统而言,在性能影响上几乎没有太大的差别。

fgrep

快速grep(Fast grep)。这个版本匹配固定字符串而非正则表达式,它使用优化的算法,能更有效地匹配固定字符串。最初的版本,也是唯一可以并行(in parallel)地匹配多个字符串的版本;也就是说,grep与egrep只能匹配单个正则表达式;而fgrep使用不同的算法,却能匹配多个字符串,有效地测试每个输入行里,是否有匹配的查找字符串。

这里重点说一下怎么用grep来查找或者输出关键信息的, 另外千万不要用下面这种方式来输出文件

grep "if" -r ./ >> res.txt

这种方式会导致同时匹配res.txt中的结果,会在短时间内导致res.txt文件特别大,如果两分钟不管的话,等着内存爆炸吧~, 下面说一下这个指令的使用, 其参数选项如下

-a --text                                      # 不要忽略二进制数据。
-A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c --count # 计算符合范本样式的列数。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp # 将范本样式视为固定字符串的列表。
-G --basic-regexp # 将范本样式视为普通的表示法来使用。
-h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case # 忽略字符大小写的差别。
-l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent # 不显示任何信息。
-R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version # 显示版本信息。
-w --word-regexp # 只显示全字符合的列。
-x --line-regexp # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数

常用的正则表达式如下

^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行
\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
\< # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。

修改权限的用法

权限:1、r 2、W 3. X

比如rw的值为4+2=6

用法比较简单,比如 chmod 722 test.txt

系统服务管理

在现代Linux系统中,systemd是主流的服务管理系统,通过systemctl命令可以方便地管理各种系统服务和开机自启动项。

systemctl 服务管理

基本服务操作

# 启动服务
sudo systemctl start <服务名>

# 停止服务
sudo systemctl stop <服务名>

# 重启服务
sudo systemctl restart <服务名>

# 重新加载配置(不重启服务)
sudo systemctl reload <服务名>

# 查看服务状态
systemctl status <服务名>

# 查看服务是否运行
systemctl is-active <服务名>

# 查看服务是否开机自启
systemctl is-enabled <服务名>

开机自启动管理

# 设置服务开机自启
sudo systemctl enable <服务名>

# 取消服务开机自启
sudo systemctl disable <服务名>

# 设置服务开机自启并立即启动
sudo systemctl enable --now <服务名>

# 取消服务开机自启并立即停止
sudo systemctl disable --now <服务名>

# 列出所有开机自启的服务
systemctl list-unit-files --type=service --state=enabled

# 列出所有失败的服务
systemctl --failed

查看系统服务

# 列出所有服务
systemctl list-units --type=service

# 列出所有正在运行的服务
systemctl list-units --type=service --state=running

# 列出所有服务文件
systemctl list-unit-files --type=service

# 查看服务的详细信息
systemctl show <服务名>

# 查看服务的日志
journalctl -u <服务名>

# 实时查看服务日志
journalctl -u <服务名> -f

# 查看服务的依赖关系
systemctl list-dependencies <服务名>

systemctl 常用参数

--user          # 对用户服务进行操作
--system # 对系统服务进行操作(默认)
--all # 显示所有单元,包括非活动的
--failed # 只显示失败的单元
--type=TYPE # 过滤单元类型(service, socket, target等)
--state=STATE # 过滤单元状态(active, inactive, failed等)
-l, --full # 显示完整的单元名称
-n, --lines=N # 显示最后N行日志
-f, --follow # 实时跟随日志输出
--no-pager # 不使用分页器

常见系统服务示例

# 网络管理服务
sudo systemctl restart NetworkManager

# SSH服务
sudo systemctl enable ssh
sudo systemctl start ssh

# 防火墙服务
sudo systemctl status ufw
sudo systemctl enable ufw

# Apache/Nginx Web服务
sudo systemctl restart apache2
sudo systemctl reload nginx

# 数据库服务
sudo systemctl start mysql
sudo systemctl enable postgresql

# Docker服务
sudo systemctl enable docker
sudo systemctl start docker

进程管理

进程管理是Linux系统管理的重要组成部分,包括查看进程状态、终止进程、监控系统负载等操作。

进程查看命令

ps 命令详解

# 显示当前用户的所有进程
ps

# 显示所有进程的详细信息
ps aux

# 显示所有进程的层级关系
ps auxf
ps -ef --forest

# 显示特定用户的进程
ps -u username

# 显示特定进程的信息
ps -p PID

# 按CPU使用率排序
ps aux --sort=-%cpu

# 按内存使用率排序
ps aux --sort=-%mem

# 显示进程的完整命令行
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

# 实时显示进程信息(类似top)
ps aux | head -1; ps aux | tail -n +2 | sort -nr -k3

ps 常用参数组合

a    # 显示所有用户的进程
u # 以用户友好的格式显示
x # 显示没有控制终端的进程
e # 显示所有进程
f # 以全格式显示
l # 以长格式显示
-o # 自定义输出格式
--sort # 排序选项

系统监控命令

top / htop 实时监控

# 启动top
top

# 按CPU使用率排序 (默认)
# 在top中按 P

# 按内存使用率排序
# 在top中按 M

# 按运行时间排序
# 在top中按 T

# 只显示指定用户的进程
top -u username

# 更友好的界面(需要安装)
htop

# 显示进程树
htop -t

top 交互式快捷键

h    # 帮助信息
q # 退出
k # 终止进程(输入PID)
r # 重新设置进程优先级
P # 按CPU排序
M # 按内存排序
T # 按时间排序
c # 切换显示完整命令
1 # 切换显示各CPU核心信息

进程终止命令

kill 命令详解

# 温和终止进程
kill PID

# 强制终止进程
kill -9 PID
kill -KILL PID

# 发送指定信号
kill -TERM PID # 正常终止信号(默认)
kill -HUP PID # 挂断信号
kill -INT PID # 中断信号(Ctrl+C)
kill -QUIT PID # 退出信号

# 终止进程组
kill -TERM -PID

# 按进程名终止
killall process_name

# 强制按进程名终止
killall -9 process_name

# 交互式终止进程
pkill process_name

# 按模式终止进程
pkill -f "pattern"

# 终止指定用户的所有进程
pkill -u username

常见信号类型

信号编号  信号名称    描述
1 SIGHUP 挂断信号,通常用于重新加载配置
2 SIGINT 中断信号(Ctrl+C)
3 SIGQUIT 退出信号(Ctrl+\)
9 SIGKILL 强制终止信号(无法被忽略)
15 SIGTERM 正常终止信号(默认)
18 SIGCONT 继续执行被暂停的进程
19 SIGSTOP 暂停进程
20 SIGTSTP 终端暂停信号(Ctrl+Z)

后台进程管理

# 后台运行命令
command &

# 查看后台作业
jobs

# 将作业转到前台
fg %jobid

# 将作业转到后台
bg %jobid

# 脱离终端运行(即使终端关闭也继续运行)
nohup command &

# 使用screen会话
screen -S session_name
# Ctrl+A, D 脱离会话
# screen -r session_name 恢复会话

# 使用tmux会话
tmux new -s session_name
# Ctrl+B, D 脱离会话
# tmux attach -t session_name 恢复会话

系统负载监控

# 查看系统负载平均值
uptime

# 查看系统负载和进程信息
w

# 查看内存使用情况
free -h

# 实时监控系统资源
iostat 2 # I/O统计
vmstat 2 # 虚拟内存统计
sar -u 2 # CPU使用率统计

# 查找占用特定端口的进程
lsof -i :port_number
netstat -tulpn | grep :port_number

文件系统操作

文件系统操作是日常Linux使用中最基础也最重要的技能,包括文件查找、复制移动、权限管理等。

文件列表和查看

ls 命令详解

# 基本列表
ls

# 详细信息列表
ls -l

# 显示隐藏文件
ls -a

# 组合使用(最常用)
ls -la

# 按时间排序(最新的在前)
ls -lt

# 按时间排序(最旧的在前)
ls -ltr

# 按大小排序
ls -lS

# 人类可读的大小格式
ls -lh

# 递归显示子目录
ls -R

# 按文件类型分色显示
ls --color=auto

# 只显示目录
ls -d */

# 显示文件数量统计
ls -1 | wc -l

ls 参数详解

-a, --all              # 显示所有文件,包括隐藏文件
-l # 使用长格式列表
-h, --human-readable # 以人类可读格式显示大小
-t # 按修改时间排序
-r, --reverse # 逆序排列
-S # 按文件大小排序
-R, --recursive # 递归列出子目录内容
--color=auto # 彩色显示文件类型
-i, --inode # 显示索引节点号
-d, --directory # 只列出目录本身,不列出内容
-1 # 每行显示一个文件
-F, --classify # 在文件名后添加类型标识符

文件查找命令

find 命令详解

# 基本查找
find /path -name "filename"

# 忽略大小写查找
find /path -iname "filename"

# 按文件类型查找
find /path -type f # 查找文件
find /path -type d # 查找目录
find /path -type l # 查找符号链接

# 按大小查找
find /path -size +100M # 大于100MB的文件
find /path -size -10k # 小于10KB的文件
find /path -size 50M # 等于50MB的文件

# 按时间查找
find /path -mtime -7 # 7天内修改的文件
find /path -mtime +30 # 30天前修改的文件
find /path -atime -1 # 1天内访问的文件

# 按权限查找
find /path -perm 755 # 权限为755的文件
find /path -perm -644 # 至少包含644权限的文件

# 组合条件查找
find /path -name "*.log" -type f -size +1M

# 查找并执行操作
find /path -name "*.tmp" -exec rm {} \;
find /path -name "*.log" -exec ls -lh {} \;

# 查找空文件和空目录
find /path -empty

# 按用户查找
find /path -user username
find /path -group groupname

locate 命令

# 基本查找(更快,但需要更新数据库)
locate filename

# 忽略大小写
locate -i filename

# 限制结果数量
locate -n 10 filename

# 更新locate数据库
sudo updatedb

# 正则表达式查找
locate -r "pattern"

文件操作命令

复制操作 (cp)

# 基本复制
cp source destination

# 复制目录(递归)
cp -r source_dir destination_dir

# 保持文件属性
cp -p source destination

# 强制覆盖
cp -f source destination

# 交互式复制(覆盖前询问)
cp -i source destination

# 创建硬链接而非复制
cp -l source destination

# 创建符号链接
cp -s source destination

# 显示复制进度
cp -v source destination

# 组合参数(常用)
cp -rp source_dir destination_dir

移动/重命名操作 (mv)

# 基本移动/重命名
mv source destination

# 交互式移动(覆盖前询问)
mv -i source destination

# 强制移动
mv -f source destination

# 显示移动过程
mv -v source destination

# 批量重命名
for file in *.txt; do mv "$file" "${file%.txt}.bak"; done

删除操作 (rm)

# 删除文件
rm filename

# 删除多个文件
rm file1 file2 file3

# 交互式删除(每个文件前询问)
rm -i filename

# 强制删除(不询问)
rm -f filename

# 递归删除目录
rm -r directory

# 强制递归删除
rm -rf directory

# 显示删除过程
rm -v filename

# 安全删除(移动到回收站,需要安装trash-cli)
trash filename

文件权限管理

chmod 权限修改

# 数字方式设置权限
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
chmod 600 filename # rw-------
chmod 777 filename # rwxrwxrwx

# 符号方式设置权限
chmod u+x filename # 给用户添加执行权限
chmod g-w filename # 移除组写权限
chmod o+r filename # 给其他用户添加读权限
chmod a+x filename # 给所有用户添加执行权限

# 递归设置权限
chmod -R 755 directory

# 权限数字对应表
# r(读) = 4, w(写) = 2, x(执行) = 1
# rwx = 4+2+1 = 7
# rw- = 4+2+0 = 6
# r-x = 4+0+1 = 5
# r-- = 4+0+0 = 4

chown 所有者修改

# 修改文件所有者
chown username filename

# 修改文件所有者和组
chown username:groupname filename

# 只修改组
chown :groupname filename

# 递归修改
chown -R username:groupname directory

# 显示修改过程
chown -v username filename

文件链接

# 创建硬链接
ln source_file hard_link

# 创建符号链接
ln -s source_file symbolic_link

# 创建符号链接到目录
ln -s /path/to/directory link_name

# 强制创建链接(覆盖现有文件)
ln -sf source_file link_name

# 查看链接信息
ls -l link_name
readlink link_name

网络管理

网络管理包括网络连接状态查看、网络配置、网络故障诊断以及网络共享等功能。

网络状态查看

netstat 网络连接查看

# 显示所有网络连接
netstat -a

# 显示所有TCP连接
netstat -t

# 显示所有UDP连接
netstat -u

# 显示监听端口
netstat -l

# 显示数字格式的IP和端口
netstat -n

# 显示进程信息
netstat -p

# 组合使用(最常用)
netstat -tulpn

# 查看特定端口
netstat -tulpn | grep :80
netstat -tulpn | grep :22

# 显示路由表
netstat -r

ss 命令(更现代的替代)

# 显示所有连接
ss -a

# 显示TCP连接
ss -t

# 显示监听端口
ss -l

# 显示进程信息
ss -p

# 组合使用
ss -tulpn

# 查看特定端口
ss -tulpn | grep :80

# 显示连接统计
ss -s

网络接口管理

# 显示所有网络接口
ip addr show
ifconfig

# 显示特定接口
ip addr show eth0
ifconfig eth0

# 启用网络接口
sudo ip link set eth0 up
sudo ifconfig eth0 up

# 禁用网络接口
sudo ip link set eth0 down
sudo ifconfig eth0 down

# 设置IP地址
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0

# 删除IP地址
sudo ip addr del 192.168.1.100/24 dev eth0

WiFi 网络管理

NetworkManager 命令行工具

# 显示WiFi状态
nmcli radio wifi

# 开启WiFi
nmcli radio wifi on

# 关闭WiFi
nmcli radio wifi off

# 扫描WiFi网络
nmcli dev wifi

# 连接WiFi网络
nmcli dev wifi connect "SSID" password "password"

# 连接隐藏网络
nmcli dev wifi connect "SSID" password "password" hidden yes

# 显示已保存的连接
nmcli con show

# 删除WiFi连接
nmcli con delete "SSID"

# 显示连接详情
nmcli con show "SSID"

传统 WiFi 工具

# 扫描WiFi网络
sudo iwlist scan

# 查看WiFi接口状态
iwconfig

# 连接WiFi网络(需要wpa_supplicant配置)
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

网络热点共享

通过本地笔记本共享WiFi网络

方法一:使用 hostapd 和 dnsmasq

# 安装必要软件
sudo apt update
sudo apt install hostapd dnsmasq

# 创建hostapd配置文件
sudo tee /etc/hostapd/hostapd.conf << EOF
interface=wlan0
driver=nl80211
ssid=MyHotspot
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=YourPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF

# 配置dnsmasq
sudo tee /etc/dnsmasq.conf << EOF
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
EOF

# 配置网络接口
sudo ip addr add 192.168.4.1/24 dev wlan0

# 启用IP转发
sudo sysctl net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

# 配置iptables转发规则
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

# 启动服务
sudo systemctl start hostapd
sudo systemctl start dnsmasq

方法二:使用 NetworkManager 创建热点

# 创建热点连接
nmcli dev wifi hotspot ifname wlan0 ssid MyHotspot password "YourPassword"

# 或者更详细的配置
nmcli con add type wifi ifname wlan0 con-name MyHotspot autoconnect yes ssid MyHotspot
nmcli con modify MyHotspot 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
nmcli con modify MyHotspot wifi-sec.key-mgmt wpa-psk
nmcli con modify MyHotspot wifi-sec.psk "YourPassword"

# 激活热点
nmcli con up MyHotspot

# 停止热点
nmcli con down MyHotspot

# 删除热点配置
nmcli con delete MyHotspot

方法三:使用 create_ap 工具

# 安装create_ap(更简单的工具)
git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install

# 创建热点(共享已有网络连接)
sudo create_ap wlan0 eth0 MyHotspot YourPassword

# 创建无互联网的热点
sudo create_ap -n wlan0 MyHotspot YourPassword

# 停止热点
sudo create_ap --stop wlan0

网络诊断工具

连通性测试

# ping 测试
ping -c 4 google.com
ping -c 4 8.8.8.8

# 持续ping
ping google.com

# IPv6 ping
ping6 google.com

# 指定网络接口ping
ping -I eth0 google.com

路由跟踪

# 跟踪路由到目标
traceroute google.com
tracepath google.com

# IPv6路由跟踪
traceroute6 google.com

域名解析

# DNS查询
nslookup google.com
dig google.com

# 查询特定记录类型
dig google.com A
dig google.com AAAA
dig google.com MX

# 反向DNS查询
nslookup 8.8.8.8
dig -x 8.8.8.8

网络下载工具

# wget 下载
wget https://example.com/file.zip

# 后台下载
wget -b https://example.com/file.zip

# 断点续传
wget -c https://example.com/file.zip

# curl 下载
curl -O https://example.com/file.zip

# curl 显示进度
curl -# -O https://example.com/file.zip

# 发送POST请求
curl -X POST -d "data=value" https://api.example.com

# 设置请求头
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com

网络监控

# 实时监控网络流量
iftop

# 按进程显示网络使用
nethogs

# 网络统计信息
nload

# 监控特定接口
iftop -i eth0

系统信息查看

系统信息查看命令帮助了解系统硬件配置、运行状态、资源使用情况等关键信息。

系统基本信息

系统信息查看

# 显示系统信息
uname -a

# 显示内核名称
uname -s

# 显示内核版本
uname -r

# 显示机器架构
uname -m

# 显示处理器类型
uname -p

# 显示硬件平台
uname -i

# 显示操作系统
uname -o

# 显示主机名
hostname
uname -n

系统版本信息

# 查看发行版信息
cat /etc/os-release
lsb_release -a

# 查看发行版版本
cat /etc/issue
cat /etc/debian_version # Debian/Ubuntu
cat /etc/redhat-release # RedHat/CentOS

# 查看内核信息
cat /proc/version

硬件信息查看

CPU 信息

# 查看CPU详细信息
lscpu

# 查看CPU信息(详细)
cat /proc/cpuinfo

# 查看CPU核心数
nproc

# 查看CPU使用率
cat /proc/loadavg

# 实时查看CPU使用情况
top
htop

内存信息

# 查看内存使用情况
free

# 人类可读格式显示内存
free -h

# 以MB为单位显示
free -m

# 以GB为单位显示
free -g

# 显示内存详细信息
cat /proc/meminfo

# 显示虚拟内存统计
vmstat

# 每2秒更新一次
vmstat 2

磁盘和存储信息

# 查看磁盘使用情况
df

# 人类可读格式
df -h

# 显示文件系统类型
df -T

# 显示inode使用情况
df -i

# 查看特定目录大小
du -h /path/to/directory

# 查看当前目录大小
du -sh .

# 查看目录下各子目录大小
du -h --max-depth=1

# 按大小排序
du -h | sort -hr

# 查看磁盘分区信息
lsblk

# 以树形结构显示
lsblk -T

# 显示文件系统信息
lsblk -f

# 查看块设备信息
fdisk -l

PCI 和 USB 设备

# 查看PCI设备
lspci

# 详细显示PCI设备
lspci -v

# 查看USB设备
lsusb

# 详细显示USB设备
lsusb -v

# 查看所有硬件设备
lshw

# 简要显示硬件信息
lshw -short

系统运行状态

系统运行时间和负载

# 查看系统运行时间和负载
uptime

# 查看当前登录用户
w
who

# 查看登录历史
last

# 查看最后登录的用户
lastlog

进程和资源使用

# 查看所有进程
ps aux

# 按CPU使用率排序
ps aux --sort=-%cpu | head

# 按内存使用率排序
ps aux --sort=-%mem | head

# 实时系统监控
top
htop

# 查看系统资源使用情况
sar -u 1 5 # CPU使用率,每秒一次,共5次
sar -r 1 5 # 内存使用率
sar -d 1 5 # 磁盘I/O

网络接口状态

# 查看网络接口
ip addr show
ifconfig

# 查看网络统计
cat /proc/net/dev

# 查看路由表
ip route show
route -n

环境变量和系统配置

环境变量

# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER

# 设置环境变量
export VAR_NAME=value

# 查看当前shell
echo $SHELL
echo $0

系统限制和配置

# 查看系统限制
ulimit -a

# 查看文件描述符限制
ulimit -n

# 查看进程数限制
ulimit -u

# 查看内核参数
sysctl -a

# 查看特定内核参数
sysctl kernel.version
sysctl vm.swappiness

# 查看挂载点
mount
cat /proc/mounts

系统服务和启动信息

启动信息

# 查看系统启动信息
dmesg

# 查看最近的启动信息
dmesg | tail

# 按时间显示启动信息
dmesg -T

# 查看启动日志
journalctl -b

# 查看内核消息
cat /var/log/kern.log
cat /var/log/messages

系统运行级别

# 查看当前运行级别
runlevel
systemctl get-default

# 查看所有运行的服务
systemctl list-units --type=service --state=running

# 查看开机自启服务
systemctl list-unit-files --type=service --state=enabled

定时任务管理

定时任务允许系统在指定时间自动执行命令或脚本,是系统自动化管理的重要工具。

Cron 定时任务

crontab 基本操作

# 编辑当前用户的crontab
crontab -e

# 查看当前用户的crontab
crontab -l

# 删除当前用户的crontab
crontab -r

# 编辑指定用户的crontab(需要root权限)
sudo crontab -e -u username

# 查看指定用户的crontab
sudo crontab -l -u username

# 从文件导入crontab
crontab filename

# 查看cron服务状态
systemctl status cron
systemctl status crond # CentOS/RHEL

Cron 时间格式

# Cron时间格式:分钟 小时 日 月 星期 命令
# * * * * * command
# | | | | |
# | | | | +-- 星期几 (0-7, 0和7都表示星期日)
# | | | +---- 月份 (1-12)
# | | +------ 日期 (1-31)
# | +-------- 小时 (0-23)
# +---------- 分钟 (0-59)

# 特殊字符说明:
# * : 匹配任何值
# , : 分隔多个值 (例如: 1,3,5)
# - : 指定范围 (例如: 1-5)
# / : 指定间隔 (例如: */5 表示每5分钟)

常用 Cron 示例

# 每分钟执行一次
* * * * * /path/to/command

# 每小时执行一次(每小时的第0分钟)
0 * * * * /path/to/command

# 每天凌晨2点执行
0 2 * * * /path/to/command

# 每周一凌晨3点执行
0 3 * * 1 /path/to/command

# 每月1号凌晨4点执行
0 4 1 * * /path/to/command

# 每5分钟执行一次
*/5 * * * * /path/to/command

# 每小时的30分钟执行
30 * * * * /path/to/command

# 每天上午9点到下午5点,每小时执行
0 9-17 * * * /path/to/command

# 周一到周五每天上午9点执行
0 9 * * 1-5 /path/to/command

# 每个工作日的上午9点和下午5点执行
0 9,17 * * 1-5 /path/to/command

# 每年1月1日凌晨执行
0 0 1 1 * /path/to/command

特殊时间关键词

# @reboot    : 系统重启时执行
@reboot /path/to/command

# @yearly 或 @annually : 每年执行一次 (相当于 0 0 1 1 *)
@yearly /path/to/command

# @monthly : 每月执行一次 (相当于 0 0 1 * *)
@monthly /path/to/command

# @weekly : 每周执行一次 (相当于 0 0 * * 0)
@weekly /path/to/command

# @daily : 每天执行一次 (相当于 0 0 * * *)
@daily /path/to/command

# @hourly : 每小时执行一次 (相当于 0 * * * *)
@hourly /path/to/command

Cron 环境变量和输出

# 在crontab中设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash
HOME=/root

# 设置邮件接收者
MAILTO=user@example.com

# 禁用邮件发送
MAILTO=""

# 重定向输出到日志文件
0 2 * * * /path/to/script.sh >> /var/log/script.log 2>&1

# 只重定向错误输出
0 2 * * * /path/to/script.sh 2>> /var/log/script.error.log

# 忽略所有输出
0 2 * * * /path/to/script.sh > /dev/null 2>&1

At 命令 - 一次性定时任务

at 基本用法

# 在特定时间执行命令
at 14:30
at> /path/to/command
at> <Ctrl+D>

# 在明天14:30执行
at 14:30 tomorrow

# 在下周一执行
at 14:30 monday

# 在指定日期执行
at 14:30 2024-12-25

# 在5分钟后执行
at now + 5 minutes

# 在1小时后执行
at now + 1 hour

# 在2天后执行
at now + 2 days

# 从文件中读取命令
at 14:30 < script.sh

# 查看待执行的at任务
atq
at -l

# 删除at任务
atrm job_number
at -r job_number

# 查看特定任务的内容
at -c job_number

batch 命令

# 系统负载低时执行任务
batch
batch> /path/to/command
batch> <Ctrl+D>

# 从文件中读取批处理任务
batch < script.sh

系统级定时任务

系统crontab文件

# 查看系统级crontab
cat /etc/crontab

# 系统crontab格式(多了用户字段)
# 分钟 小时 日 月 星期 用户 命令
0 2 * * * root /path/to/command

# 系统级任务目录
ls /etc/cron.d/ # 系统级cron任务
ls /etc/cron.hourly/ # 每小时执行的脚本
ls /etc/cron.daily/ # 每天执行的脚本
ls /etc/cron.weekly/ # 每周执行的脚本
ls /etc/cron.monthly/ # 每月执行的脚本

系统任务目录使用

# 创建每日任务脚本
sudo vim /etc/cron.daily/backup-script
sudo chmod +x /etc/cron.daily/backup-script

# 创建每小时任务脚本
sudo vim /etc/cron.hourly/log-cleanup
sudo chmod +x /etc/cron.hourly/log-cleanup

# 创建系统级cron任务
sudo vim /etc/cron.d/custom-task

Systemd Timer

systemd timer 基本概念

# 查看所有timer
systemctl list-timers

# 查看活跃的timer
systemctl list-timers --all

# 启动timer
sudo systemctl start timer-name.timer

# 启用timer(开机自启)
sudo systemctl enable timer-name.timer

# 停止timer
sudo systemctl stop timer-name.timer

# 查看timer状态
systemctl status timer-name.timer

创建自定义 systemd timer

# 创建服务文件 /etc/systemd/system/my-task.service
[Unit]
Description=My Custom Task
Wants=my-task.timer

[Service]
Type=oneshot
ExecStart=/path/to/my-script.sh

[Install]
WantedBy=multi-user.target

# 创建timer文件 /etc/systemd/system/my-task.timer
[Unit]
Description=Run my-task every 30 minutes
Requires=my-task.service

[Timer]
OnCalendar=*:0/30
Persistent=true

[Install]
WantedBy=timers.target

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用并启动timer
sudo systemctl enable my-task.timer
sudo systemctl start my-task.timer

Systemd timer 时间格式

# OnCalendar 时间格式示例
OnCalendar=*-*-* 02:00:00 # 每天2点
OnCalendar=Mon *-*-* 09:00:00 # 每周一9点
OnCalendar=*-01-01 00:00:00 # 每年1月1日
OnCalendar=hourly # 每小时
OnCalendar=daily # 每天
OnCalendar=weekly # 每周
OnCalendar=monthly # 每月
OnCalendar=*:0/15 # 每15分钟

定时任务调试和监控

查看cron日志

# 查看cron日志
tail -f /var/log/cron
tail -f /var/log/syslog | grep cron

# 在Ubuntu中启用详细日志
sudo vim /etc/rsyslog.d/50-default.conf
# 取消注释:cron.* /var/log/cron.log

# 重启日志服务
sudo systemctl restart rsyslog

调试定时任务

# 测试cron表达式
# 在线工具:crontab.guru

# 手动运行定时任务
sudo run-parts /etc/cron.daily/

# 设置详细的日志记录
* * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

# 在脚本中添加时间戳
echo "$(date): Starting task" >> /var/log/myscript.log

环境变量和包管理

环境变量管理和软件包管理是Linux系统管理中的核心技能,涉及系统配置和软件安装维护。

环境变量管理

查看和设置环境变量

# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER
printenv PATH

# 设置临时环境变量(当前会话有效)
export VAR_NAME="value"
VAR_NAME="value"

# 取消设置环境变量
unset VAR_NAME

# 查看变量是否已设置
echo ${VAR_NAME:-"not set"}

PATH 环境变量管理

# 查看PATH
echo $PATH

# 临时添加到PATH前面
export PATH="/new/path:$PATH"

# 临时添加到PATH后面
export PATH="$PATH:/new/path"

# 永久添加到PATH(用户级别)
echo 'export PATH="$PATH:/new/path"' >> ~/.bashrc
echo 'export PATH="$PATH:/new/path"' >> ~/.zshrc

# 重新加载配置
source ~/.bashrc
source ~/.zshrc

# 系统级PATH配置
sudo vim /etc/environment

配置文件管理

# 用户级配置文件
~/.bashrc # bash shell配置
~/.zshrc # zsh shell配置
~/.profile # shell无关的配置
~/.bash_profile # bash登录时执行
~/.bash_logout # bash退出时执行

# 系统级配置文件
/etc/profile # 系统级profile
/etc/bash.bashrc # 系统级bashrc
/etc/environment # 系统环境变量

# 编辑配置文件
vim ~/.bashrc

# 重新加载配置文件
source ~/.bashrc
. ~/.bashrc

# 查看shell类型
echo $SHELL
echo $0

常用环境变量

# 系统相关
HOME # 用户主目录
USER # 当前用户名
SHELL # 当前shell
PWD # 当前工作目录
OLDPWD # 前一个工作目录

# 程序相关
PATH # 可执行文件搜索路径
LD_LIBRARY_PATH # 动态库搜索路径
MANPATH # 手册页搜索路径
EDITOR # 默认编辑器
BROWSER # 默认浏览器

# 语言和编码
LANG # 系统语言
LC_ALL # 本地化设置
TZ # 时区设置

# 设置常用环境变量
export EDITOR=vim
export BROWSER=firefox
export LANG=zh_CN.UTF-8

Debian/Ubuntu 包管理 (APT)

基本包管理操作

# 更新软件包索引
sudo apt update

# 升级所有可更新的软件包
sudo apt upgrade

# 升级系统(包括删除过时包)
sudo apt full-upgrade
sudo apt dist-upgrade

# 安装软件包
sudo apt install package_name

# 安装多个软件包
sudo apt install package1 package2 package3

# 安装特定版本
sudo apt install package_name=version

# 重新安装软件包
sudo apt install --reinstall package_name

# 删除软件包(保留配置文件)
sudo apt remove package_name

# 完全删除软件包(包括配置文件)
sudo apt purge package_name

# 清理不再需要的依赖包
sudo apt autoremove

# 清理软件包缓存
sudo apt autoclean
sudo apt clean

软件包查询

# 搜索软件包
apt search keyword
apt-cache search keyword

# 查看软件包信息
apt show package_name
apt-cache show package_name

# 列出已安装的软件包
apt list --installed

# 查看软件包依赖
apt-cache depends package_name

# 查看软件包反向依赖
apt-cache rdepends package_name

# 列出可更新的软件包
apt list --upgradable

# 查看软件包文件列表
dpkg -L package_name

# 查找文件属于哪个包
dpkg -S /path/to/file
apt-file search filename

APT 源管理

# 查看软件源配置
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

# 添加PPA源
sudo add-apt-repository ppa:user/repository

# 删除PPA源
sudo add-apt-repository --remove ppa:user/repository

# 添加GPG密钥
wget -qO - https://example.com/key.gpg | sudo apt-key add -

# 列出已添加的GPG密钥
apt-key list

Red Hat/CentOS 包管理 (YUM/DNF)

YUM 基本操作

# 更新软件包索引
sudo yum check-update

# 更新所有软件包
sudo yum update

# 安装软件包
sudo yum install package_name

# 删除软件包
sudo yum remove package_name

# 搜索软件包
yum search keyword

# 查看软件包信息
yum info package_name

# 列出已安装的软件包
yum list installed

# 清理缓存
sudo yum clean all

DNF 操作(Fedora/新版CentOS)

# 更新软件包索引
sudo dnf check-update

# 更新所有软件包
sudo dnf update

# 安装软件包
sudo dnf install package_name

# 删除软件包
sudo dnf remove package_name

# 搜索软件包
dnf search keyword

# 查看软件包信息
dnf info package_name

# 列出已安装的软件包
dnf list installed

Arch Linux 包管理 (Pacman)

# 更新系统
sudo pacman -Syu

# 安装软件包
sudo pacman -S package_name

# 删除软件包
sudo pacman -R package_name

# 删除软件包及其依赖
sudo pacman -Rs package_name

# 搜索软件包
pacman -Ss keyword

# 查看软件包信息
pacman -Si package_name

# 列出已安装的软件包
pacman -Q

# 查看本地软件包信息
pacman -Qi package_name

# 清理包缓存
sudo pacman -Sc

通用软件安装方法

从源码编译安装

# 典型的编译安装流程
wget https://example.com/software.tar.gz
tar -xzf software.tar.gz
cd software/

# 配置编译选项
./configure --prefix=/usr/local

# 编译
make

# 安装
sudo make install

# 卸载(如果支持)
sudo make uninstall

使用 Snap 包

# 安装 Snap
sudo apt install snapd

# 搜索 Snap 包
snap find keyword

# 安装 Snap 包
sudo snap install package_name

# 列出已安装的 Snap 包
snap list

# 更新 Snap 包
sudo snap refresh package_name

# 删除 Snap 包
sudo snap remove package_name

使用 Flatpak

# 安装 Flatpak
sudo apt install flatpak

# 添加 Flathub 仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 搜索应用
flatpak search keyword

# 安装应用
flatpak install flathub app_id

# 运行应用
flatpak run app_id

# 列出已安装应用
flatpak list

# 更新应用
flatpak update

# 删除应用
flatpak uninstall app_id

AppImage 应用

# 下载 AppImage
wget https://example.com/app.AppImage

# 添加执行权限
chmod +x app.AppImage

# 运行应用
./app.AppImage

# 集成到系统(可选)
./app.AppImage --appimage-extract

开发工具和语言包管理

Python 包管理

# pip 包管理
pip install package_name
pip install --user package_name
pip uninstall package_name
pip list
pip search keyword
pip show package_name

# 虚拟环境
python -m venv venv_name
source venv_name/bin/activate
deactivate

# requirements.txt
pip freeze > requirements.txt
pip install -r requirements.txt

Node.js 包管理

# npm 包管理
npm install package_name
npm install -g package_name
npm uninstall package_name
npm list
npm search keyword
npm info package_name

# yarn 包管理
yarn add package_name
yarn remove package_name
yarn global add package_name
yarn list

其他语言包管理

# Ruby gems
gem install package_name
gem uninstall package_name
gem list

# Go modules
go get package_name
go mod tidy

# Rust cargo
cargo install package_name
cargo uninstall package_name

日志查看和磁盘管理

系统日志和磁盘管理是Linux系统维护的重要组成部分,帮助监控系统运行状态和管理存储资源。

系统日志查看

journalctl - systemd 日志查看

# 查看所有日志
journalctl

# 查看最新日志
journalctl -f
journalctl --follow

# 查看特定服务的日志
journalctl -u service_name
journalctl -u ssh.service

# 查看特定时间范围的日志
journalctl --since "2024-01-01"
journalctl --since "2024-01-01 10:00:00"
journalctl --since yesterday
journalctl --since "1 hour ago"

# 组合时间范围查询
journalctl --since "2024-01-01" --until "2024-01-02"

# 查看启动日志
journalctl -b
journalctl -b -1 # 上一次启动的日志

# 查看特定优先级的日志
journalctl -p err # 错误级别
journalctl -p warning # 警告级别
journalctl -p info # 信息级别

# 查看内核日志
journalctl -k

# 显示最后几行日志
journalctl -n 50
journalctl --lines=50

# 以JSON格式输出
journalctl -o json

# 查看磁盘使用情况
journalctl --disk-usage

# 清理旧日志
sudo journalctl --rotate
sudo journalctl --vacuum-time=2weeks
sudo journalctl --vacuum-size=500M

传统日志文件

# 常见系统日志文件位置
/var/log/syslog # 系统日志(Debian/Ubuntu)
/var/log/messages # 系统消息(RedHat/CentOS)
/var/log/kern.log # 内核日志
/var/log/auth.log # 认证日志(Debian/Ubuntu)
/var/log/secure # 安全日志(RedHat/CentOS)
/var/log/boot.log # 启动日志
/var/log/cron.log # Cron任务日志
/var/log/maillog # 邮件服务日志
/var/log/apache2/ # Apache日志目录
/var/log/nginx/ # Nginx日志目录

# 查看日志文件
tail -f /var/log/syslog
head -n 100 /var/log/auth.log
less /var/log/messages

# 搜索日志内容
grep "error" /var/log/syslog
grep -i "failed" /var/log/auth.log

# 实时监控多个日志文件
tail -f /var/log/syslog /var/log/auth.log

# 查看压缩的旧日志
zcat /var/log/syslog.1.gz
zgrep "error" /var/log/syslog.*.gz

日志分析工具

# 使用 awk 分析日志
awk '/error/ {print $1, $2, $3, $NF}' /var/log/syslog

# 统计错误数量
grep -c "error" /var/log/syslog

# 按时间过滤日志
awk '$0 ~ /Jan 01/ {print}' /var/log/syslog

# 提取特定字段
awk '{print $1, $2, $3}' /var/log/auth.log

# 使用 sed 处理日志
sed -n '100,200p' /var/log/syslog # 显示100-200行

磁盘和文件系统管理

磁盘使用情况查看

# 查看磁盘使用情况
df -h

# 查看特定文件系统
df -h /home

# 显示文件系统类型
df -T

# 显示 inode 使用情况
df -i

# 查看目录大小
du -h /path/to/directory

# 查看当前目录大小
du -sh .

# 查看子目录大小(一级)
du -h --max-depth=1

# 按大小排序显示
du -h | sort -hr

# 查找大文件
find /path -type f -size +100M -ls
find /path -type f -size +1G -exec ls -lh {} \;

# 统计文件数量
find /path -type f | wc -l
find /path -type d | wc -l

磁盘分区管理

# 查看磁盘分区
fdisk -l
lsblk
lsblk -f

# 查看分区详细信息
parted -l
blkid

# 交互式分区工具
sudo fdisk /dev/sda
sudo parted /dev/sda

# 创建分区表(GPT)
sudo parted /dev/sda mklabel gpt

# 创建分区
sudo parted /dev/sda mkpart primary ext4 1MiB 1GiB

# 删除分区
sudo parted /dev/sda rm 1

# 查看分区使用情况
sudo fdisk -l /dev/sda

文件系统操作

# 格式化分区
sudo mkfs.ext4 /dev/sda1
sudo mkfs.xfs /dev/sda1
sudo mkfs.btrfs /dev/sda1

# 检查文件系统
sudo fsck /dev/sda1
sudo fsck.ext4 /dev/sda1

# 强制检查
sudo fsck -f /dev/sda1

# 修复文件系统
sudo fsck -y /dev/sda1

# 查看文件系统信息
sudo tune2fs -l /dev/sda1
sudo dumpe2fs /dev/sda1 | head

# 调整文件系统参数
sudo tune2fs -c 30 /dev/sda1 # 设置检查间隔
sudo tune2fs -L "MyDisk" /dev/sda1 # 设置卷标

挂载和卸载

# 挂载分区
sudo mount /dev/sda1 /mnt/mydisk

# 挂载时指定文件系统类型
sudo mount -t ext4 /dev/sda1 /mnt/mydisk

# 只读挂载
sudo mount -o ro /dev/sda1 /mnt/mydisk

# 卸载分区
sudo umount /dev/sda1
sudo umount /mnt/mydisk

# 强制卸载
sudo umount -f /mnt/mydisk
sudo umount -l /mnt/mydisk # 懒卸载

# 查看挂载点
mount
df -h
findmnt

# 查看特定挂载点
findmnt /home

自动挂载配置

# 编辑 fstab 文件
sudo vim /etc/fstab

# fstab 格式:
# 设备 挂载点 文件系统 选项 转储 检查
/dev/sda1 /home ext4 defaults 0 2

# 常用挂载选项
defaults # 默认选项
ro # 只读
rw # 读写
noexec # 不允许执行
nosuid # 不允许suid
nodev # 不允许设备文件
auto # 自动挂载
noauto # 不自动挂载
user # 允许用户挂载
nouser # 不允许用户挂载

# 测试 fstab 配置
sudo mount -a

# 重新挂载已挂载的文件系统
sudo mount -o remount,ro /home

压缩和归档

tar 归档工具

# 创建归档文件
tar -cf archive.tar file1 file2 directory/

# 创建压缩归档文件
tar -czf archive.tar.gz file1 file2 directory/ # gzip压缩
tar -cjf archive.tar.bz2 file1 file2 directory/ # bzip2压缩
tar -cJf archive.tar.xz file1 file2 directory/ # xz压缩

# 解压归档文件
tar -xf archive.tar
tar -xzf archive.tar.gz
tar -xjf archive.tar.bz2
tar -xJf archive.tar.xz

# 查看归档内容
tar -tf archive.tar
tar -tzf archive.tar.gz

# 解压到指定目录
tar -xf archive.tar -C /path/to/directory

# 添加文件到归档
tar -rf archive.tar newfile

# 显示详细信息
tar -xvf archive.tar

其他压缩工具

# gzip/gunzip
gzip file.txt # 压缩文件
gunzip file.txt.gz # 解压文件
zcat file.txt.gz # 查看压缩文件内容

# zip/unzip
zip archive.zip file1 file2 directory/
unzip archive.zip
unzip -l archive.zip # 查看内容
unzip archive.zip -d /path/to/directory

# 7z
7z a archive.7z file1 file2 directory/
7z x archive.7z
7z l archive.7z # 查看内容

存储设备管理

USB和移动设备

# 查看USB设备
lsusb

# 查看块设备
lsblk
sudo fdisk -l

# 挂载USB设备
sudo mount /dev/sdb1 /mnt/usb

# 安全移除USB设备
sudo umount /dev/sdb1
sudo eject /dev/sdb1

# 查看设备标签
sudo blkid

RAID管理

# 查看RAID状态
cat /proc/mdstat

# 创建RAID 1
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

# 查看RAID详情
sudo mdadm --detail /dev/md0

# 停止RAID
sudo mdadm --stop /dev/md0

# 监控RAID
sudo mdadm --monitor --scan

LVM管理

# 查看物理卷
sudo pvs
sudo pvdisplay

# 查看卷组
sudo vgs
sudo vgdisplay

# 查看逻辑卷
sudo lvs
sudo lvdisplay

# 创建物理卷
sudo pvcreate /dev/sda1

# 创建卷组
sudo vgcreate myvg /dev/sda1

# 创建逻辑卷
sudo lvcreate -L 10G -n mylv myvg

# 扩展逻辑卷
sudo lvextend -L +5G /dev/myvg/mylv
sudo resize2fs /dev/myvg/mylv # 扩展文件系统
CMake CMakeLists Conan Eigen FCPX Forge GNU Gazebo Git Interest IsaacLab KDL Life Linux Matrix ODE PPO QoS ROS ROS2 Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode c++ calibration chrome colcon control cpp dB data_struct dots figure gdb git latex launch life linux mac math matlab memory mlp motor moveit operator optimal algorithm python robot robotics ros ros2 rtb shell simulation stl thread tools twist unitree urdf valgrind velocity vim web work wsl 交叉编译 依赖管理 分支管理 强化学习 构建系统 版本控制 配置类
知识共享许可协议