加载中...
Featured image of post debian的安装

debian的安装

debian系统安装和常用的命令行工具;开发环境配置

debian的安装

详细文档 :

一键装机脚本见我的GitHub:

debian.jpg

一、debian虚拟机的安装

1、用虚拟机安装debian12

  • vmware 桥接模式的虚拟机不能用quanx的代理连接国外网站; nat模式是虚拟机自己组成子网,通过nat转发流量到宿主机,所以可以通过quanx连接国外网站;
  • 但是nat模式下,宿主机默认不能直接通过虚拟机的内部 IP(例如 172.x.x.x)进行远程连接(如 SSH),因为 NAT 模式下虚拟机的网络是一个私有子网,与宿主机的网络隔离,除非用端口转发(windows上的nat)
  • mac中,vmware_fusion提供了自定义网络,选这个,其实是用的桥接网络,加上nat转发流量连接外网; 宿主机既可以ssh连接虚拟机,虚拟机也可以使用quanx访问国外网站
  • 选择第二个 Graphical install, 安装界面可以用鼠标点击; 第一个 Install 的安装界面只能用键盘不能用鼠标
  • 美国: United States
  • 步骤1:语言选择美国英文:安装过程中显示的语言,所选语言也将是系统安装后的默认语言;安装后可用 sudo dpkg-reconfigure locales 重新配置
  • 步骤2:选择区域, 中国; 会影响时区; 先选other,再asia,再选china
  • 步骤3:因为没有找到符合你选择的语言和国家组合(我选的是美国英文+中国时区)的预设区域设置,系统会提示你重新选语言,依然选美国英文
  • 步骤4:Configure the keyboard,键盘布局,选择American English;安装后可用 sudo dpkg-reconfigure keyboard-configuration 重新配置
  • 步骤5:hostname, 设置为 proddevtest ; 这样的格式
  • 步骤6:domain name; 设置为 vm.local ; 这样的格式
  • 步骤7:输入两次root用户的密码;
  • 步骤8:full name; 全名,真实姓名(英文的姓+名), 用于显示的; 就设置为 helq就可以了 ;
  • 步骤9:username; 用于登录的; 设为helq
  • 步骤10:输入两次helq用户的密码;
  • 步骤11:Partition disks; 选择 Guided - use entire disk ; 不分区,使用整个磁盘(虚拟机创建的虚拟磁盘);
  • 步骤12:会提示:Partition disks; Note that all data on the disk you select will be erased, but not before you have confirmed that you really want to make the changes. 就是个磁盘擦除警告,直接选择那个磁盘,回车下一步
  • 步骤13:Selected for partitioning:The disk can be partitioned using one of several different schemes. If you are unsure, choose the first one. 选择分区方案; 直接选择第一个: All files in one partition
  • 步骤14:This is an overview of your currently configured partitions and mount points. Select a partition to modify its settings (file system, mount point, etc.), a free space to create partitions, or a device to initialize its partition table. 即当前配置的分区和挂载点的概述, 选择Finish partitioning and write changes to disk,继续回车
  • 步骤15:If you continue, the changes listed below will be written to the disks. Otherwise, you will be able to make further changes manually; 一个确认提示, 选择yes, 回车继续;如果选择默认的no, 会回到上一步
  • 步骤16:Configure the package manager;Scanning your installation media finds the label; 是否扫描额外的安装介质; 选择no ,回车继续
  • 步骤17:A network mirror can be used to supplement the software that is included on the installation media. This may also make newer versions of software available; 网络镜像的配置; debian12不用镜像,安装包里自带了,直接选no回车继续; debian11安装时,这里也选no;但是11.7.0那个包安装时,即便有梯子下载速度也很慢,所以debian这里需要断网; 但是11.11.0的包我安装的时候联网就通过了;
  • 步骤18:Configuring popularity-contest; 提示是否开启匿名信息统计,选择no回车
  • 步骤19:选择默认的软件包:SSH server、standard system utilities; 回车继续
  • 步骤20: 安装结束; 回车 continue 会自动重启; 关机后需要把 虚拟机的设置里面的 CD/DVD 驱动器 取消连接

二、debian的环境搭建

1、软件包的源配置

  • /etc/apt/sources.list
  • debian12那个系统DVD安装好后,发现 /etc/apt/sources.list 中的内容是 deb cdrom:[Debian GNU/Linux 12.8.0 _Bookworm_ - Official arm64 DVD Binary-1 with firmware 20241109-11:05]/ bookworm contrib main non-free-firmware,因为这个系统最初通过离线 DVD 安装的,安装的DVD中包含所有的了

a、备份原来的

1
2
su
cp /etc/apt/sources.list /etc/apt/sources.list.bak
Copied!

b、解释

  • deb: 二进制软件包的来源,这些包是已经编译好的,可以直接安装到你的系统中,它是普通用户用来安装应用程序和库的来源
  • deb-src: 源码软件包的来源。源码包包含了软件的源代码,你可以从中编译和安装软件,如果需要修改或自行编译软件,可以用到这个源
  • bookworm/bullseye: debian12/debian11 ;是发行版的代号
  • main:完全开源的软件,符合 Debian 自由软件指南;
  • contrib:自由软件,但需要依赖非自由的软件(如驱动或库)
  • non-free:非自由软件(可能有版权或许可限制,用户可以使用但不能修改)
  • non-free-firmware:从 non-free 中分离出来的非自由固件,专用于硬件驱动和设备运行支持

c、使用官方的源(需要梯子)

1
su #进入root用户
Copied!
I、debian12
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat > /etc/apt/sources.list << EOF
# 提供主要的软件包库,是系统大部分软件的来源,包括基础的操作系统组件和应用程序包,用于升级系统和安装软件
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware

# 提供安全性修复的更新,包含及时修复的安全漏洞补丁,用于修复系统或软件中的已知漏洞
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

# 快速修复一些关键问题,目的是解决一些无法等到下一个点版本(例如从 12.1 到 12.2)发布才能修复的问题
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

# 反向移植,指从 Debian 的较高版本中(例如 bookworm)选取特定的软件包,并在当前稳定版本(例如 bullseye)上进行重新编译和打包;用户可以在稳定版系统中使用更高版本的应用程序或工具,而无需升级整个系统到测试版或不稳定版
# deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
# deb-src http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
EOF
Copied!
  • debian11 只需把 bookworm 改为 bullseye

d、使用国内镜像源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat > /etc/apt/sources.list << EOF
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb http://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
# deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF
Copied!

上面是debian11的配置; debian12的去找镜像网站有相关配置,这里不写了

e、更新

1
2
3
apt update && apt-get update
apt list --upgradable #查看可以更新的软件包
apt upgrade 
Copied!

f、apt相关命令

 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
sudo apt update                           # 更新包索引
sudo apt upgrade                          # 升级所有已安装的软件包到最新版本
apt list python3                          # 显示是否已安装
sudo apt install <package>                # 安装指定的软件包
sudo apt remove <package>                 # 删除指定的软件包(保留配置文件)
sudo apt purge <package>                  # 完全删除指定的软件包(包括配置文件)
apt search <keyword>                      # 搜索与关键字相关的软件包
apt show <package>                        # 查看指定软件包的详细信息
apt list --installed                      # 列出所有已安装的软件包
apt list                                  # 列出所有可用的软件包
dpkg -l | grep <package>                  # 检查指定软件包是否已安装
sudo apt autoremove                       # 清理无用的依赖(卸载后遗留的包)
sudo apt autoclean                        # 清理下载的已过期或无用的软件包缓存
sudo apt clean                            # 清理所有下载的包缓存(慎用)
sudo apt download <package>               # 下载但不安装软件包
apt-cache depends <package>               # 检查指定软件包的依赖关系
apt-cache rdepends <package>              # 检查哪些软件包依赖指定的软件包
sudo apt --fix-broken install             # 手动修复被破坏的软件包
apt list <package>                        # 列出与指定包相关的信息(包括状态、版本等)
sudo apt full-upgrade                     # 执行全面升级(可能会移除不需要的包)
sudo apt install -f                       # 修复依赖关系并安装未完成的软件包
sudo apt hold <package>                   # 将指定软件包标记为保持当前版本(不升级)
sudo apt unhold <package>                 # 取消对软件包的保持标记(允许升级)
apt policy <package>                      # 查看指定软件包的版本和安装来源
sudo apt-add-repository <repository>      # 添加 PPA 或自定义的源
sudo apt update && sudo apt upgrade -y    # 一次性更新包索引并升级所有软件包(跳过确认)
sudo apt dist-upgrade                     # 执行发行版升级(处理复杂依赖变化)
sudo apt-mark hold <package>              # 阻止软件包升级(标记为 hold 状态)
sudo apt-mark unhold <package>            # 取消 hold 标记,允许升级
sudo apt list --upgradable                # 列出可以升级的软件包
apt-cache search <package>                # 使用 apt-cache 搜索软件包
sudo apt-get check                        # 检查系统是否有破损的依赖关系
sudo apt-get changelog <package>          # 查看指定软件包的变更日志
sudo dpkg-reconfigure <package>           # 重新配置已安装的软件包
sudo dpkg --configure -a                  # 修复未正确配置的软件包
Copied!

2、网络配置

  • 静态ip + 自定义dns
  • 自定义dns时, 不要去修改,/etc/resolv.conf,因为可能重启后失效; 去在 /etc/network/interfaces 配置
  • ip addr 查看当前的ip
  • vmware中配置了端口转发

0、resolvconf

  • 默认情况下,resolvconf并没有安装, 所以在 /etc/network/interfaces 中配置的 dns-nameservers 并不会自动同步到 /etc/resolv.conf, 并且每次系统重启或者使用命令 systemctl restart networking.service 后, resolv.conf 都会被 dhclient 覆盖;
  • dhclient 是常用的 DHCP 客户端,它会根据 DHCP 服务器提供的 DNS 信息自动更新 /etc/resolv.conf, 查看 /etc/dhcp/dhclient.conf 中有request 里面有 domain-name, domain-name-servers, 和 domain-search;是 DHCP 客户端从 DHCP 服务器请求的选项,如果 DHCP 服务器提供了这些选项,dhclient 默认会更新 /etc/resolv.conf
  • 在不安装额外程序的情况下, 也可以使用命令 sudo chattr +i /etc/resolv.conf ,给这个文件设置只读权限, 这样就不会被覆盖了; sudo chattr -i /etc/resolv.conf 恢复权限
  • resolvconf 依赖于 /etc/network/interfaces、DHCP 等服务来收集 DNS 配置信息,并通过这些信息更新 /etc/resolv.conf。resolvconf会将来自多个来源(例如 DHCP 客户端、静态配置、VPN 配置等)的 DNS 信息汇总并合并,最终由 resolvconf 更新 /etc/resolv.conf;
  • 安装 resolvconf 后, /etc/resolv.conf 被替换为符号链接,指向 /run/resolvconf/resolv.conf; 原来的resolv.conf中的内容被删除,备份在/etc/resolvconf/resolv.conf.d/original中
  • 安装了 resolvconf 后,会在/etc/dhcp/dhclient-enter-hooks.d/ 目录下创建 resolvconf 脚本, dhclient 会通过这个脚本将获取到的 DNS 信息交给 resolvconf 管理; 这些动态信息(包括在/etc/network/interfaces中配置的)通常被写入 /run/resolvconf/interface/ 目录中
  • resolvconf 使用多个配置文件片段来管理 DNS 信息,配置文件路径包括:
    • /etc/resolvconf/resolv.conf.d/head:内容会添加在动态生成的 /etc/resolv.conf 文件的最开头,通常是注释行(例如,文件生成说明)或管理员希望固定放在前面的配置
    • /etc/resolvconf/resolv.conf.d/base:基本 DNS 信息,配置一些静态的dns,始终会添加到resolv.conf; resolvconf收集到的动态信息会跟base文件中的配置进行merge;如:base中配置了 search a.b.c,收集到的动态信息是 search x.y.z,最终结果就是:search a.b.c x.y.z
    • /etc/resolvconf/resolv.conf.d/tail:尾部内容;可以用来加入一些额外的选项,比如 options inet6;如果不需要任何追加内容,可以将该文件留空。
  • 可以直接在 /etc/network/interfaces 中配置 dns-nameservers 和 dns-search, 在resolvconf的帮助下会同步到 resolv.conf
  • 文档目录: /usr/share/doc/resolvconf/README.gz gunzip README.gz
  • resolvconf 和 systemd-resolved 两个软件冲突,安装一个就会卸载另一个; systemd-resolved的功能比resolvconf更多,如mdns和dns缓存等,但我不会用,也没必要用

a、原始配置的解释

1、运行 cat /etc/resolv.conf ; 显示:

1
2
3
domain localdomain
search localdomain
nameserver 172.16.106.2
Copied!
  • 、找到这个 nameserver, 写在后面 /etc/network/interfaces 中的 gateway; nameserver就是使用的dns服务器, 在vmware虚拟机中,这个默认被配置为nat的网关ip,用来转发流量和dns解析; 但是也不是必须与 网关ip相同, 可以配置成多个不同的dns, 写多行 nameserver, 配置的dns中就算没有网关ip, nat的外网访问依然还是保持不变, 所以网关是网关,dns是dns,两个不同的功能和概念;
  • 虚拟机linux中的网关ip虽然默认没有文件配置(除非配置静态ip),但可以执行命令: ip route | grep default 可以查看到
  • 在 VMware 创建的 NAT 模式的虚拟机中,虚拟机的网关 IP 并不是直接存储在虚拟机的配置文件(不在linux虚拟机的文件系统中)中,而是通过 VMware 的网络配置文件定义,并由虚拟机通过 DHCP 或静态配置使用,可能会存放在宿主机 /Library/Preferences/VMware Fusion/networking (VNET_8_HOSTONLY_SUBNET)中,这是标识了nat能用的子网段,以 .0 结尾,但是网关ip用的是以 .2 结尾的;
  • /Library/Preferences/VMware Fusion/vmnet8/nat.conf 中有下面的这个配置,也标识了网关ip;注意这是纯nat模式,和自定义模式还不相同;
1
2
3
# NAT gateway address
ip = 172.16.12.2
netmask = 255.255.255.0
Copied!
  • mac上vmware fusion自定义模式实际上是桥接, 在 /Library/Preferences/VMware Fusion/networking 中的 VNET_2_HOSTONLY_SUBNET 中有显示;在 /Library/Preferences/VMware Fusion/vmnet2/nat.conf 中也有如下表示(vmnet2 也在软件中显示的我的自定网络的名字):
1
2
3
# NAT gateway address
ip = 172.16.106.2
netmask = 255.255.255.0
Copied!
  • nat 模式的网关 ip xxx.xxx.xxx.2 通常以 .2 结尾, 因为约定俗成; .0 是一个网段的网络标识地址,表示整个子网常表示子网本身,不能分配给设备或服务使用; .1 通常用于路由器,在家庭路由器中,192.168.1.1 是常见的默认网关,虽然 VMware 可以选择使用 .1,但它通常会避开这个地址,以避免与一些软件或网络设备的默认配置产生冲突
  • 、这个文件就是被修改,重启后也会恢复原样; 若要进行配置,需要修改后执行 chattr +i /etc/resolv.conf 变为只读的;恢复: chattr -i /etc/resolv.conf
  • domainsearch 最好保持不变, 就用 localdomain, 更安全, 因为外网中没有localdomain的顶级域名
  • localdomain 就是个默认的域名占位符,假如我 ping aaa, 他会尝试去dns中查找 aaaaaa.localdomain; 可以删除localdomain,替换为自己要用的
  • search 就是一个搜索域, 用于补全主机名,假如配置成 com, 我执行 ping baidu 就能直接ping成功; 但是不能和本地hosts文件配合使用,如在hosts中配置: 1.1.1.1 a.com ; 则我执行 ping a, 是不会成功的, 因为会直接去dns服务器中查找(nat模式虚拟中就是那个网关ip),网络上并没有 a.com 这个地址,所以不会成功,这种只能 ping a.com;
  • domainsearch 功能相同,原理也相同; 但是1、search若配置后, 会覆盖domain 的配置; 2、search 支持多个 以空格分开, domain 仅支持一个

2、运行 cat /etc/network/interfaces ; 显示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug ens160
iface ens160 inet dhcp
Copied!
  • 详情见下面修改静态ip的示例

b、静态ip+dns配置

  • ens160 :网络接口名称,必须使用原本默认的, 但是有些老linux使用的是 eth0,所以需要修改前预先查看当前系统使用的 网络接口名称; 在后面修改的配置文件示例作出相应的修改才行; 原来用的哪个,修改后也应该用哪个;可以用 ip link show 或者 ifconfig, 或者直接看 /etc/network/interfaces文件
  • 如果要配置静态ip,那就必须要配置gateway(网关)ip,否则不能连接外网;局域网使用是可以的
  • 为什么默认不需要配置?因为默认网络是动态ip,是通过dhcp自动发现的,通过dhcp,linux就知道了该找哪个网关ip;静态ip则不然;
  • 桥接模式也需要配置网关ip(通常为路由器ip),默认使用动态ip时,也是用dhcp自动发现的;
  • 若要配置dns,则最好在/etc/network/interfaces中配置,虽然/etc/resolv.conf中也能配置,但是重启就会没了;而/etc/network/interfaces中配置的dns则会自动同步到resolv.conf,重启也不会消失
  • lo 的两行是非必须的,是回环地址(127.0.0.1),可以不用显式配置,linux会在开机后自动启用lo,可以用 ping 127.0.0.1 来检测
  • 也可以设置: dns-search com # 设置DNS搜索域 ,见上面的 resolv.conf配置详解(就是这个resolv.conf里的 search, 会自动同步到resolv.conf)
 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
su
export PATH=$PATH:/usr/sbin

cp /etc/network/interfaces /etc/network/interfaces.bak
cat > /etc/network/interfaces << EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# allow-hotplug ens160
# iface ens160 inet dhcp
auto ens160
iface ens160 inet static
    address 172.16.106.12
    netmask 255.255.255.0
    gateway 172.16.106.2
    dns-nameservers 223.5.5.5 119.29.29.29 8.8.8.8
EOF

cat /etc/network/interfaces #确认一下
systemctl restart networking.service
ip addr

######### 安装resolvconf
apt install resolvconf
reboot
systemctl status resolvconf.service # 服务状态为 active (exited),说明它已经成功运行并退出(这类服务是一次性任务,在启动后完成工作便退出)
cat /etc/resolv.conf
ls -l /etc/resolv.conf
systemctl start resolvconf.service
systemctl stop resolvconf.service
systemctl enable resolvconf.service
systemctl disable resolvconf.service

cat /etc/resolv.conf # 查看dns是否被自动更改
ls -l /etc/resolv.conf # 查看是否为软链接
# 关闭 quanx
ping www.baidu.com
wget www.baidu.com
rm index.html
dig www.baidu.com # SERVER: 223.5.5.5#53(223.5.5.5) (UDP)
nslookup -debug www.baidu.com  # Server:223.5.5.5
Copied!

c、配置默认语言

  • 尽管在安装时已经选择了默认语言(即安装的第一步,选择安装程序的显示语言,这个设置也会成为安装后系统的默认语言)
  • 在系统安装完成后,可以通过命令重新配置; 如果安装时选择的英文, 安装后用命令把中文加为第二个语言,但是默认首选还是英文,只是添加了个中文环境信息,可以给其他软件使用;如: tldr -L zh tree ,这个命令,如果不添加中文语言环境的支持,是不会显示中文的
  • 默认 tty界面(非远程连接、非图形化界面的系统自己的操作界面,那个黑窗口) 无论怎么配置,通常也是不支持中文的,除非安装 fbterm 这个第三方的tty
 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
su
export PATH=$PATH:/usr/sbin
# 鼠标滚轮可以快速滚动
dpkg-reconfigure locales
# 选中 en_US.UTF-8 和 zh_CN.UTF-8
# 用空格选中(多选),上下箭头移动, tab键移至 [ok] 回车确认; 提示选择 en_US.UTF-8 为首选默认语言,选择后回车确定
# 重新登录或重启
locale     # 查看目前系统所使用的语言环境
locale -a     # 查看系统已安装的所有语言

# 环境变量有:   (默认都是 "en_US.UTF-8" ; 若修改默认的语言为中文则变为:   "zn_CN.UTF-8"  )
LANG         # 系统的主要语言和地区设置,影响所有未单独设置的 LC_* 变量。
LANGUAGE     # 定义语言优先顺序,主要用于翻译系统消息 (LC_MESSAGES)。
LC_ALL       # 强制覆盖所有 LC_* 变量的值,优先级最高,通常用于调试。

LC_CTYPE     # 定义字符分类和编码规则,影响字符输入和显示 (如 UTF-8)。
LC_NUMERIC   # 控制数值格式,例如小数点符号、分组符号等。
LC_TIME      # 定义日期和时间格式 (如美式日期 vs 欧式日期)。
LC_COLLATE   # 控制字符串比较和排序规则,影响文件名排序等。
LC_MONETARY  # 控制货币格式,例如货币符号、千分位分隔符等。
LC_MESSAGES  # 定义系统消息的语言 (如错误提示、确认信息等)。
LC_PAPER     # 控制默认纸张尺寸 (如 Letter vs A4)。
LC_NAME      # 定义人名的显示格式 (如姓氏在前或名字在前)。
LC_ADDRESS   # 控制地址格式和显示规则。
LC_TELEPHONE # 定义电话号码的格式 (如是否显示国家代码)。
LC_MEASUREMENT # 控制度量单位 (如公制 vs 英制)。
LC_IDENTIFICATION # 描述语言环境的特定信息,通常不直接影响用户体验。

# 不需要自己配置环境变量,直接使用系统默认的体验最佳
Copied!

d 、重新配置键盘布局

  • 装好系统后,默认不用修改
  • 键盘布局就是,在 tty 界面,或者linux自己的图形化界面的键盘映射;其目的是让操作系统正确识别和映射键盘上的按键到字符或功能;
  • 按键 Shift+2 输出 @(在美式键盘中)还是 " (在英式键盘中)某些键盘布局会增加对语言特定符号的支持,比如法语的 é 或德语的 ß
  • 某些布局支持 AltGr(右 Alt 键)的特殊功能,用于输入更多字符
  • 但是远程连接的话就没这个说法了,用的是我本地的电脑自己的键盘映射,传给linux的就是实际的字符信息了;
  • 最佳选择: 美式键盘(US Layout):标准 QWERTY 布局,符号按键位置国际通用;
  • 中国市场的键盘以美式 QWERTY 布局为主,硬件上没有区别,中文输入完全依赖系统输入法
  • 默认 tty界面(非远程连接、非图形化界面的系统自己的操作界面,那个黑窗口) 无论怎么配置,通常也是不支持中文的,除非安装 fbterm 这个第三方的tty
1
2
3
4
su
export PATH=$PATH:/usr/sbin
dpkg-reconfigure keyboard-configuration
service keyboard-setup restart
Copied!

e、安装 sudo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# sudo命令需要用户需要输入自己的密码进行身份验证,而不是 root 密码。这是 sudo 的一大优点,可以避免暴露 root 密码
su
export PATH=$PATH:/usr/sbin
apt update
apt list sudo
ls /usr/sbin/sudo
apt install sudo
/usr/sbin/usermod -aG sudo $(whoami) #将helq用户加入sudo的用户组; 
# -a (append):表示将用户添加到新的组时,保留其现有的组。如果不加 -a,用户将会退出其他组,仅加入指定的组
# -G(group):后面跟一组组名,用逗号分隔,表示要添加用户的目标组
groups helq #确认用户已被添加到 sudo 组;输出中应该包含 sudo
# 重新登录使更改生效
sudo echo "aaa" #测试
Copied!

f、前置软件安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
su
export PATH=$PATH:/usr/sbin
apt update && apt-get update
apt install -y net-tools build-essential openssh-server curl unzip zip tree cmake jq

# 安装zsh
apt install zsh
zsh --version
sudo chsh -s $(which zsh) # 设置 zsh 为 root用户的 默认 shell
reboot # 重启
chsh -s $(which zsh) # 重新为普通用户设置
Copied!

f、允许root直接登录

默认情况下,是不允许 root直接登录的即: ssh -p 22 root@172.16.106.12 会失败

1
2
echo "PermitRootLogin yes" | sudo tee -a /etc/ssh/sshd_config >/dev/null # 解决方式, 重启启动虚拟机就可以了
reboot # 重启
Copied!

g 、虚拟机克隆的情况

 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
# 执行下面这个命令,重新配置静态ip dns 和 hostname
su -c "wget -q -O- --header='Cache-Control: no-cache' \"https://raw.githubusercontent.com/loganoxo/Config/master/linux/install/pre.sh?$(date +%s)\" | bash -s -- \"run\" \"$(whoami)\" \"clone\" "

################# 重新生成 ssh host key ##############################
# 因为 A、B 和 C 虚拟机的 SSH 主机密钥是克隆时复制过来的,三台虚拟机的密钥相同,所以 SSH 客户端会认为它们是同一台主机。  
# ssh连接这三台机器时,本地~/.ssh/known_hosts 文件中这三台机器的指纹完全相同;  
# 当你尝试通过 SSH 连接到主机时,SSH 客户端会检查该主机的指纹是否与之前记录的匹配。如果三台虚拟机的指纹相同,当你切换连接到另一个虚拟机时,SSH 客户端会认为主机身份可能被篡改,提示警告  
# 主机指纹的目的是确保客户端连接到正确的服务器。如果三台虚拟机的指纹相同,客户端无法区分它们。这可能会带来以下问题:  
#   •  中间人攻击更容易成功,因为客户端无法验证主机的唯一性。  
#   •  如果某台虚拟机被攻破,攻击者可能利用相同的指纹冒充其他虚拟机  
# 管理混乱: 在使用工具(如 Ansible、SSH 配置文件)管理多台主机时,相同的指纹可能导致配置错误或意外连接到错误的主机  
# 尽量为每台虚拟机生成唯一的 SSH 主机密钥,确保指纹唯一性,以避免潜在问题并提高系统安全性。 
# 在 克隆出来的虚拟机中执行:
sudo rm -f /etc/ssh/ssh_host_*
sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
sudo ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
sudo systemctl restart ssh
sudo reboot
# ssh-keygen: 用于生成 SSH 密钥的工具; -t rsa: 指定生成密钥的类型为 RSA。RSA 是一种常用的公钥算法  
# -f /etc/ssh/ssh_host_rsa_key : 指定生成的密钥文件的路径和文件名; 公钥会自动生成在相同路径,文件名为 /etc/ssh/ssh_host_rsa_key.pub ; 私钥存储在同目录 /etc/ssh/ssh_host_rsa_key# -N ""   : 双引号不能去掉; 设置密钥的密码为空;空密码适用于 SSH 主机密钥,因为它们需要在没有人工干预的情况下由 SSH 服务自动使用

############## 客户端中需要把之前在 ~/.ssh/known_hosts 中生成的 ip+指纹 删除
ssh-keygen -R <VM Ip>
ssh-keygen -R "172.16.106.110"
ssh-keygen -R "172.16.106.120"
ssh-keygen -R "172.16.106.130"
cat ~/.ssh/known_hosts
# 重新用 SSH 连接; 会重新提示接受新的指纹
Copied!

三、以下配置可以用脚本执行

1、安装shell插件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
su helq
export PATH=$PATH:/usr/sbin
sudo apt update
# 安装 git
sudo apt install git  
git --version

# 安装 ohmyzsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions  
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
rm ~/.zshrc.pre-oh-my-zsh
# 安装 ohmybash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
rm ~/.bashrc.omb-backup-*
# 安装 starship
curl -sS https://starship.rs/install.sh | sh
Copied!

2、环境搭建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
su helq
export PATH=$PATH:/usr/sbin/                                # 临时解决debian系统的默认PATH没有sbin的问题
# git
sudo apt install git
git --version
# ssh-github 私钥
### 可选-上传 ~/.ssh/ 下的github私钥 到 虚拟机
ssh -T git@github.com
# 若有权限太宽泛的问题
chmod 600 /home/helq/.ssh/loganoxo-GitHub
ssh -T git@github.com
# eval "$(ssh-agent -s)"

cd ~
mkdir -p ~/.aria2 ~/.config ~/.ssh ~/.shell_bak ~/software ~/Data ~/.local/bin ~/.config/navi ~/.zoxide ~/.undodir ~/.vim ~/Temp ~/share
git clone https://github.com/loganoxo/Config.git ~/Data/Config
mv ~/.bashrc ~/.shell_bak/ && mv ~/.profile ~/.shell_bak/ && mv ~/.zshrc ~/.shell_bak/
bash ~/Data/Config/my-ln.sh
sudo bash ~/Data/Config/linux/for_root/create_root_files.sh "$HOME" "$HOME/Data/Config/linux/for_root/template.sh"
sudo ln -sf ~/Data/Config/vim/settings.vim /root/.vimrc
source "$HOME/.zshrc"
Copied!

3、安装必备工具

  • debian等linux系统,若是arm架构的,则不推荐装 homebrew(linuxbrew),有很多包没有通用二进制文件,只能在本地编译,很慢又容易出依赖的问题,不友好
 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
# 安装防火墙
sudo apt install ufw -y
sudo ufw status #inactive,说明 UFW 未启用
# 默认情况下,UFW 会阻止所有传入的网络流量,除非明确允许。例如,如果没有添加允许 SSH 的规则,远程登录将会被拒绝;
# 默认情况下,UFW 会允许所有传出的网络流量,比如从本机访问互联网的请求
# UFW 的 allow 命令默认允许的是传入流量; ufw allow ssh 等效于 ufw allow in ssh ;  传出的用法如: ufw allow out 53 
sudo ufw disable #禁用
sudo ufw default deny incoming && sudo ufw default allow outgoing
# enable之前先开放 ssh 端口, 否则远程连接会断开; 允许SSH(端口 22) HTTP(端口 80) HTTPS(端口 443)
sudo ufw allow ssh && sudo ufw allow http && sudo ufw allow https && sudo ufw allow 80
sudo ufw allow 6000:6007/tcp && sudo ufw allow 6000:6007/udp #允许使用端口 6000-6007 的 连接
sudo ufw limit ssh # 限制ssh登录尝试的连接次数,防止暴力破解密码;每个ip每30秒最多尝试6次
sudo ufw enable #启用
sudo ufw status verbose #查看所有端口开放情况
sudo ufw reset #清空所有规则并恢复默认配置
sudo ufw delete allow ssh #删除某个规则
#根据规则编号删除
sudo ufw status numbered
sudo ufw delete <编号>

# 安装 nginx
sudo apt install nginx -y
sudo systemctl list-unit-files --state=enabled #查看所有自启动的软件
sudo systemctl disable nginx.service #禁止nginx开机自启
sudo systemctl status nginx
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl status nginx
curl http://127.0.0.1:80 #测试
# 在本地宿主机访问 http://172.16.106.12 ; http://127.0.0.1:12382/

# 安装 go
sudo apt install golang-go
go version
Copied!

4、命令行工具

  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
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
su helq
# 安装 bat
sudo apt install bat #这样安装的bat会因为避免名字冲突而让他的命令变为 batcat, 所以需要符号链接
# 切换到普通用户执行:
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat

# 安装fzf
# sudo apt install fzf #版本太低了
mkdir -p ~/software  
git clone https://github.com/junegunn/fzf.git ~/software/fzf  
wget -P "$HOME/software/fzf/" https://github.com/junegunn/fzf/releases/download/v0.56.3/fzf-0.56.3-linux_arm64.tar.gz  
tar -xzf ~/software/fzf/fzf-0.56.3-linux_arm64.tar.gz -C ~/software/fzf  
ln -sf ~/software/fzf/fzf ~/.local/bin/fzf

# 安装fd
sudo apt install fd-find
ln -s $(which fdfind) ~/.local/bin/fd

# 安装zoxide
mkdir -p ~/.zoxide
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh


# 安装vim
mkdir -p ~/.undodir ~/.vim
sudo apt install vim
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# 测试 :PlugStatus :PlugInstall  :PlugClean
vim -c ':PlugStatus' -c ':PlugInstall' -c ':PlugClean' -c ':qa!'


# 安装sdkman
curl -s "https://get.sdkman.io?rcupdate=false" | bash #不修改zshrc 和 bashrc
sdk version
sdk list java
sdk install java 8.0.432.fx-zulu
java -XshowSettings:properties -version #查看安装的jdk详细版本信息
sdk install java 11.0.25.fx-zulu
sdk install java 17.0.13.fx-zulu
sdk install java 17.0.13-zulu
sdk install java 17.0.12-oracle #设为默认
sdk install java 17.0.13-tem
sdk default java 17.0.12-oracle
java -version
sdk list maven
sdk install maven 3.9.9
sdk default maven 3.9.9
# 重启虚拟机
mvn -version


# 安装fnm
curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell #不修改zshrc 和 bashrc
ln -s ~/.local/share/fnm/fnm ~/.local/bin/fnm
# eval "$(fnm completions --shell zsh)" #命令补全,没啥用,就只是补全命令,不会补全当前存在的node版本
fnm -V                             #查看fnm的版本
fnm ls                             #查看本地已安装的nodejs的版本
fnm current                        #打印当前使用的node版本
fnm ls-remote                      #通过网络查看所有已发布的nodejs版本
fnm ls-remote --lts                #通过网络查看所有已发布的长期支持的nodejs版本
fnm ls-remote --sort <SORT>        #默认asc升序,desc为倒序
fnm install --lts                  #安装最新的LTS版本,会自动加别名 default, lts-latest
fnm install --latest               #安装最新的版本,会自动加别名 latest
# fnm install v18.3.0              #安装指定的版本
# fnm install 17                   #部分版本匹配,从你的部分输入中猜测最新的可用版本,它将安装版本为v17.9.1 的节点


# fnm use <alias/version>          #在当前shell中临时使用某个版本的node
fnm use 22
fnm use lts-latest
fnm use default

# fnm default <alias/version>      #将某个版本设为默认版本;即新shell中默认使用的node版本
fnm default lts-latest

# fnm uninstall <alias/version>    #卸载某个版本

# fnm 给某node版本起别名,用于让其他命令在使用时,将版本号用别名替换;
# fnm alias [OPTIONS] <alias/version> <NAME>  设置别名; 别名唯一;
# 若此次设置的别名 aaa 与其他版本的别名重复,则会自动取消之前的别名,给这个命令里的版本17设置别名 aaa
# fnm alias 17 aaa 
fnm alias lts-latest lts


# fnm unalias [OPTIONS] <alias_name>  取消别名
# fnm unalias lts
which -a npm
npm -g install nrm pm2 prettier yarn yrm
npm list -g
nrm ls
nrm use taobao

# 安装rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustc --version

# 安装navi
tt
# 方法一,用cargo
cargo install --locked navi
# 方法二,自己编译,有问题
git clone https://github.com/denisidoro/navi && cd navi
make BIN_DIR=/home/helq/.local/bin install
# 方法三,用脚本,有问题,在debian上执行不了
BIN_DIR=/home/helq/.local/bin bash <(curl -sL https://raw.githubusercontent.com/denisidoro/navi/master/scripts/install)

# tldr
cargo install tealdeer
tldr --update
tldr bat
tldr -L zh tree

# glow
mkdir -p ~/software  
wget -P "$HOME/software" https://github.com/charmbracelet/glow/releases/download/v2.0.0/glow_2.0.0_Linux_arm64.tar.gz  
tar xvzf ~/software/glow_2.0.0_Linux_arm64.tar.gz -C "$HOME/software/"  
mv ~/software/glow_2.0.0_Linux_arm64 ~/software/glow  
ln -s ~/software/glow/glow ~/.local/bin/glow

# the_silver_searcher
sudo apt install silversearcher-ag

# trash-cli https://github.com/andreafrancia/trash-cli
sudo apt install python3 python3-pip python3-venv
sudo apt install trash-cli # 版本很低

sudo mkdir --parent /.Trash
sudo chmod a+rw /.Trash
sudo chmod +t /.Trash   

# +t 设置粘滞位 (sticky bit) 权限;只有文件或子目录的所有者,或目录本身的所有者(通常是管理员),才能删除或重命名该目录内的内容;
# 其他用户即使有写权限,也无法删除非自己拥有的文件

#   trash-cli https://github.com/andreafrancia/trash-cli
#   trash-put   <file/directory>                # trash files and directories.
#   trash-empty                                 # 从垃圾箱中删除所有文件
#   trash-empty <days>                          # 仅删除已删除时间超过 <days> 的文件
#   trash-list | grep <path>                    # list trashed files.
#   trash-restore                               # 选择文件进行恢复, 若要覆盖同名文件则 加 --overwrite
#   trash-rm \*.o                               # 从垃圾箱中删除与模式匹配的文件
#   从 home 分区回收的文件将被移动到此处 ~/.local/share/Trash/


# uv 包含了 pipx 的功能  https://docs.astral.sh/uv/
# 默认是managed: 最先找uv管理的python,其次找系统python(若此时在conda的某个环境中,conda该环境的python也会被找到),最后才下载;only-managed:只找uv管理的python,没有则下载;
# # 安装选项:https://docs.astral.sh/uv/configuration/installer/#disabling-shell-modifications
curl -LsSf https://astral.sh/uv/install.sh | sh # 默认在 ~/.local/share/uv/
# brew install uv
export UV_PYTHON_PREFERENCE="only-managed"
uv python list
uv python install # 默认在 ~/.local/share/uv/python/
uv python install 3.12
uv python uninstall 3.12
uv tool list
uv tool install ruff # 安装命令行工具,默认在 ~/.local/bin/  ~/.local/share/uv/tools/
uv tool install ruff -p 3.12 # 指定安装的命令行工具的虚拟环境中的python版本
ruff --version
ruff check a.py # 这个命令的功能: 检查python代码是否有问题
uv tool uninstall ruff
# 命令补全: https://docs.astral.sh/uv/getting-started/installation/#upgrading-uv


# 安装miniconda (超过200人公司使用收费) 免费替代: https://github.com/conda-forge/miniforge
# https://docs.anaconda.com/miniconda/install/
# https://docs.conda.io/projects/conda/en/stable/user-guide/index.html
# miniconda3 
# 寻找适合的版本 https://repo.anaconda.com/miniconda/   带py的指base环境的python版本
########## mac  也可以用  brew install miniconda
cd ~/Temp
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/Temp/miniconda.sh
shasum -a 256 ~/Temp/miniconda.sh # 验证文件的 sha256 的值
bash ~/Temp/miniconda.sh # 安装路径与mac同步为 ~/.miniconda3
rm ~/Temp/miniconda.sh
conda init bash zsh

####### linux
### 静默安装
mkdir -p ~/Temp
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/Temp/miniconda.sh
bash ~/Temp/miniconda.sh -b -u -p ~/.miniconda3 # -b:不对 shell 脚本进行 PATH 修改,以非交互模式(静默模式)运行安装; -u:如果指定的安装路径(通过 -p)已有 Miniconda 安装,它会更新而不是报错或覆盖安装; -p: 指定安装路径
rm ~/Temp/miniconda.sh

### 按照提示安装
mkdir -p ~/Temp
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/Temp/miniconda.sh
bash ~/Temp/miniconda.sh # 安装路径与mac同步为 ~/.miniconda3
rm ~/Temp/miniconda.sh
# 也可以用apt安装 https://docs.conda.io/projects/conda/en/stable/user-guide/install/rpm-debian.html

# 静默安装后,可选择shell环境,会修改 .zshrc .bashrc
conda init zsh
conda init bash
conda init --all # 在所有可用 shell 上初始化 conda
conda --version
conda list
conda info
# base环境 推荐 只能用于安装 anaconda、conda 和 conda 相关的软件包,例如`anaconda-client`或`conda-build`
# 配置文件 : ~/.condarc
conda config --set auto_activate_base false # 设置开启新shell的时候不自动进入conda的base环境
conda config --set changeps1 False # 抑制 conda 自己的提示修饰符
# conda config --add channels conda-forge 会加在第一个
conda config --append channels conda-forge
conda config --remove channels conda-forge
conda -V
conda create -n env_test python=3.9 # -n 是创建的环境的名字
conda activate env_test
python3 -V
conda activate # 默认是base环境
python3 -V
conda deactivate
conda update conda # 更新自己
# 安装包或者命令行工具
conda install trash-cli # 官方的 channel 没有很多的开源包
conda install -c conda-forge trash-cli # 指定 conda-forge 的channel
# install的命令行工具的执行文件放在当前环境的bin目录下,如 /home/helq/miniconda3/envs/env_test/bin/trash-put; 同时也会被pip管理
# install 也可以安装python库文件,可以在 Python 脚本或交互式环境中直接导入并使用 import numpy as np

# 卸载conda
rm -rf ~/conda
rm -rf ~/.condarc ~/.conda ~/.continuum

# 导出某个非base环境到yaml文件; 仅将 Anaconda 或 Miniconda 文件复制到新目录或另一台计算机不会重新创建环境。您必须将环境作为一个整体导出
conda activate env_test
conda export -f env_test.yml --no-builds  或者 conda env export -f env_test.yml --no-builds
# --override-channels 不导出.condarc里的channel; 
# --no-builds 不导出构建编号,当跨平台迁移的时候必加,因为同一个版本的包在不同平台上的构建编号肯定不同;如: mac导出到linux上的时候
# 导入
conda env create -f env_test.yml


# docker
# https://docs.docker.com/engine/install/debian/#install-using-the-repository
sudo apt update
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done  #卸载冲突的包
sudo apt autoremove

# Set up Docker's `apt` repository
# Add Docker's official GPG key:
sudo apt-get update && sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# Install the Docker packages
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Verify
sudo docker run hello-world
sudo docker images
sudo docker container ls -a

# 以非 root 用户身份管理 Docker; 
# 创建一个名为`docker`的 Unix 组并向其中添加用户。当 Docker 守护进程启动时,它会创建一个可供`docker`组成员访问的 Unix 套接字
sudo groupadd docker              # 创建`docker`组
sudo usermod -aG docker $USER     # 将您的用户添加到`docker`组
sudo reboot                       # 注销并重新登录,以便重新评估您的组成员身份
docker run hello-world            # 验证您是否可以在没有`sudo`情况下运行`docker`命令
# 如果在分配用户组之前 用sudo权限 执行过 docker CLI 中的如 docker login 这类命令, 会创建 ~/.docker 目录;
# 在上述的情况下, 分配用户组后, 用普通用户直接执行 docker 命令, 有可能会报错, 因为 ~/.docker 的权限是 root 用户的; 报错信息可能为:
# WARNING: Error loading config file: /home/user/.docker/config.json -stat /home/user/.docker/config.json: permission denied
# 解决方式一: 删除`~/.docker/`目录(它会自动重新创建,但所有自定义设置都会丢失)
# 方式二:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R  # 将这个文件夹的 拥有者 和 所属组 设为当前用户;-R:递归修改,即包括子目录和文件
sudo chmod g+rwx "$HOME/.docker" -R # 为 .docker 目录及其内容增加组权限,使所属组的成员可以读取(read)、写入(write)、执行(execute)文件。
# 在 Debian 和 Ubuntu 上,Docker 服务(守护进程)(不是指的容器) 默认在启动时启动
sudo systemctl status docker.service # 这是 Docker 的主服务,负责管理 Docker 守护进程(dockerd),提供核心功能,包括容器管理、镜像拉取和存储等
sudo systemctl status containerd.service # 这是 containerd 容器运行时服务,是一个独立的守护进程,用于管理容器的生命周期

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

# 禁止开机启动;但是当使用docker命令时,这两个服务会自动启动
sudo systemctl disable docker.service
sudo systemctl disable containerd.service


# 其他安装
sudo apt install shellcheck shfmt tmux universal-ctags
Copied!

5、文件上传下载服务

a、dufs

 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
# https://github.com/sigoden/dufs
# 安装  或者用docker直接使用就不用安装了
cargo install dufs

# 使用1、用docker直接启动容器挂载当前目录
docker run -v `pwd`:/data -p 5000:5000 --rm sigoden/dufs /data -A   # -A 是dufs的选项
# 默认情况下,容器即使停止后,仍然会保留在本地(可以用 docker ps -a 查看)。这些“停止的容器”会占用存储空间,并且需要手动清理
# --rm 容器停止时自动删除容器及其临时文件(例如挂载的匿名卷);避免积累过多无用的停止容器,减少磁盘空间浪费。

# 使用2、用本地dufs命令
mkdir -p ~/share/dufs && cd ~/share/dufs
sudo ufw allow 5000
dufs                                # 以只读模式提供当前目录,只允许查看和下载;默认在前台执行
nohup dufs > output.log 2>&1 &      # 后台启动
jobs -l                             # 查看后台启动程序; kill PID
dufs -A                             # 允许所有操作,如上传/删除/搜索/创建/编辑
dufs --allow-upload                 # 只允许查看和下载和上传操作
# --allow-archive 允许文件夹打包下载; --allow-search 允许搜索
dufs ~/share/dufs                   # 指定某个目录
dufs linux-distro.iso               # 指定单个文件
dufs -a admin:123@/:rw              # 指定用户名admin/密码123
dufs -b 127.0.0.1 -p 80             # 监听特定ip和端口
dufs --hidden .git,.DS_Store,tmp    # 隐藏目录列表中的路径
dufs --hidden '.*'                          # hidden dotfiles
dufs --hidden '*/'                          # hidden all folders
dufs --hidden '*.log,*.lock'                # hidden by exts
dufs --hidden '*.log' --hidden '*.lock'
dufs --render-index                 # 使用index.html 提供静态网站
dufs --render-spa                   # 提供像 React/Vue 这样的单页应用程序
# 可以记录日志,见github
# 可以将这些选项放在配置文件,见github

# 命令行客户端访问
curl -T path-to-file http://127.0.0.1:5000/new-path/path-to-file      # 上传文件
curl http://127.0.0.1:5000/path-to-file                               # download the file
curl http://127.0.0.1:5000/path-to-file?hash                          # retrieve the sha256 hash of the file
curl -C- -o file http://127.0.0.1:5000/file                           # 可断点下载
curl -o path-to-folder.zip http://127.0.0.1:5000/path-to-folder?zip   # 将文件夹下载为 zip 文件
curl -X DELETE http://127.0.0.1:5000/path-to-file-or-folder           # 删除文件/文件夹
curl -X MKCOL http://127.0.0.1:5000/path-to-folder                    # 创建目录
curl -X MOVE http://127.0.0.1:5000/path -H "Destination: http://127.0.0.1:5000/new-path" # 将文件/文件夹移动到新路径
# 列出/搜索目录内容
curl http://127.0.0.1:5000?q=Dockerfile           # search for files, similar to `find -name Dockerfile`
curl http://127.0.0.1:5000?simple                 # output names only, similar to `ls -1`
curl http://127.0.0.1:5000?json                   # output paths in json format
# 需要账户密码
curl http://127.0.0.1:5000/file --user user:pass                 # basic auth
curl http://127.0.0.1:5000/file --user user:pass --digest        # digest auth
curl http://127.0.0.1:5000/__dufs__/health # 健康检查
# 可断点上传
upload_offset=$(curl -I -s http://127.0.0.1:5000/file | tr -d '\r' | sed -n 's/content-length: //p')
dd skip=$upload_offset if=file status=none ibs=1 | \
  curl -X PATCH -H "X-Update-Range: append" --data-binary @- http://127.0.0.1:5000/file
Copied!

b、filebrowser

 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
############################ docker模式
mkdir -p ~/share/filebrowser
mkdir -p ~/share/filebrowser/files  
touch ~/share/filebrowser/filebrowser.db  
touch ~/share/filebrowser/filebrowser.json
cat > ~/share/filebrowser/filebrowser.json << EOF
{
  "port": 80,
  "baseURL": "",
  "address": "",
  "log": "stdout",
  "database": "/database/filebrowser.db",
  "root": "/srv"
}
EOF
sudo ufw allow 12786
docker run -d \
    -v ~/share/filebrowser/files:/srv \
    -v ~/share/filebrowser/filebrowser.db:/database/filebrowser.db \
    -v ~/share/filebrowser/filebrowser.json:/.filebrowser.json \
    -u $(id -u):$(id -g) \
    -p 12786:80 \
    filebrowser/filebrowser

# 默认情况下,镜像里已经有一个包含一些默认值的配置文件,因此您只需挂载根目录和数据库即可; 默认配置文件:
# https://github.com/filebrowser/filebrowser/blob/master/docker/root/defaults/settings.json


######################## 命令行模式
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
nohup filebrowser -r ~/share/filebrowser -a 0.0.0.0 > output.log 2>&1 &

# Username: `admin` Password: `admin`
Copied!

c、开启 sftp 服务

 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
62
63
# 确保系统已安装 OpenSSH 服务器 默认应该都存在并启动了sftp服务的
sudo apt update
sudo apt install openssh-server
# 检查 SSH 服务状态
sudo systemctl status ssh

# 查看 /etc/ssh/sshd_config 这个文件内是否存在:
# override default of no subsystems
Subsystem	sftp	/usr/lib/openssh/sftp-server
# 若存在则自动为所有创建的用户打开sftp服务,root能访问和修改所有文件; 普通用户能查看所有文件,但是只能修改自己有权限的文件
# 所以为了安全性,可以添加一个只能sftp连接不能ssh登录shell的用户,并限制这个用户 使用 SFTP 能使用的目录;主要目的是为了不暴露普通用户密码给别人

# ChrootDirectory 指定的目录及其父目录必须满足以下条件:1、由 root 拥有;2、不可被其他用户写入(即权限中不能有 write 权限分配给非 root 用户);这意味着普通用户的主目录(比如 /home/sftpuser),无法直接作为 ChrootDirectory,因为主目录通常是由该用户自己拥有的,而不是 root
# 解决办法:1、创建一个由 root 拥有的顶层目录(例如 /var/sftp),保证它不可写;2、在顶层目录下创建一个子目录(例如 /var/sftp/sftpuser),将该子目录的所有权赋予用户(例如 sftpuser),以允许用户上传文件
sudo useradd -s /sbin/nologin sftpuser     # 创建一个新用户,该用户仅被授予对服务器的文件传输访问权限; 不能登录shell,没有home目录
                                           # -m 会创建home目录; -d <path> 自定义home目录
sudo passwd sftpuser                       # 添加密码    123456                 
sudo mkdir -p /var/sftp/sftpuser
sudo chown root:root /var/sftp
sudo chmod 755 /var/sftp          # root用户为7所有权限; 同组用户和不同组的用户为5只允许读和执行; 4:读 2:写 1:执行
sudo chown sftpuser:sftpuser /var/sftp/sftpuser    # 将目录的所有权更改为您刚刚创建的用户
sudo chmod 775 /var/sftp/sftpuser          # 同组用户可以读和写(目录必须有执行权限才能cd进入);其他用户只读
sudo usermod -aG sftpuser $(whoami)  # 把当前用户加入 sftpuser 用户组,让当前用户可以操作`分享目录`,就让当前用户可以将自己的文件复制到这个`分享目录中`了
getent group sftpuser   # 查看用户组中有哪些用户
# 权限组生效要重新登录

## 修改 SSH 服务器配置以禁止sftpuser用户的终端访问,但允许文件传输访问
sudo vim /etc/ssh/sshd_config # 滚动到文件的最底部并添加以下配置片段; 
# 或者检查 /etc/ssh/sshd_config 中是否存在 Include /etc/ssh/sshd_config.d/*.conf 字样; 可如下方加一个新文件被引入
################################
sudo touch /etc/ssh/sshd_config.d/sftp.conf
su
cat > /etc/ssh/sshd_config.d/sftp.conf << EOF
Match User sftpuser
    ForceCommand internal-sftp
    PasswordAuthentication yes
    ChrootDirectory /var/sftp
    PermitTunnel no
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no
EOF

################################
su helq
sudo sshd -t # 测试
sudo systemctl restart sshd     # 重启或重新加载 SSH 服务
# 到 其他机器上 : 
# 验证ssh是否关闭
ssh sftpuser@your_server_ip     # 会收到 This service allows sftp connections only.表示连接失败,无法再使用 SSH 访问 shell
# 验证sftp是否开启
sftp sftpuser@your_server_ip    # 此命令将生成带有交互式提示的成功登录消息;可以在提示符中使用`ls`列出目录内容
############## 或者可以通过 sftp客户端界面(Cyberduck或FileZilla等) 连接访问

# Match User sftpuser            告诉 SSH 服务器仅将以下命令应用于指定的用户
# ForceCommand internal-sftp     强制 SSH 服务器在登录时运行 SFTP 服务器,确保其只能上传/下载文件,禁止 shell 登录访问。
# PasswordAuthentication yes     允许该用户进行密码验证;不然可能需要用户使用基于密钥的验证
# ChrootDirectory /var/sftp/     确保不允许用户访问/var/sftp目录之外的任何内容,/var/sftp 必须由 root 拥有,且不可被其他用户写入,在 /var/sftp 内,可以创建用户有写权限的子目录,如 /var/sftp/sftpuser
# PermitTunnel                   禁止 SSH 隧道功能,提高安全性,防止用户滥用隧道功能绕过网络限制
# AllowAgentForwarding           禁止 SSH 代理转发功能,端口转发、隧道和 X11 转发,进一步限制用户的功能,防止代理滥用
# AllowTcpForwarding             禁止 TCP 转发功能,防止用户通过 SSH 隧道代理访问内部网络或外部服务器
# X11Forwarding                  禁止 X11 图形界面转发,减少不必要的功能支持,提高安全性
# 这组命令从Match User开始,也可以为不同的用户复制和重复。确保相应地修改Match User行中的用户名
Copied!

d 、开启 ftp 服务

  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
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
sudo apt update && sudo apt install vsftpd         # 默认应该都是没有安装的
# 开放端口;为 FTP 打开端口`20`和`21`;在启用 TLS 时打开端口`990`; pasv_max_port pasv_min_port 限制可用于被动 FTP 的端口范围40000到50000
sudo ufw status
sudo ufw allow from any to any port 20,21,990,40000:50000 proto tcp
sudo ufw status

# 创建只用于 ftp 的用户;不允许登录shell
# chroot_local_user=YES时, ftp要求用户要有home目录,并且home目录不可写
sudo useradd -s /sbin/nologin -d /var/ftp ftpuser      # -m 会创建home目录; -d <path> 自定义home目录
sudo sh -c 'echo "/sbin/nologin" >> /etc/shells'       # ftp会检查登录的用户的shell是否正常; 这里让 /sbin/nologin 变为有效的登录 shell
sudo mkdir -p /var/ftp/ftpuser
sudo chmod 555 /var/ftp                          # 让home目录不可写; 4:读 2:写 1:执行
sudo chown nobody:nogroup /var/ftp               # 限制权限,确保进程或服务无法访问不必要的系统资源
sudo passwd ftpuser                              # 添加密码    123456          
sudo chown ftpuser:ftpuser /var/ftp/ftpuser    # 将目录的所有权更改为您刚刚创建的用户
sudo chmod 775 /var/ftp/ftpuser          # 同组用户可以读和写(目录必须有执行权限才能cd进入);其他用户只读
sudo usermod -aG ftpuser $(whoami)  # 把当前用户加入 ftpuser 用户组,让当前用户可以操作`分享目录`,就让当前用户可以将自己的文件复制到这个`分享目录中`了
getent group ftpuser   # 查看用户组中有哪些用户
sudo useradd -r -M -s /sbin/nologin ftpsecure   # 创建一个供nopriv_user使用的低权限用户
# 权限组生效要重新登录

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak     # 备份原始文件
su
####################################################################
cat > /etc/vsftpd.conf << EOF
# NO: 表示 vsftpd 不会以独立的守护进程方式运行;用于资源受限的系统; 因为 inetd 或 xinetd 在没有连接时不会启动 FTP 服务,从而减少资源占用
# 当 listen=YES 时,vsftpd 只会在 IPv4 地址 上启动并监听 FTP 连接, listen_ipv6就必须为 NO
listen=YES

# 启用对 IPv6 的支持,同时接受来自 IPv4 和 IPv6 的连接
listen_ipv6=NO

# 允许系统中的本地用户使用 FTP 登录
local_enable=YES

# 启用此选项后,所有本地用户在登录时将被限制在他们的HOME目录内,他们无法访问其他系统目录
chroot_local_user=YES
# 用于指定哪些本地用户可以不受 chroot_local_user 功能限制;可以在 chroot_list_file 中列出特定用户
# chroot_list_enable=YES
# chroot_list_file=/etc/vsftpd.chroot_list

# 允许用户使用写操作; 如 上传文件 删除文件
write_enable=YES

# 实际权限 = 默认权限(文件的默认权限是666; 目录的默认权限是777) - umask
local_umask=022

# 每当用户切换到某个目录时,vsftpd 会检查该目录下是否存在一个名为 .message 的文件;如果 .message 文件存在,其内容会显示给用户,作为该目录的欢迎消息或说明
dirmessage_enable=YES

# 目录列表(例如 ls 命令)中的时间戳将显示为服务器本地时区时间
use_localtime=YES

# 启用上传和下载操作的日志记录功能;默认在/var/log/vsftpd.log; 可由选项xferlog_file自定义
xferlog_enable=YES
# 用于指定 vsftpd 的日志文件位置
# xferlog_file=/var/log/vsftpd.log
# 如果启用此选项,日志将采用标准 xferlog 格式,通常与传统 FTP 服务的日志格式兼容;日志文件的默认存储路径会更改为 /var/log/xferlog
# xferlog_std_format=YES

# 指定 FTP 数据连接的来源端口为 20;(21 端口:用于控制连接;接收用户命令并返回响应)
connect_from_port_20=YES

# 默认开启被动模式;需要服务端开放40000-50000的端口,所以对客户端的防火墙很友好
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000

# 设置空闲会话的超时时间,单位为秒;如果客户端在此期间没有任何活动(如上传、下载、浏览目录等),则服务器会自动关闭该会话
idle_session_timeout=3600

# 设置数据连接的超时时间,单位为秒;指定了 vsftpd 等待数据连接(例如文件上传、下载等)时的最大空闲时间;如果在这个时间内没有数据传输,连接会被断开
data_connection_timeout=600

# 当 vsftpd 需要执行与 FTP 客户端相关的非特权操作时,它会以 nopriv_user 的身份运行子进程或线程,可以有效地减少可能的安全漏洞
nopriv_user=ftpsecure

# 自定义的登录横幅信息
ftpd_banner=Welcome to blah FTP service.


# 禁用匿名登录,只有本地用户可以登录
anonymous_enable=NO
# 禁止匿名用户上传文件
anon_upload_enable=NO
# 禁止匿名用户创建目录
anon_mkdir_write_enable=NO
# 控制匿名用户上传的文件的所有权设置;用于加强安全性和便于管理;默认情况下,匿名用户上传的文件的所有者是 ftp 或 nobody;通过启用此选项,可以将文件的所有者更改为指定的用户
# chown_uploads=YES
# chown_username=whoever

# 指定一个空目录,作为 vsftpd 的 chroot() 监狱;chroot() 是一个将进程及其子进程的根目录改为指定目录的系统调用。
# 在 vsftpd 中,使用 chroot() 可以将某些用户限制在某个目录(或目录树)中,使得这些用户无法访问系统的其他部分
# 当 FTP 用户登录时,通常会被限制在他们的家目录内。如果启用了 chroot_local_user 或其他类似设置,FTP 用户将无法访问他们家目录以外的文件和目录
# 该目录并不是为用户上传和下载文件的目录,而是用于保护和增强安全性。在一些特定情况下,vsftpd 会切换到该目录,并限制其对文件系统的访问
secure_chroot_dir=/var/run/vsftpd/empty

# 告诉 vsftpd 在进行用户登录认证时,使用 PAM(可插拔认证模块)来进行验证;简单来说,它指定了 FTP 服务器在验证用户身份时,应该使用什么样的认证规则
# PAM 就是一个管理系统登录、密码验证等认证工作的工具;vsftpd 需要验证用户是否能登录,pam_service_name=vsftpd 就是告诉它:在验证时,去找一个专门为 vsftpd 配置的认证规则文件,通常这个文件叫 vsftpd,会放在 /etc/pam.d/ 文件夹里
pam_service_name=vsftpd

# 是否开启 FTPS
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

# 使用 UTF-8 编码的文件系统
utf8_filesystem=YES

# FTP 服务器将异步处理 ABOR 请求,提高处理效率,但可能存在安全风险
# async_abor_enable=YES

# 专门用于文本文件,启用该选项后,FTP 服务器会在上传/下载文件时进行 ASCII 处理(即转换换行符),可能会增加 CPU 负担和安全隐患
# ascii_upload_enable=YES
# ascii_download_enable=YES

# 启用此选项后,vsftpd 将检查匿名 FTP 用户的电子邮件地址,如果该地址在禁止列表中,用户将无法登录
# deny_email_enable=YES
# 这是存储被禁止的电子邮件地址列表的文件。vsftpd 会检查该文件中的电子邮件地址,并阻止这些地址的匿名用户登录。每行一个电子邮件地址
# banned_email_file=/etc/vsftpd.banned_emails

# 用户使用 ls 命令时,FTP 服务器会列出当前目录及其所有子目录的内容,出于性能考虑,最好保持默认的禁用状态
# ls_recurse_enable=YES
EOF

#####################################################################

sudo systemctl restart vsftpd
Copied!

e、minio

1
2
3
4
5
6
7
8
mkdir -p ~/software/minio/share
sudo ufw allow from any to any port 19000,19001 proto tcp

docker run -d -p 19000:9000 -p 19001:9001 \
  -v ~/software/minio/share:/data \
  quay.io/minio/minio server /data --console-address ":9001"

http://ip:19001    minioadmin:minioadmin
Copied!

四、可选

a、pipx

1
2
3
4
5
6
7
8
9
# 可选 pipx 专门下载python命令行工具 到隔离环境的,用哪个用户下载的就在哪个用户目录下的 ~/.local/bin 中; 除非加了--global 会安装在全局的地方,但是版本低不支持
sudo apt update
sudo apt install pipx
pipx ensurepath # 就是设置环境变量中的 $PATH:~/.local/bin
sudo pipx ensurepath --global # apt的版本太低不支持
pipx install trash-cli # 安装最新版本,但是默认只能一个用户使用
pipx list
pipx uninstall-all
pipx completions # 查看补全说明
Copied!

b、clash

 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
##################### clash代理 ########################################################
mkdir -p cd /usr/local/clash-arm64
cd /usr/local/clash-arm64
ls
clash-linux-arm64-v1.18.0.gz  config.yaml  Country.mmdb
>>>>>>>
gunzip clash-linux-arm64-v1.18.0.gz 
mv clash-linux-arm64-v1.18.0 clash
chmod +x clash
sudo mkdir /etc/clash
sudo cp clash /usr/local/bin
sudo cp config.yaml /etc/clash/
sudo cp Country.mmdb /etc/clash/
ls /etc/clash/

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
sudo vim /etc/systemd/system/clash.service

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/clash -d /etc/clash

[Install]
WantedBy=multi-user.target

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
sudo systemctl stop clash
sudo systemctl enable clash
sudo systemctl start clash
sudo systemctl disable clash
sudo systemctl status clash
export http_proxy=http://127.0.0.1:25307 && export https_proxy=http://127.0.0.1:25307 && export all_proxy=socks5://127.0.0.1:25307
curl https://www.google.com
curl https://github.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mkdir -p /usr/local/my-functions/ && cd /usr/local/my-functions/

echo "source /usr/local/my-functions/debian_proxy" >> /home/helq/.bashrc
echo "source /usr/local/my-functions/debian_proxy" >> /root/.bashrc

echo "alias ll='ls -l'" >> /home/helq/.bashrc
echo "alias ll='ls -l'" >> /root/.bashrc
cd ..
#重新连接
sudo systemctl status clash
getproxy
setproxy term
getproxy
curl https://www.google.com

#####################################
Copied!

c、卸载 apache2

1
2
3
4
5
6
7
8
apt list apache
which -a apache2
ls /usr/sbin/apache2


systemctl disable apache2.service #禁止自启动
apt-get --purge remove apache2 -y
sudo apt autoremove -y
Copied!

五、后续更新

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 安装 fastfetchmkdir -p "$HOME/software/fastfetch"  
wget -P "$HOME/software/fastfetch" https://github.com/fastfetch-cli/fastfetch/releases/download/2.31.0/fastfetch-linux-aarch64.deb  
sudo apt update  
sudo dpkg -i "$HOME/software/fastfetch/fastfetch-linux-aarch64.deb"  
fastfetch --version  
which -a fastfetch  
git -C "$HOME/Data/Config" pull  
  
# ssh 连接时,不要打印 系统版本和版权信息  
touch "$HOME/.hushlogin"  
  
# ffmpeg 安装  
sudo apt install ffmpeg  
# 下载 m3u8 视频  
ffmpeg -i "https://aa.ww.bb/mixed.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4
Copied!
true
最后更新于 2024年12月5日 04:04
发表了90篇文章 · 总计613.28k字
本站总访问量本站访客数人次

目录