linux

1 配置

  • 必装 ssh proxychains4 git meld p4merge vim gtags ctags,github 导入公钥
  • 关闭该死的系统更新,非要更新前一定创建快照

1.1 SSH

apt-get install openssh-server openssh-client

  • 如配置 VPS 修改 SSH 端口,则要在系统 iptables 和 vps 页面两处同时放行新端口,并用 nc -l 测试没问题后,再重启 sshd 服务。此时先别断开旧连接,防止出现新端口连不上的情况

1.1.1 解决 20.04 broken package 问题

参考 Problems with installing of the openssh-server

1
2
3
# 通过 aptitude 尝试解决
sudo apt install aptitude
sudo aptitude install PACKAGENAME

根据 aptitude 安装前的提示,发现是预安装的 openssh-client 版本高,apt purge openssl-client 卸载后安装 openssh-server 没问题。
也可以降级已安装的包,sudo apt install <package-name>=<package-version-number>

1.1.2 secureCRT 配置问题

  1. 关闭不用的菜单栏、状态栏等,去掉 use dockable session manager 选项,记住连接管理的快捷键即可
  2. 编码与字体
    在Options -> Session Options -> Appearance 选项中将 Character encoding 设成”UTF-8”即可,字体 Consolas-with-Yahei,三号。没办法用没有 CJK 字符的字体
  3. 启用颜色
    官方的介绍 https://www.youtube.com/watch?v=SZLbBsp3914
    在 default session 中选 solarized dark,emulation 中启用 xterm-256color
    在全局配置中外观 - 高级,选中 solarized dark 新建一个颜色模式
    将 normal 和 bold 中前景色调亮,同时下拉列表选择 solarized dark,在 default session 中应用
    前景色 RGB 颜色 166,177,179
    详细参考视频 www.youtube.com/watch?v=SZLbBsp3914
  4. 调整系统提示声音,将 默认响声 设置为 windows信息栏.wav
  5. 安装 Xming,对于 ubuntu 的 session 中勾选 X11 forwarding 两个选项,默认配置即可
    • Options–>Session Options–>Terminal 启用选择发送滚轮事件到远程。取消 Scroll to bottom on output
      • Options–>Session Options–>Terminal–>Emulation–>Mapped Keys,选中 Backspace sends delete
        默认会话中终端
      • Options–>Session Options–>Terminal–>Emulation–>Mode,取消 Enable keypad mode switching 小键盘映射
      • Options–>Session Options–>Terminal–>Emulation–>Advanced,忽略窗口标题更改请求
      • Options–>Edit Default Session 设置常用的按键映射,运行脚本 a-r、取消脚本 a-s、清屏 a-l (clear)、滚动到底部 a-b
      • (可选)添加键盘映射,HOME/END 为 \033[H\033[F,原理见下 Terminal input sequences

1.1.3 隧道/端口转发

  • 代理就是通过隧道帮助用户要访问某个受限资源
  • 隧道由本地和远端组成,本地作为 SSH 客户端连接远端 SSH 服务器端
graph LR
    subgraph 代理
    用户 -- 隧道 --> 受限资源
    end
    subgraph 隧道
    L("本地 local,客户端") --> R("远端 remote,服务器")
    end
  • 按情况分为用户在隧道的本地和远端两种,常见三种 转发方式
  • 所谓用户就是要连接监听端口的设备
    • 所以对用户在本地 local 的,使用 -D 或 -L 打开本地端口,转发给 remote 侧的某资源。如资源为固定的 ip port 用 -L,动态的多个资源用 -D
      • 这种场景如科学上网,-D 打开本地的 sock5 监听端口,加密连到 vps,动态访问各个网站
    • 对用户在远端 remote 的,用 -R 打开远端端口。同样可固定可动态,填 ip port 是固定,不填为动态
      • 这种场景如内网穿透,内网必须作为客户端主动连公网服务器端
        • 为了防止连接中断可 写个脚本
        • 但在公网服务器开端口暴露内网资源可能不安全(有的内网资源没有密码等),真要这样用还需配置 GatewayPorts yes,否则只会在环回口监听
        • 所以为了安全,即 1. 要有授权的客户端才能连服务端口 2. 保证用户到服务端口之间数据的安全性(socks 协议不加密)。在先用 -R 开启环回口(动态方式)后,再在用户侧用 -L 练到公网服务器,见 链式端口转发 (文中为固定转发给 3000 端口,可改为动态)
    • 图中的 4 个角色(资源、用户、local、remote)可重合,即特殊情况
      • local 和 remote 为同一台设备,如将这台设备用作 socks 代理服务器 ssh -D port localhost
      • 用户与 local / remote 为同一设备,资源与 local / remote 为同一设备的情况
    • 如要只将 ssh 用作隧道,限制用户登陆,可以 修改用户的 shell
    • 对 windows 可用配置好连接信息的绿色版 putty 来当作 vpn 客户端的功能
graph LR
    subgraph 用户在本地一侧 -L/-D
    s1(用户) --> s2(local) --> s3(remote) --> s4(受限资源)
    end
    subgraph 用户在远端一侧 -R
    s5(受限资源) --> s6(local) --> s7(remote) --> s8(用户)
    end
    subgraph 特殊情况
    s9("local 与 remote 重合,ssh -D port localhost")
    s10("用户/受限资源 与 local/remote 重合")
    end
    subgraph 内网穿透
    s11(受限资源) --> s12(local) -- -R动态方式 --> s13(remote) -- -L连接到-R的动态端口 --> s14(用户)
    end

1.1.4 DNS 介绍

1.2 系统

  1. 设置 PS1 export PS1="\[\e[35;22m\][\! \A \w] \[\e[0m\]",如要改变标题则继续加一句,PS1="\[\e]0;20.04: \W\a\]$PS1" ,把 20.04 改成想要的名字

  2. ls 颜色 https://github.com/seebi/dircolors-solarized
    .bashrc 中添加 eval dircolors ~/dircolors-solarized/dircolors.256dark

  3. 给 man 命令启用颜色,~/.bashrc 添加如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    man() {
    env \
    LESS_TERMCAP_mb=$(printf "\e[1;31m") \
    LESS_TERMCAP_md=$(printf "\e[1;31m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;32m") \
    man "$@"
    }
  4. 修改时区

    1
    2
    sudo unlink /etc/localtime
    sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

1.2.1 Kali

1.3 网络

思路是用无线网卡使 PC、虚拟机、无线路由器处于同一网络中,可以上网。用有线网卡使 PC、虚拟机、开发板处于另一网络中。

要点,配置网关的网卡将作为上网网卡,旧网卡(无线网卡)用来上网,所以只有旧网卡有网关

18.04_20.04 用 netplan,配置文件示例见 asset,命令 sudo netplan --debug apply

interfaces 和 NetworkManger 即配置文件与图形界面两种方法不能同时使用,对于 /etc/network/interfaces 配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auto eth0
iface eth0 inet static
address 192.168.2.36
netmask 255.255.255.0
gateway 192.168.2.1

auto eth1
iface eth1 inet static
address 192.168.1.36
netmask 255.255.255.0

# dhcp方式
# auto eth0
# iface eth0 inet dhcp

/etc/resolvconf/resolv.conf.d/base 配置 dns,没有则新建。sudo resolvconf -u 立即生效

1
2
nameserver 114.114.114.114
nameserver 8.8.8.8

1.4 内部局域网

为了搭建封闭的局域网,可以在 windows 中 添加 KM-TEST 虚拟网卡,所有虚拟机桥接到该网卡,实现虚拟机间和主机与虚拟机的通信

1.4.1 代理

proxychains4,适用于所有包管理系统和 git

  1. SSR 选择允许局域网
  2. apt 安装 proxychains4
  3. 配置
    • 配置文件在 /etc/proxychains.confproxychains4.conf,改成 socks5 192.168.7.36 17890
    • 设置 DNS 文件在 /usr/lib/proxychains3/proxyresolv,修改 DNS_SERVER=8.8.8.8
  4. 注意配置文件代理地址设置成 host 的 IP 192.168.2.29,不是 127.0.0.1
  5. tsocks 不那么好用,先不考虑

1.4.2 软件源

中科大

1.5 sshfs-win

  • 先装 winfsp (Cryptomator 也装了 winfsp),然后装 sshfs 64位
  • 计算机上右键 映射网络驱动器,不要选 添加网络位置,勾选 登陆重连
  • mount home 的情况,\\sshfs\compilers@192.168.36.3
  • mount 其它目录的情况,\\sshfs.r\compilers@192.168.36.3\usr\class\cs143\cool
  • 使用 key 和代理的情况
    • 配置文件 C:\Users\用户.ssh\config
    • IdentityFile 指定私钥路径
    • ProxyCommand 指定代理,这里用 nmap 附带的 ncat
      • ProxyCommand D:/soft/Nmap/ncat.exe --proxy 127.0.0.1:17890 --proxy-type socks5 %h %p
      • 参考
    • 打开 cmd (非管理员权限),sshfs-win.exe svc \sshfs.k\ubuntu@主机!端口 v: -d -o LogLevel=DEBUG3
      • 映射为 v:
      • 调试信息 -d -o LogLevel=DEBUG3
    • 但因为 ProxyCommand 依赖 sh,参考 这里 的方法,下载 busybox 并改名为 sh.exe,可避免装 Cygwin。同时 ProxyCommand 也要改成能识别的斜杠 /
    • 如直接映射驱动器 \sshfs.k\ubuntu@IP!端口(而非 sshfs-win.exe 命令),则不会使用 config 文件,此时 key 只能放在 C:\Users\用户.ssh 下

1.6 samba、tftp、nfs

  • linux samba 3.6.0 开始支持 SMB2,之前的版本需要在 Windows 控制面板启用 SMB1.0 客户端,用命令 sudo smbstatus 查看软件和协议版本
    • 即可以在控制面板启用,也可以 powershell 管理员运行 Enable-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol-Client"
    • samba 可能不稳定,重启 Windows 后会无法连接。要重新敲上面的 enable 命令后再重启宿主机和虚拟机才能连上,可把上面命令保存成脚本并 管理员运行方便后续使用
    • 对于 virtualbox 虚拟机导出给 vmvare 使用时,遇到 virtualbox 服务找不到无法启动图形界面时,进命令行卸载 virtualbox 服务,cd /etc/init.dsudo ./vboxadd cleanupsudo ./vboxadd-x11 cleanup
    • samba 不稳定也可考虑用 ssh 映射替代,见 [sshfs-win](## 1.5 sshfs-win)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      # 安装
      # 20.04 同样出现 broken package 问题,先卸载高版本的依赖 sudo apt purge libwbclient0 samba-libs,再安装
      apt-get install samba samba-common
      # 备份配置文件
      cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
      # 修改smb.conf。添加一个共享定义,share 表示windows连接到的文件夹名为 \\ip\share
      # create mask = 0644 避免添加执行权限
      [share]
      comment = samba home share
      path = /home/zack
      browseable = yes
      read only = no
      create mask = 0644
      directory mask = 0777
      # 添加用户
      sudo smbpasswd -a zack
      # 重启服务
      sudo service smbd restart
1
2
3
4
5
6
7
8
9
10
11
#安装
apt-get install tftp-hpa tftpd-hpa xinetd
#设置目录
vi /etc/default/tftpd-hpa
#启动服务
service tftpd-hpa restart

#测试
tftp 127.0.0.1
tftp> get hello
tftp> quit
1
2
3
4
5
6
7
8
9
10
11
12
# 检查nfs服务是否安装。没有则 sudo apt-get install nfs-kernel-server
service nfs-kernel-server
tar xvf rootfs.tar.xz
sudo chmod 777 rootfs
# 重启nfs服务(使得前面修改生效)
sudo /etc/init.d/nfs-kernel-server restart

# 测试nfs服务是否安装成功
sudo mount -t nfs localhost:/nfs/rootfs/ /mnt/
# 如果其中的内容和/nfs/rootfs中一致。 表示有挂载成功
ls /mnt/
sudo umount /mnt

1.7 ftp

更多安全相关的配置见 vsftp 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
# Uncomment this to allow local users to log in.
local_enable=YES
# 可上传
write_enable=YES
# 用户列表
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# 在这里添加可登录的用户,系统的用户名和密码
/etc/vsftpd.userlist

1.8 编译工具

1
2
3
4
5
6
7
# 20.04 同样有 broken package 问题,要降级安装 libc
sudo apt install build-essential python3
# 安装最新 cmake,参考 https://askubuntu.com/questions/355565/how-do-i-install-the-latest-version-of-cmake-from-the-command-line
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main'
sudo apt update
sudo apt install cmake

1.9 chrome

1
2
3
4
5
# 装 chrome
https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum localinstall google-chrome-stable_current_x86_64.rpm
# chromedriver,下载 linux64 版本
https://chromedriver.chromium.org/downloadsba

1.10 vps

  • 改端口号

    • sudo passwd 设置密码,为了以后 VNC 抢救时可以登陆设备
    • 备份防火墙 sudo iptables-save >fire.backup
    • 添加 ssh 端口号,iptables -I INPUT 1 -p tcp --dport xxxx -j ACCEPT
    • nc 测试新端口能被连接
    • 修改 sudo vi /etc/ssh/sshd_config 的 Port
    • sudo systemctl restart sshd,先不关闭旧连接,测试新端口是否生效
  • 改防火墙

    • 事先备份 sudo iptables-save >fire.backup
    • 删除无用项,或还原改后配置 sudo iptables-restore fire.now
    • 永久保存,避免重启后失效,sudo netfilter-persistent save
    • 重启测试 sudo reboot
  • 修改 PS1 和时区

  • 备份还原

    • 对 X86,可创建 5 个备份,需要还原时,先删机,等完全终止后,利用之前的引导卷新建机器
    • 对 ARM,因通常很难创建,使用 dd 备份还原
      1. 停止实例,分离引导卷
      2. 附加到另一实例的块存储卷,并用命令(iSCSI 命令和信息)连接
      3. sudo fdisk -l 查看为 /sdb 硬盘,备份或还原
        • 备份 sudo nohup bash -c "dd if=/dev/sdb conv=sync,noerror bs=64M status=progress | gzip -c >backup.gz" &
        • 还原 sudo nohup bash -c "gunzip -c backup.gz | dd of=/dev/sdb bs=64M status=progress" &
        • 查看进度 sudo tail -f nohup.out,ubuntu 20.04 原始备份时间 35min 大小 650M,还原时间相同,dd 的 bs 越大越好
      4. 附加引导卷,启动实例
      5. 用命令(iSCSI 命令和信息)断开连接,并分离
  • 为优化资源占用,多使用 top 命令

  • 卸载 snap,防止 CPU 占用高,sudo systemctl stop snapd, sudo apt purge snapd

  • 关闭甲骨文日志 systemctl stop unified-monitoring-agentsystemctl disable unified-monitoring-agent

  • 甲骨文开启 IPv6

  • 关闭 fwupd sudo systemctl stop fwupdsudo systemctl disable fwupd

  • 卸载 gnome,然后重启

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    sudo apt update
    sudo apt purge adwaita-icon-theme gedit-common gir1.2-gdm-1.0 \
    gir1.2-gnomebluetooth-1.0 gir1.2-gnomedesktop-3.0 gir1.2-goa-1.0 \
    gnome-accessibility-themes gnome-bluetooth gnome-calculator gnome-calendar \
    gnome-characters gnome-control-center gnome-control-center-data \
    gnome-control-center-faces gnome-desktop3-data \
    gnome-font-viewer \
    gnome-initial-setup gnome-keyring gnome-keyring-pkcs11 gnome-logs \
    gnome-mahjongg gnome-menus gnome-mines gnome-online-accounts \
    gnome-power-manager gnome-screenshot gnome-session-bin gnome-session-canberra \
    gnome-session-common gnome-settings-daemon gnome-settings-daemon-common \
    gnome-shell gnome-shell-common gnome-shell-extension-appindicator \
    gnome-shell-extension-desktop-icons gnome-shell-extension-ubuntu-dock \
    gnome-startup-applications gnome-sudoku gnome-system-monitor gnome-terminal \
    gnome-terminal-data gnome-themes-extra gnome-themes-extra-data gnome-todo \
    gnome-todo-common gnome-user-docs gnome-user-docs-ru gnome-video-effects \
    language-pack-gnome-en language-pack-gnome-en-base language-pack-gnome-ru \
    language-pack-gnome-ru-base language-selector-gnome libgail18 libgail18 \
    libgail-common libgail-common libgnome-autoar-0-0 libgnome-bluetooth13 \
    libgnome-desktop-3-19 libgnome-games-support-1-3 libgnome-games-support-common \
    libgnomekbd8 libgnomekbd-common libgnome-menu-3-0 libgnome-todo libgoa-1.0-0b \
    libgoa-1.0-common libpam-gnome-keyring libsoup-gnome2.4-1 libsoup-gnome2.4-1 \
    nautilus-extension-gnome-terminal pinentry-gnome3 yaru-theme-gnome-shell
    sudo apt purge gnome-getting-started-docs gnome-getting-started-docs-ru
  • acme.sh 申请证书

    • Google domain,参考
      • Google Ca
        • acme.sh --set-default-ca --server google
        • 页面获得 eab-kid eab-hmac-key
        • acme.sh --register-account
      • letsencrypt CA,acme.sh --set-default-ca --server letsencrypt
      • 页面获得 API-Token,export GOOGLEDOMAINS_ACCESS_TOKEN=”获得的 token”
      • acme.sh --issue --dns dns_googledomains -d synrst.de -d *.synrst.de -k ec-384
      • 安装 acme.sh --install-cert -d synrst.de -d *.synrst.de --ecc --key-file /etc/XXX/server.key --fullchain-file /etc/XXX/server.crt --reloadcmd "systemctl force-reload nginx"
    • 其它命令,官方文档
      • 删除证书 acme.sh --remove -d synrst.de -d *.synrst.de,之后按提示删除文件夹(正常还应该 revoke)
      • 强制 renew acme.sh --renew -d synrst.de -d *.synrst.de --force --ecc
      • 查看证书 openssl x509 -text -noout -in xxx.cer
      • 查看 acme.sh --listcrontab -l
  • 科学上网加速

    • BBR Plus 加速,区别对比
    • CDN 加速
      • v2ray 域名 -> cdn -> vps ip
        • 在域名上配置
          • NS 接入:nameserver 配置成 cloudfare
          • CNAME/IP 接入:v2ray 域名 -> cdn ip/域名,域名则添加 CNAME,IP 则添加 A 记录。这是为了配合 DNSPod 不同城市线路用不同的 CDN IP,例子,感觉是给机场接入用的,个人 NS 接入即可,例子
        • 在 CDN 配置 :v2ray 域名 -> vps ip(回源地址)

1.11 screen

  • .screenrc 文件,参考 How To Use Linux ScreenScreen User’s Manual
    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
    startup_message off

    # Disable visual bell
    # vbell off

    # Set scrollback buffer to 10000
    defscrollback 10000

    # https://superuser.com/questions/506080/screen-divider-border-width-and-color
    caption string "%{= dd} "
    rendition so "="
    # https://stackoverflow.com/questions/359109/using-the-scrollwheel-in-gnu-screen
    termcapinfo xterm* ti@:te@

    # 内存部分参考 https://stackoverflow.com/questions/18439129/system-loads-in-gnu-screens-hardstatus-line
    hardstatus alwayslastline
    # backtick 1 1 1 /bin/bash -c 'free | grep Mem | awk '\''{printf("%.1f%%", $3/$2 * 100.0)}'\'' '
    backtick 1 1 1 /bin/bash -c 'free | grep Mem | awk '\''{printf("%.1f%%", 100 - $7/$2 * 100.0)}'\'' '
    hardstatus string "%{= KG} %-Lw%{= bW}%n%f %t%{-}%+Lw %=%{= Kg}| %c %{-}%l %1`"
    # 给 Windows terminal 用的浅色主题 AtomOneLight https://windowsterminalthemes.dev/
    # hardstatus string "%{= wG} %-Lw%{= bW}%n%f %t%{-}%+Lw %=%{= wg}| %c %{-}%l %1`"

    # focus ctrl+a tab,other ctrl+a ctrl+a
    # 推荐在左侧标签按键,这样右侧标签分到屏幕右侧,按键焦点留在左侧
    bind v eval "split -v" focus other focus
    # 这个配置焦点在右侧
    # bind v eval "split -v" focus other

    bind x remove
  • screen 状态栏显示正在执行的命令或当前路径,参考
    • bash
      • .screenrc 文件
        1
        2
        # shelltitle | 前面的 ] 表示提示符结尾
        shelltitle ']|bash'
      • .bashrc 文件
        1
        2
        3
        if [[ $TERM == screen* ]]; then
        PROMPT_COMMAND='echo -ne "\033k\033\0134\033k[`basename ${PWD}`]\033\0134"'
        fi
    • zsh,参考1参考2
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      setopt extendedglob
      if [[ $TERM == screen* ]]; then
      precmd () {
      local dir=$(print -Pn "%c")
      print -Pn "\ek$dir\e\\"
      }
      preexec () {
      local dir=$(print -Pn "%c")
      # 截短是为了留空间显示 CMD
      dir=$dir[1,6]
      local CMD=${1[(wr)^(sudo|*=*|-*)]}
      print -Pn "\ek$dir] ${CMD}\e\\"
      }
      fi
  • 常用按键/命令
常用按键/命令 含义
screen 创建
启动后 SecureCRT 要调整一下窗口
screen -ls 查看
ctrl + a d detach
screen -x Attach to a session which is already attached
与 -r 相比推荐这种,可加到 .bashrc 实现登录就在 screen 中
screen -r attach
ctrl + a c create 窗口
ctrl + a k kill 窗口
ctrl + a 数字 切换到该窗口
ctrl + a ctrl + a 切换到刚刚的窗口
ctrl + a p/n 切换到前一个、后一个窗口
ctrl + a :number 数字 重命名窗口以调整窗口在下方的显示顺序
上面的自定义按键
ctrl + a v 分 region
ctrl + a x 关 region
ctrl + a tab 切 region

2 使用

软件问题见 linux软件编译、安装、运行

2.1 基础

2.1.1 修改 linux 用户名

1
2
3
4
5
6
# 退出所有登录(包括 SSH)
# Ctrl+Alt+F2 以 root 登录
# 修改用户名
usermod -c “Full name real” -l new_name old_name
# 修改 home
usermod -d /home/newHomeDir -m newUsername

2.1.2 bash

  • 快捷键

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Ctrl + r – search the history backwards
    Ctrl + g – escape from history searching mode
    CTRL + A = the beginning of the line
    CTRL + E = the end of the line
    ALT + B = move backward one word
    ALT + F = move forward one word
    /* 所有的 ALT 可换成 ESC */
    Ctrl + U = Delete left of the cursor
    Ctrl + K = Delete right of the cursor
    Ctrl + W = Delete word on the left
    ALT + D = Delete word on the right
    Ctrl + Y = Paste
  • Terminal input sequences

2.1.3 zsh

  • 粘贴 kali .zshrc
  • 命令提示 sudo apt install zsh-autosuggestions
  • 参考配置 screen

2.1.4 脚本

  • shell 脚本调试
    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
    -------- bash ---------
    export SHELLOPTS
    # 还可配合 FUNCNAME 实现调用栈打印
    export PS4='[${BASH_SOURCE[0]}-$LINENO] '
    # 可考虑去掉 eu
    set -eux
    # 确认
    set -o
    # 还原
    set +eux

    -------- zsh ---------
    # https://stackoverflow.com/questions/56137084/zsh-inherit-xtrace-option
    # 利用 $ZDOTDIR/.zshenv
    # https://stackoverflow.com/questions/9901210/bash-source0-equivalent-in-zsh

    -- 注意:下面的所有方法在应对 source(即 .) 引入脚本时,不会更新文件名,此时从感兴趣的位置向上找到最近 source 的几个脚本,一般就是那里 --
    # 定义 MyShellOpts 开启调试,可考虑去掉 eu
    export MyShellOpts=-eux
    -------- ash ---------

    #!/bin/busybox sh
    # 这个脚本保存为 sh 替换 /bin/sh
    # 替换方法,确保 /bin/sh 为指向 /bin/dash 的软链接
    # sudo chmod --reference=/bin/sh sh
    # sudo chown --reference=/bin/sh sh
    # sudo cp --remove-destination sh /bin/sh
    export PS4='[$0-$LINENO] '
    /bin/busybox sh $MyShellOpts "$@"

    -------- dash或其它类似 shell ---------

    #!/bin/dash
    # 与上面一样,这个脚本保存为 sh 替换 /bin/sh
    # $LINENO 存在也可加到 PS4 里,不存在则参考 Workaround for shells without LINENO
    # https://stackoverflow.com/questions/17804007/how-to-show-line-number-when-executing-bash-script
    # 还原,cd /bin && sudo ln -f -s dash sh
    export PS4='[$0] '
    # 可考虑去掉 eu
    /bin/dash $MyShellOpts "$@"
  • 不论在那个路径下运行都得到脚本的路径
    1
    2
    3
    # 不论在那个路径下运行都得到脚本的路径
    # 获取当前脚本路径
    SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

2.1.5 nc

  • 推荐安装 nc openbsd 版本,apt install netcat-openbsd

2.1.6 curl

1
2
3
4
5
6
# FTP 下载
curl ftp://user:pass@192.168.7.29/code/pdt-toolchains/src/tin -o /mnt/internal_storage/tin
# FTP 上传
curl -T /etc/profile ftp://user:pass@192.168.7.29/code/profile
# 与 docker 通信
sudo curl -v -H 'User-Agent:' -H 'Accept:' -s --unix-socket /var/run/docker.sock http://localhost/v1.41/containers/json?all=true | jq .[0]

2.1.7 查找文件

1
2
3
4
5
6
7
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
# 删除前去掉 delete 进行确认
find . -type f ! \( -name '*.cpp' -o -name '*.h' \) -delete
# 跳过隐藏文件
find . -not -path '*/\.*' -type f ! \( -name '*.cpp' -o -name '*.h' -o -name '*.txt' \)
# 先创建与源码相同的目录结构再拷贝文件,拷贝文件时忽略某些文件夹下的文件和源码
find . \( -type d -exec mkdir -p '../gatebox_work/{}' \; -o -type f ! \( -path './.git/*' -o -path '*/GmSSL/*' -o -path '*/.idea/*' -o -path '*/.vscode/*' -o -name '*.c' -o -name '*.h' -o -name '*.o' -o -name '*.log' -o -iname makefile \) -exec cp '{}' '../gatebox_work/{}' \; \)

2.1.8 磁盘占用统计

1
sudo apt install qdirstat

2.1.9 cron

2.2 网络

  • wireguard
    • 看介绍视频,详细的配置方法,注意区分 server 和 peer client
    • 对已经有配置文件的,sudo apt install wireguard resolvconf,将配置保存到 /etc/wireguard/wg0.conf,然后 sudo wg-quick up wg0
  • clash_for_windows linux 版,手动安装服务方法,网关模式
  • 网速占用统计 apt 安装 nethogs

3 备份与还原

考虑到经常环境经常变动,所以有必要学习linux的备份和还原技术。

3.1 系统备份

备份脚本 rsync-incremental-backup

注意 rsync 的 exclude 将 源路径 视为 根,因此 exclude 指定的路径都是相对 源路径 来说的,具体可以建立几个测试文件,用 dry-run 的方式验证。恢复的脚本要自己写了,如果进不了系统就用 ubuntu 的安装 U 盘恢复。

下一步可以配合 cron 实现自动定期备份,配合 ssh 实现远端备份

3.2 启动备份

多系统的启动管理。每个硬盘一个 MBR,每个系统分区都有个 boot sector,两个位置都会安装 bootloader

mbr_boot_sector

多系统启动方式如下,MBR 的 bootloader 可以转交给其它分区的 bootloader,即 chainload

loader_menu

下一步可以查看 grub2 的帮助文档,以及用 dd 备份 bootloader 的方法。还原的方法则使用 ubuntu 的 安装U 盘即可。另为 ubuntu 提供了 Boot-Repair 工具。

参考