Skip to main content

(一)Ubuntu 命令汇总

(一) 基础文件/目录操作命令

命令作用示例
pwd查看当前目录路径pwd
ls查看当前目录下的文件列表ls -l(详细格式),ls -a(显示隐藏文件)
cd进入某个目录cd /home/username/
mkdir创建目录mkdir myfolder
touch创建空文件touch file.txt
rm删除文件/目录rm file.txtrm -r folder/
cp复制文件/目录cp file1.txt file2.txtcp -r folder1 folder2/
mv移动/重命名文件mv old.txt new.txtmv file.txt ../

输出文件结构 sudo apt install tree

tree显示当前目录树状结构
tree -L 2限制为 2 层深度
tree -a显示所有文件(包括隐藏文件)
tree -f显示完整路径
tree -sh显示人类可读的文件大小
tree -d只显示目录
tree -tp按修改时间排序并显示权限

(二) 防火墙

Ubuntu 默认使用的是 ufw(Uncomplicated Firewall),这是一个简单易用的防火墙工具,底层其实是基于 iptables,但更容易操作。

1. 基础操作

命令功能
sudo ufw status查看防火墙当前状态(是否开启/规则)
sudo ufw enable启用防火墙
sudo ufw disable关闭防火墙
sudo ufw reload重新加载防火墙配置(修改后需要)
sudo ufw reset重置所有规则(慎用)

2. 开放/关闭端口

命令功能
sudo ufw allow 22允许 22 端口(SSH)进入
sudo ufw allow 8080允许 8080 端口进入
sudo ufw allow from 192.168.1.10允许某个 IP 所有端口访问
sudo ufw allow from 192.168.1.10 to any port 80允许某 IP 访问你机器的 80 端口
sudo ufw deny 80拒绝 80 端口进入
sudo ufw delete allow 22删除已开放的 22 端口规则

3. 频率限制

命令功能
sudo ufw limit ssh对 SSH 登录设置连接频率限制(防止暴力破解)

4. 高级规则(可选)

命令作用
sudo ufw default deny incoming默认拒绝所有进入连接(推荐)
sudo ufw default allow outgoing默认允许所有外出连接

想更高级操作可以学习 iptables,但一般使用 ufw 就足够了。


(三)端口进程管理

1. 查找端口进程

  • 方法一:

    lsof(list open files)方式

     sudo lsof -i :端口号
    
  • 方法二:

    也可以用 netstat 方式(需要安装 net-tools

    sudo netstat -tulnp | grep :端口号
    

    如果没有 netstat,你可以安装它:

    sudo apt install net-tools
    
  • 方法三:

    ss 方式(系统内置更现代的工具)

    sudo ss -ltnp | grep :端口号
    

2. 杀掉某个端口上的进程

查到 PID 之后,用 kill 命令终止进程。

sudo lsof -i :8080        # 找出占用端口的 PID,比如是 1234
sudo kill 1234            # 终止该进程

⚠️ 有些进程可能需要强制杀死:

sudo kill -9 1234

3. 实时查看

查看所有监听的端口:

sudo ss -tuln
  • t = TCP
  • u = UDP
  • l = listening(监听中)
    • n = 显示数字端口号而不是服务名

监控某个端口是否开放:

watch -n 1 'sudo ss -ltnp | grep :8000'

每秒刷新一次,实时监控端口状态。


(四)后台进程管理

1. Screen 工具

screen 是一个终端多路复用器,你可以在里面开启多个会话,每个会话都是一个“独立的终端”,即使你断开 SSH,里面的任务也照常运行。每个用户的 screen 列表都是互相隔离的。

安装 screen

sudo apt update
sudo apt install screen

常用命令汇总

命令作用
screen启动一个新的 screen 会话
screen -S name启动一个命名会话(推荐)
Ctrl + A 然后按 Ddetach(从会话中退出,不关闭)
screen -ls查看当前所有会话
screen -r name重新连接(resume)一个会话
screen -X -S name quit杀死某个会话

2. tmux 工具

tmuxscreen 类似但是功能更强,适合多窗口管理界面化得更好。


(五)解压和压缩

部分工具安装指令,

sudo apt install unzip
sudo apt install unrar
sudo apt install p7zip-full
格式压缩命令解压命令
.tartar -cvf file.tar dir/tar -xvf file.tar
.tar.gztar -czvf file.tar.gz dir/tar -xzvf file.tar.gz
.zipzip -r file.zip dir/unzip file.zip
.rarunrar xunrar x file.rar
.7z7z a file.7z dir/7z x file.7z


(六)系统服务

1. 已有的系统服务

这里以 nginx 服务为例

功能命令
启动 Nginxsudo systemctl start nginx
停止 Nginxsudo systemctl stop nginx
重启 Nginxsudo systemctl restart nginx
重载配置sudo systemctl reload nginx
查看状态sudo systemctl status nginx
开机自启sudo systemctl enable nginx
禁用自启sudo systemctl disable nginx


2. 创建自定义系统服务

首先创建一个服务文件

服务文件 myapp.service 通常放在 /etc/systemd/system/ 下(系统级),或 ~/.config/systemd/user/(用户级):

以下是一个示例服务文件,用于在 Ubuntu 中注册并管理一个 Python 应用或任何后台程序:

[Unit]
Description=My Custom App Service
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/youruser/myapp.py
WorkingDirectory=/home/youruser/
Restart=always
User=youruser
Environment=ENV_VAR=value

[Install]
WantedBy=multi-user.target

systemd 的服务单元(.service 文件)由三大部分组成:

  • [Unit]:定义服务的描述和依赖条件
  • [Service]:定义服务的行为
  • [Install]:定义如何启用服务
配置项含义
Description=My Custom App Service显示服务的简要描述,systemctl status 或日志中可见。
After=network.target表示此服务应在 network.target(网络初始化完成)之后再启动。适合依赖网络的服务,如 Web 服务、数据库等。
ExecStart=/usr/bin/python3 /home/youruser/myapp.py指定服务启动时运行的命令,比如执行一个 Python 脚本。需要填写完整路径。
WorkingDirectory=/home/youruser/设置服务运行的当前工作目录。相对路径、依赖文件等都以这个目录为基础。
Restart=always如果程序崩溃或退出,systemd 会自动重启它。可选项有 no, on-failure, always, on-abort 等。
User=youruser指定服务运行的 Linux 用户,建议使用非 root 用户运行一般程序,提高安全性。
Environment=ENV_VAR=value设置环境变量,在程序启动前注入。可以设置多个,比如 ENV1=val1 ENV2=val2
WantedBy=multi-user.target表示当系统运行到 multi-user.target(正常多用户图形/非图形模式)时自动启动这个服务。用于实现开机自启

启动流程总结(假设服务名为 myapp.service

sudo systemctl daemon-reload           # 通知 systemd 读取新服务文件
sudo systemctl enable myapp.service    # 设置开机自启
sudo systemctl start myapp.service     # 启动服务
sudo systemctl status myapp.service    # 查看运行状态

常见问题
  1. 路径错误ExecStart 的路径必须是完整路径,可以用 which python3 查找。

  2. 权限问题User=youruser 指定用户必须有权限访问相关目录和文件。

  3. 服务未运行:查看日志排错:

    journalctl -u myapp.service -xe


3. 管理自定义系统服务

启动与管理服务

操作命令
重新加载服务配置sudo systemctl daemon-reexecdaemon-reload
启动服务sudo systemctl start myapp.service
停止服务sudo systemctl stop myapp.service
重启服务sudo systemctl restart myapp.service
查看服务运行状态sudo systemctl status myapp.service
设置开机自启sudo systemctl enable myapp.service
关闭开机自启sudo systemctl disable myapp.service
查看所有自定义服务systemctl list-units --type=service

使用 journalctl 查看输出日志:

journalctl -u myapp.service

跟踪实时输出:

journalctl -u myapp.service -f
tip
  • Restart=always 会在服务异常退出时自动重启;
  • 如果你只想在当前用户会话中使用服务,可将 .service 文件放在 ~/.config/systemd/user/,并使用 systemctl --user 管理;
  • 脚本类服务也可用 ExecStart=/bin/bash /path/to/script.sh 形式运行

(七)查看系统基本属性

你已经通过 SSH 登录到服务器,现在可以使用以下命令组来系统性地查看:

1. 操作系统信息

cat /etc/os-release

或更简洁版本:

lsb_release -a

2. 内存信息(RAM)

free -h

或查看更详细内存 + 交换空间:

cat /proc/meminfo

3. CPU 信息

lscpu

或者:

cat /proc/cpuinfo

4. GPU 信息(NVIDIA 系列)

nvidia-smi

显示每张显卡的型号、显存占用、运行状态。

还可以查看更详细 GPU 拓扑结构:

nvidia-smi topo -m

5. 硬盘信息

查看硬盘设备及挂载情况:

lsblk

查看硬盘型号和接口类型:

sudo smartctl -i /dev/sda

如果 smartctl 没有安装:

sudo apt install smartmontools

6. 硬盘空间使用情况

df -h

查看所有挂载点的使用空间情况。

7. Python 版本

python3 --version

或者:

which python3 && python3 -V

(八)快速写入命令

如果我们要往一个文件里快速写入内容,而不想用 vim 打开,可以使用下面这个命令

sudo tee ~/test/index.html > /dev/null <<'EOF'
...
EOF
  • tee :从 stdin 读内容 → 写入文件(同时可输出到 stdout)。类似于: cat > file 命令
  • sudo tee file = 以 root 身份写这个文件,因此 文件所有者/文件所属组 都是 root
  • ...: 即写入的内容
  • > /dev/nulltee 默认会把内容写入文件同时输出到终端,这一步只是为了不把内容打印到屏幕

示例:

mkdir -p ~/test
tee ~/test/app.py > /dev/null <<'EOF'
from http.server import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        body = b"Ordinis minimal Python service OK\n"
        self.send_response(200)
        self.send_header("Content-Type", "text/plain; charset=utf-8")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)

if __name__ == "__main__":
    HTTPServer(("127.0.0.1", 8080), Handler).serve_forever()
EOF

而下面这个是不行的

sudo echo "xxx" > file

因为:sudo 只作用在 echo,重定向 > 是由当前 shell(普通用户)执行的,所以还是没权限写

sudo tee 的写入动作本身是 root 权限,所以能写成功。