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 | # 通过 aptitude 尝试解决 |
根据 aptitude 安装前的提示,发现是预安装的 openssh-client 版本高,apt purge openssl-client 卸载后安装 openssh-server 没问题。
也可以降级已安装的包,sudo apt install <package-name>=<package-version-number>
1.1.2 secureCRT 配置问题
- 关闭不用的菜单栏、状态栏等,去掉 use dockable session manager 选项,记住连接管理的快捷键即可
- 编码与字体
在Options -> Session Options -> Appearance 选项中将 Character encoding 设成”UTF-8”即可,字体 Consolas-with-Yahei,三号。没办法用没有 CJK 字符的字体 - 启用颜色
官方的介绍 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 - 调整系统提示声音,将 默认响声 设置为 windows信息栏.wav
- 安装 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
- Options–>Session Options–>Terminal–>Emulation–>Mapped Keys,选中 Backspace sends delete
- Options–>Session Options–>Terminal 启用选择发送滚轮事件到远程。取消 Scroll to bottom on output
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 是固定,不填为动态
- 图中的 4 个角色(资源、用户、local、remote)可重合,即特殊情况
- local 和 remote 为同一台设备,如将这台设备用作 socks 代理服务器
ssh -D port localhost
- 用户与 local / remote 为同一设备,资源与 local / remote 为同一设备的情况
- local 和 remote 为同一台设备,如将这台设备用作 socks 代理服务器
- 如要只将 ssh 用作隧道,限制用户登陆,可以 修改用户的 shell
- 对 windows 可用配置好连接信息的绿色版 putty 来当作 vpn 客户端的功能
- 所以对用户在本地 local 的,使用 -D 或 -L 打开本地端口,转发给 remote 侧的某资源。如资源为固定的 ip port 用 -L,动态的多个资源用 -D
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 系统
设置 PS1
export PS1="\[\e[35;22m\][\! \A \w] \[\e[0m\]"
,如要改变标题则继续加一句,PS1="\[\e]0;20.04: \W\a\]$PS1"
,把 20.04 改成想要的名字ls 颜色 https://github.com/seebi/dircolors-solarized
.bashrc 中添加 evaldircolors ~/dircolors-solarized/dircolors.256dark
给 man 命令启用颜色,~/.bashrc 添加如下
1
2
3
4
5
6
7
8
9
10
11man() {
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 "$@"
}修改时区
1
2sudo unlink /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
1.2.1 Kali
- How to move taskbar from top to bottom in kali linux Settings Editor -> xfce4-panel -> panels/panel-1/position 的 6 改成 4,下面的 size 可扩大,以让图标更大
1.3 网络
思路是用无线网卡使 PC、虚拟机、无线路由器处于同一网络中,可以上网。用有线网卡使 PC、虚拟机、开发板处于另一网络中。
要点,配置网关的网卡将作为上网网卡,旧网卡(无线网卡)用来上网,所以只有旧网卡有网关
18.04_20.04 用 netplan,配置文件示例见 asset,命令 sudo netplan --debug apply
interfaces 和 NetworkManger 即配置文件与图形界面两种方法不能同时使用,对于 /etc/network/interfaces
配置文件如下
1 | auto eth0 |
/etc/resolvconf/resolv.conf.d/base
配置 dns,没有则新建。sudo resolvconf -u 立即生效
1 | nameserver 114.114.114.114 |
1.4 内部局域网
为了搭建封闭的局域网,可以在 windows 中 添加 KM-TEST 虚拟网卡,所有虚拟机桥接到该网卡,实现虚拟机间和主机与虚拟机的通信
1.4.1 代理
proxychains4,适用于所有包管理系统和 git
- SSR 选择允许局域网
- apt 安装 proxychains4
- 配置
- 配置文件在
/etc/proxychains.conf
或proxychains4.conf
,改成socks5 192.168.7.36 17890
- 设置 DNS 文件在
/usr/lib/proxychains3/proxyresolv
,修改DNS_SERVER=8.8.8.8
- 配置文件在
- 注意配置文件代理地址设置成 host 的 IP 192.168.2.29,不是 127.0.0.1
- 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 vmware 共享文件夹
1 | # 查看共享 |
1.7 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.d
、sudo ./vboxadd cleanup
、sudo ./vboxadd-x11 cleanup
- samba 不稳定也可考虑用 ssh 映射替代,见 [sshfs-win](## 1.5 sshfs-win)
- 即可以在控制面板启用,也可以 powershell 管理员运行
1 | # 安装 |
1 | #安装 |
1 | # 检查nfs服务是否安装。没有则 sudo apt-get install nfs-kernel-server |
1.8 ftp
更多安全相关的配置见 vsftp 配置
1 | sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig |
1.9 编译工具
1 | # 20.04 同样有 broken package 问题,要降级安装 libc |
1.10 chrome
1 | # 装 chrome |
1.11 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 备份还原
- 停止实例,分离引导卷
- 附加到另一实例的块存储卷,并用命令(iSCSI 命令和信息)连接
- 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 越大越好
- 备份
- 附加引导卷,启动实例
- 用命令(iSCSI 命令和信息)断开连接,并分离
为优化资源占用,多使用 top 命令
卸载 snap,防止 CPU 占用高,
sudo systemctl stop snapd
,sudo apt purge snapd
关闭甲骨文日志
systemctl stop unified-monitoring-agent
,systemctl disable unified-monitoring-agent
关闭 fwupd
sudo systemctl stop fwupd
,sudo 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
24sudo 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-ruacme.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"
- Google Ca
- 其它命令,官方文档
- 删除证书
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 --list
,crontab -l
- 删除证书
- Google domain,参考
科学上网加速
1.12 screen
- .screenrc 文件,参考 How To Use Linux Screen 和 Screen 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
29startup_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
3# shelltitle | 前面的 ] 表示提示符结尾
# 参考官方帮助 https://aperiodic.net/screen/title_examples
shelltitle ']|bash' - .bashrc 文件,中文目录会导致显示出问题,所以用 iconv
1
2
3if [[ $TERM == screen* ]]; then
PROMPT_COMMAND='echo -ne "\033k\033\0134\033k[`basename ${PWD} | iconv -f UTF-8 -t ASCII 2>/dev/null`]\033\0134"'
fi
- .screenrc 文件
- zsh,参考1、参考2
1
2
3
4
5
6
7
8
9
10
11
12
13
14setopt extendedglob
if [[ $TERM == screen* ]]; then
precmd () {
local dir=$(print -Pn "%c" | iconv -f UTF-8 -t ASCII 2>/dev/null)
print -Pn "\ek$dir\e\\"
}
preexec () {
local dir=$(print -Pn "%c" | iconv -f UTF-8 -t ASCII 2>/dev/null)
# 截短是为了留空间显示 CMD
dir=$dir[1,6]
local CMD=${1[(wr)^(sudo|*=*|-*)]}
print -Pn "\ek$dir] ${CMD}\e\\"
}
fi
- bash
- 常用按键/命令
常用按键/命令 | 含义 |
---|---|
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 | # 退出所有登录(包括 SSH) |
2.1.2 bash
-
1
2
3
4
5
6
7
8
9
10
11
12Ctrl + 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
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 | # FTP 下载 |
2.1.7 查找文件
1 | find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \) |
2.1.8 磁盘占用统计
1 | sudo apt install qdirstat |
2.1.9 cron
- 常见 cron 写法,计算 cron 下次执行时间
crontab -e
编辑,cron 会检测 crontab 的更新,自动用最新配置select-editor
改变默认编辑器
2.2 网络
- wireguard
- clash_for_windows linux 版,手动安装服务方法,网关模式
- 网速占用统计 apt 安装 nethogs
3 备份与还原
考虑到经常环境经常变动,所以有必要学习linux的备份和还原技术。
3.1 系统备份
注意 rsync 的 exclude 将 源路径 视为 根,因此 exclude 指定的路径都是相对 源路径 来说的,具体可以建立几个测试文件,用 dry-run
的方式验证。恢复的脚本要自己写了,如果进不了系统就用 ubuntu 的安装 U 盘恢复。
下一步可以配合 cron 实现自动定期备份,配合 ssh 实现远端备份
3.2 启动备份
多系统的启动管理。每个硬盘一个 MBR,每个系统分区都有个 boot sector,两个位置都会安装 bootloader
多系统启动方式如下,MBR 的 bootloader 可以转交给其它分区的 bootloader,即 chainload
下一步可以查看 grub2 的帮助文档,以及用 dd 备份 bootloader 的方法。还原的方法则使用 ubuntu 的 安装U 盘即可。另为 ubuntu 提供了 Boot-Repair 工具。
参考