一些常用的命令行记录
# 常用命令
# curl
cURL 是与网站或 API 进行交互,向终端发送请求并显示响应或将数据记录到文件的理想工具。有时,它用作较大脚本的一部分,将检索到的数据交给其他函数进行处理。
由于 cURL 可用于从服务器检索文件,所以通常用于下载网站的一部分。它可以很好地执行此功能,但有时 wget 命令更适合这项工作。
# 使用 Python 内置 HTTP 服务器
在 linux 上搭建一个简单的 HTTP 文件服务,让其他设备通过 curl 下载文件:
# 进入要共享的目录 | |
cd /path/to/your/files | |
# 启动服务(默认端口 8000) | |
python3 -m http.server 8000 | |
# 如需后台运行(按 Ctrl+C 后仍运行): | |
nohup python3 -m http.server 8000 > /dev/null 2>&1 & |
在另一台设备上下载: curl http://<linux_IP>:8000 / 文件名 -o 本地保存名
# 页面检索
cURL 最基本命令是检索网站或文件: $ curl http://www.google.com
执行上述命令后,cURL 会检索您所提供页面的源代码并将其输出。
# 下载文件
添加 - output 选项来实现让 cURL 将网页文件保存到本地。
$ curl www.likegeeks.com --output filename | |
$ curl www.likegeeks.com -o filename |
# 遵循重定向
如果在尝试对网站进行 URL 生成时输出为空,则可能意味着该网站告诉 cURL 重定向到其他 URL。默认情况下,cURL 不会遵循重定向,但是您可以使用 -L switch 来告诉它。
在本文的研究中,我们发现有必要在大多数网站上指定 - L,因此请务必记住这一小技巧。默认情况下,您甚至可能希望将其附加到大多数 cURL 命令中。
$ curl -L www.likegeeks.com |
# 停止并继续下载
如果您的下载中断了,或者您需要下载一个大文件但又不想一次完成所有操作,所以 cURL 提供了一种选项,可以从中断处继续传输。
要手动停止传输,您可以使用 ctrl + c
组合键结束 cURL 进程,结束进程后,使用以下语法恢复下载
$ curl -C - example.com/some-file.zip --output MyFile.zip |
-C switch 是恢复我们文件传输的设备,但还要注意,它后面紧跟一个破折号(-)。这告诉 cURL 继续文件传输,但是实现这一步,首先要查看已经下载的部分,找到下载的最后一个字节才可以确定从何处可以恢复。
# 指定超时
如果您希望 cURL 在您不做操作之后的一段时间还可以继续之前的工作,那么可以在命令中指定超时。
使用 -m switch
或者 –connect-timeout
指定执行命令所需的最长时间。经过指定的时间后,cURL 将退出正在执行的操作,即使它正在下载或上传文件。
cURL 会以秒为单位指定您想要的最长时间。因此,要在一分钟后超时,该命令将如下所示:
$ curl -m 60 example.com | |
$ curl --connect-timeout 60 example.com |
# 使用用户名和密码
您可以使用 - u switch 在 cURL 命令中指定用户名和密码。例如,如果您想通过 FTP 服务器进行身份验证,则语法如下所示:
$ curl -u username:password ftp://example.com |
# 使用代理
在连接主机之前,很容易直接使用 cURL 来使用代理。cURL 将默认使用 HTTP 代理,除非您另外指定。
使用 - x switch 定义代理。由于在此示例中未指定协议,因此 cURL 将假定它是 HTTP 代理。
$ curl -x 192.168.1.1:8080 http://example.com |
# conda 命令
# 基础操作
# 查看 conda 版本
conda --version
或者 conda -V
# 更新 conda
conda update conda
# 查看 conda 环境详情信息
conda info
# 虚拟环境管理
# 查看已创建的虚拟环境
conda env list
或者 conda info --envs
# 创建新的虚拟环境
conda create --name envname python=verionID
通过 -n
或 --name
来自定义的环境名称, verionID
指定 Python 的版本,例如创建一个名为 pyweb 的 python 环境: conda create -n pyweb python=3.12
# 激活虚拟环境
激活名为 envname
的虚拟环境: conda activate envname
# 退出当前虚拟环境
conda deactivate
# 删除虚拟环境
conda remove -n envname --all
, 其中, envname
是需要删除的虚拟环境名
# 复制虚拟环境
conda create --name new_env_name --clone old_env_name
# 分享 / 备份一个虚拟环境
分享环境的快速方法是向别人发送你环境的.yml 文件。
首先激活要分享的环境,在当前工作目录下生成一个 environment.yml 文件: conda env export > environment.yml
对方拿到 environment.yml 文件后,将该文件放在工作目录下,可以通过以下命令从该文件创建环境即可: conda env create -f environment.yml
# 包管理
# 安装环境包
安装某个包: conda install [package]
指定包版本: conda install xlrd=1.2.0
使用 pip 安装: pip install xlrd==1.2.0
批量安装 requirements.txt
文件中包含的组件依赖: conda install --yes --file requirements.txt
# 导出环境包
批量导出包含环境中所有依赖包到 requirements.txt 文件: conda list -e > requirements.txt
# 删除环境包
删除当前环境中的某个包: conda remove [package]
使用 pip 删除包: pip uninstal [package]
# 升级环境包
升级当前环境中的某个包: conda update [package]
升级所有包: conda update --all
# 搜索环境包
搜索当前环境中的某个包: conda search [package]
# 删除没有用的安装包
Conda 安装的包都在目录 Anaconda/pkgs 下。随着使用,conda 安装的包也越来越多;有时候会出现以下不好的情况:
有些包安装之后,从来没有使用过;
一些安装包的 tar 包也保留在了计算机中;
由于依赖或者环境等原因,某些包的不同版本重复安装。
上面的这些情况使得 anaconda 显得更加冗余,并且浪费储存;
对于这些情况可以使用 conda clean
净化 Anaconda: conda clean -p
或者 conda clean --packages
删除 tar 包 conda clean -t
或者 conda clean --tarballs
删除索引缓存、锁定文件、未使用过的包和 tar 包: conda clean -y --all
# 镜像源管理
# 查看镜像源
conda config --show channels
# 添加镜像源
如:添加清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free | |
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main | |
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ | |
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ |
# 配置安装包时显示安装来源
设置从 channel 中安装包时显示 channel 的 url,这样就可以知道包的安装来源: conda config --set show_channel_urls yes
# 清除索引缓存
清除索引缓存,保证用的是镜像站提供的索引: conda clean -i
# 切换回默认源
conda config --remove-key channels
# 移除镜像源
如:移除清华源
conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ |
# 临时指定镜像源
临时指定安装某个包使用的镜像源: pip install [package] -i https://pypi.tuna.tsinghua.edu.cn/simple/
或者 pip install [package] -i http://pypi.douban.com/simple/--trusted-host pypi.douban.com
# 操作系统配置
# Centos
# Centos7 yum 换源
在最小化安装 Centos 后,对 centos 进行 yum 换源:
# 1、备份 & 移除
你可以选择备份 yum 文件或者直接移除 yum 文件
备份 yum:
mv /etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup |
移除现有 yum 文件:
cd /etc/yum.repos.d | |
rm -rf * |
# 2、下载阿里云镜像源
下载 阿里云 Centos7-yum 源 并上传到 Centos7 的 /etc/yum.repos.d
目录下,将文件更名为 Centos-7.repo
。
或者使用 wget 下载: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
注意:修改 Centos-7.repo 文件将所有 $releasever 替换为 7
vi /etc/yum.repos.d/CentOS-Base.repo | |
:% s/$releasever/7/g | |
:wq |
# 3、生成缓存
运行 yum makecache
生成缓存
# PNETLAB
# VNC 乱码
部分虚拟设备通过 VNC 启动,在 HTML 控制台中启动虚机出现 VPN 乱码、页面刷新慢等情况,可尝试修改 Qemu 选项
部分虚机 Qemu 启动选项如下
-machine type=pc-1.0,accel=kvm -serial mon:stdio -nographic -display none -nodefconfig -rtc base=utc -boot order=d |
修改为如下启动选项
-machine type=pc-1.0,accel=kvm -vga std -serial mon:stdio -nodefconfig -rtc base=utc -boot order=d -vnc :0 |
# qemu-img 添加磁盘
qemu-img 的虚拟机磁盘通常使用 QCOW2 格式,默认创建节点时,LAB 会为该节点创建一个包含单个磁盘的 QCOW2 文件。但有些虚拟机可能需要多个磁盘。
以某厂商防火墙为例,该防火墙在创建时需要两个磁盘。分别用于系统和数据存储,操作步骤如下:
# 1. 创建磁盘初始化脚本
在模板目录中创建初始化脚本: /opt/unetlab/addons/qemu/abtSG-8000-R6.2/__init__.py
#!/usr/bin/env python3 | |
import os | |
import shutil | |
import glob | |
def init (hdl, lab, args): | |
# 获取当前镜像目录路径 | |
template_dir = os.path.dirname (os.path.abspath (__file__)) | |
# 查找所有磁盘模板文件 (hda.qcow2, hdb.qcow2, etc.) | |
disk_templates = sorted (glob.glob (os.path.join (template_dir, 'hd?.qcow2'))) | |
# 支持的磁盘前缀映射 (hda → virtioa, hdb → virtiob, etc.) | |
prefix_map = { | |
'hda': 'virtioa', | |
'hdb': 'virtiob', | |
'hdc': 'virtioc', | |
'hdd': 'virtiod' | |
} | |
created_disks = [] | |
for template_path in disk_templates: | |
# 提取磁盘标识符 (hda, hdb 等) | |
disk_id = os.path.basename (template_path).split ('.')[0] | |
# 确定目标文件名 | |
target_file = f"{prefix_map.get (disk_id, 'virtio' + disk_id [2:])}.qcow2" | |
target_path = hdl.obj_abs (target_file) | |
# 仅当目标文件不存在时才复制 | |
if not os.path.exists (target_path): | |
shutil.copy (template_path, target_path) | |
os.chown (target_path, 0, 0) | |
os.chmod (target_path, 0o644) | |
created_disks.append (target_file) | |
# 如果没有找到任何磁盘模板,使用默认行为 | |
if not created_disks: | |
default_disk = hdl.obj_abs ('virtioa.qcow2') | |
if not os.path.exists (default_disk): | |
shutil.copy ( | |
os.path.join (template_dir, 'hda.qcow2'), | |
default_disk | |
) | |
os.chown (default_disk, 0, 0) | |
os.chmod (default_disk, 0o644) | |
return 0 |
# 2. 创建磁盘文件
在存放镜像的目录下,创建一个新的 qcow2 文件
备注:如果 vm 无法进入命令行界面,可尝试使用 vm 登录后,点击平台上的 "重启系统",再回到 vm 操作。
cd /opt/unetlab/addons/qemu/abtSG-8000-R6.2 | |
qemu-img create -f qcow2 hdb.qcow2 1G |
# 3. 设置文件权限
修改新建的 __init__.py
和 hdb.qcow2
的文件权限
chmod 755 __init__.py | |
chmod 755 hdb.qcow2 |
# 4. 重启服务
重启 PNETLAB,再启动 qemu-img,检查数据盘是否挂载。
# PNETLAB 挂载磁盘
在 vmware 中,新增磁盘后,LAB 中不显示,此时需要挂在磁盘:
在 webui 中,点击 系统 -> 系统设置 -> 重启,即可在 vm 中进入 CLI 页面
使用 lsbk,200GB 的物理磁盘只挂载了 98GB,通过如下步骤进行磁盘挂载
sda 200G 磁盘 | |
├─sda1 1M 分区 (未使用) | |
├─sda2 2G 分区 (挂载到 /boot) | |
└─sda3 98G 分区 | |
└─ubuntu--vg-ubuntu--lv 98G LVM 逻辑卷 (挂载到根目录 /) |
# 1. 创建新分区
拓展根目录到剩余空间
sudo fdisk /dev/sda |
在 fdisk
交互页面
n # 新建分区 | |
Enter # 默认分区号 (4) | |
Enter # 默认起始扇区 | |
Enter # 默认结束扇区 (使用所有剩余空间) | |
t # 更改分区类型 | |
4 # 选择新分区 | |
8e # 设置为 Linux LVM 类型 | |
w # 保存退出 |
# 2. 重读分区表
sudo partprobe /dev/sda |
# 3. 将新分区初始化为物理卷
sudo pvcreate /dev/sda4 |
# 4. 扩展卷组
sudo vgextend ubuntu-vg /dev/sda4 # "ubuntu-vg" 是系统的 VG 名(从 lsblk 可知) |
# 5. 扩展逻辑卷(使用所有可用空间)
# 查找所有逻辑卷 | |
sudo lvscan | |
# 示例输出: | |
# ACTIVE '/dev/ubuntu-vg/ubuntu-lv' [98.00 GiB] inherit | |
# 使用输出中的路径 | |
sudo lvextend -l +100% FREE /dev/ubuntu-vg/ubuntu-lv |
# 6. 调整文件系统大小(在线扩展)
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--1v |
# 7. 验证结果
df -h / # 查看根目录大小应变为~198GB | |
lsblk # 查看所有空间已分配 |