记录日常使用到的脚本

Git切换开关

cat git-proxy

1
2
3
4
5
6
#!/bin/bash
if [[ $1 == "no" ]];then
git config --global --unset https.proxy
else
git config --global https.proxy socks5://192.168.2.2:10808
fi

放入/usr/local/bin/git-proxy

1
2
git-proxy     #开启代理
git-proxy no #关闭代理

本地hosts模拟实现DNS轮询脚本

cat auto_change_hosts.sh

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
#!/bin/bash
MY_PATH=$(cd "$(dirname "$0")"; pwd)
cd $MY_PATH

F='iplist'
F2=`cat ${F}grep -A 1 '1'`
F3=`echo $F2grep '0'`
if [[ $F3 == '' ]];then
# 到最后一行的话取第一行
F4=`head $F -n 1`
else
F2=`echo $F3awk '{print $1}'`
F4=`echo $F3awk '{print $2}'`
fi
IPOLD=`echo $F2awk -F '' '{print $1}'`
NUMOLD=`echo $F2awk -F '' '{print $3}'`
IPNEW=`echo $F4awk -F '' '{print $1}'`
NUMNEW=`echo $F4awk -F '' '{print $3}'`
if [[ $1 == 'error' ]];then
NUMOLD=$[NUMOLD+1]
fi
sed -i "s/${IPOLD}.*/${IPOLD}\0\${NUMOLD}/;s/${IPNEW}.*/${IPNEW}\1\${NUMNEW}/" $F
cp -f /etc/hosts ~/hosts.new
sed -i "s/^[0-9].* malu\.me/$IPNEW malu\.me/" ~/hosts.new
cp -f ~/hosts.new /etc/hosts
cat /etc/hostsgrep 'malu.me'

cat iplist

1
2
3
4
5
11.5.100.20010
11.5.100.20100
11.5.200.20200
11.5.200.20300
11.5.300.20400

cat /etc/hosts

1
11.5.100.200 malu.me

使用方法:

1
auto_change_hosts.sh [error]

如果加参数error,则iplist最后一列数值会累加,用于调用次数统计。

创建低权限用户脚本

首先添加用户boy并修改sshd_config文件

1
2
useradd boy
passwd boy

如果遇到无法找到/bin/sh的提示,则修改/etc/passwd文件中boy的shell

1
把 /bin/sh 改成 /bin/bash

vim /etc/ssh/sshd_config

1
2
Match User boy
ChrootDirectory /home/test

cat create_low_user.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
CHROOT_PATH='/home/test'
mkdir -p ${CHROOT_PATH}/dev/
cd ${CHROOT_PATH}/dev/
mknod -m 666 null c 1 3
mknod -m 666 tty c 5 0
mknod -m 666 zero c 1 5
mknod -m 666 random c 1 8

chown root:root ${CHROOT_PATH}
chmod 0755 ${CHROOT_PATH}
ls -ld ${CHROOT_PATH}

mkdir -p ${CHROOT_PATH}/bin
cp -v /bin/bash ${CHROOT_PATH}/bin/

ldd /bin/bash
mkdir -p ${CHROOT_PATH}/lib64
cp -v /lib64/ld-linux-x86-64.so.2 ${CHROOT_PATH}/lib64/
mkdir -p ${CHROOT_PATH}/lib/x86_64-linux-gnu/
cp -v /lib/x86_64-linux-gnu/{libtinfo.so.5,libdl.so.2,libc.so.6} ${CHROOT_PATH}/lib/x86_64-linux-gnu/

mkdir ${CHROOT_PATH}/etc
cp -vf /etc/{passwd,group} ${CHROOT_PATH}/etc/

把本地文件夹备份至远程服务器

1.通过scp拷贝目录

1
2
3
#!/bin/bash
dd=`date '+%Y-%m-%d-%H%M%S'`
scp -i /root/.ssh/id_rsa -P 22 -r /local root@malu.me:/backup/${dd}

2.拷贝目录至windows共享 (如果有防火墙,需允许445, 135, 137, 138, 139 UDP和TCP)

1
2
3
#!/bin/bash
dd=`date '+%Y-%m-%d-%H%M%S'`
smbclient -c "mkdir ${dd};prompt OFF;recurse ON;lcd /local;cd ${dd};mput *" //IP/share -U username%password

切换到当前目录执行脚本

1
2
3
#!/bin/bash
MY_PATH=$(cd "$(dirname "$0")"; pwd)
cd $MY_PATH

防止脚本重复执行(每次只有一个脚本在执行)

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
function run_only_one(){
PID=$$
snum=`ps -efgrep $0grep -v grepgrep -v " $PPID "grep -v " $PID "wc -l`
if [ $snum -lt 1 ]; then
echo "start process....."
else
echo "runing....."
exit
fi
}
run_only_one

scp拷贝最近3天日期命名的tar.z文件,并删除本地6天前的tar.z文件

1
2
3
4
5
6
7
8
#!/bin/bash
for((i=0;i<=3;i++)); do
datefile=`date -d"$i day ago" +%Y%m%d`.tar.z
if [ ! -f "$datefile" ]; then
scp malu.me:/backup/$datefile /home/backup/
fi
done
find ./ -mtime +6 -type f -name "*.tar.z"xargs rm -f

合并指定目录下的所有文本,并去除重复行,并过滤^M字符 (生成超级字典)

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
#!/bin/bash
if [ $# != 1 ] ; then
echo "USAGE: $0 FLODER"
exit 1;
fi
root_dir=$1
NEWFILE=newfile_dic.txt
NEWFILE_TMP=newfile_dic.txt.tmp
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
function getdir(){
for element in `ls $1`
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ]
then
getdir $dir_or_file
else
echo -n $dir_or_file
cat $dir_or_file sed 's/^M//g'>> $NEWFILE_TMP
echo ' ok'
fi
done
}
getdir $root_dir
IFS=$SAVEIFS
sort $NEWFILE_TMPuniq > $NEWFILE
rm -f $NEWFILE_TMP

注意:^M的输入方式是 Ctrl + v ,然后Ctrl + m

杀死进程及其所有子进程

1
pstree -p PID  grep -oP '(?<=\()[0-9]+(?=\))'xargs kill -9

杀死包含关键字的进程,及其所有子进程

1
2
3
4
5
6
#!/bin/bash
PID=`ps -efgrep [n]ameawk '{print $2}'`
expr 1 + $PID > /dev/null 2>&1
if [[ $? -eq 0 ]]; then
pstree -p $PID grep -oP '(?<=\()[0-9]+(?=\))'xargs kill -9
fi

将目录下所有文件名改成小写

1
for i in `find ./`;do mv $i `echo $i tr [A-Z] [a-z]`;done

防御CC攻击脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
status=`netstat -naawk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' awk -F ":" -- '{print $1}' sort -nuniq -c sort -ntail -n 1`
NUM=`echo $statusawk '{print $1}'`
IP=`echo $statusawk '{print $2}'`
result=`echo "$NUM > 150" bc`
if [ $result = 1 ]
then
echo IP:$IP is over $NUM, BAN IT!
/sbin/iptables -I INPUT -s $IP -j DROP
fi

向进程发送按键指令

其实用C写的,算不上脚本。需要先编译: gcc key.c -o key.bin 运行: ./key.bin PID cmd

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
#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>

void stackchar(int fd,char c)
{
if (ioctl(fd, TIOCSTI, &c) < 0) {
perror("ioctl");
exit(1);
}
}

int main(int argc, char *argv[])
{
int i, j;
char c;
char proc_file[20];
int mixer_fd=0;

strcpy(proc_file,"/proc/");
strcat(proc_file,argv[1]);
strcat(proc_file,"/fd/1");

if ((mixer_fd = open(proc_file,O_WRONLY))){
for (i = 2; i < argc; i++) {
if (i > 1) stackchar(mixer_fd,' ');
for (j=0; (c = argv[i][j]); j++) {
stackchar(mixer_fd,c);
}
}
}

stackchar(mixer_fd,'\n');
exit(0);
}

向本地监听的所有匹配端口发送curl请求

1
netstat -lnt4pgrep sshdgrep -v ':22 'awk -F '0.0.0.0:' '{print $2}'awk '{print $1}'xargs -t -i curl localhost:{}

生产力工具集

https://u.tools/

Windows 子系统

直接安装WSL2

适用于之前没有安装过WSL 1.如果之前没有用过 WSL,那么首先需要为Linux启用Windows子系统:

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

2.安装 WSL2 之前,必须启用“虚拟机平台”可选功能

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重新启动计算机以完成WSL安装并更新到 WSL2 3.安装适用于 x64 计算机的 WSL2 Linux 内核更新包 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi 4.完成之后,以管理员身份运行 PowerShell,执行如下命令来设置wsl使用的默认版本

1
wsl --set-default-version 2

这里我们将默认设置为 WSL2 5.接下来通过访问 Microsoft Store 来安装分发版 https://aka.ms/wslstore 6.查看 WSL 版本

1
wsl -l -v

Win 10下开启Windows子系统WSL

1.程序和功能 - 启动或关闭Windows功能 - 适用于Linux的Windows子系统 勾选后确定,重启系统。 2.打开cmd,输入bash回车,提示访问一个网址,使用浏览器访问, 重定向到应用商店,然后可以获取需要的Linux子系统,比如Ubuntu 3.阿里云官方镜像站:https://developer.aliyun.com/mirror/

从WSL 1切换到WSL 2

WSL 2相比WSL 1有着更完整的虚拟环境,而且一些数据库比如mongodb在WSL 1下默认是无法使用的,所以果断升级: 升级步骤参考微软官方文档:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 升级过程需要注意2点: 1.使用power shell 管理员权限执行命名。 2.如果WSL 1已经有Linux环境,升级后要重启电脑。

windows ubuntu子系统设置默认root用户

1
ubuntu config --default-user root

WSL2 固定IP

在Windows 10中,以管理员权限运行CMD或Powershell,然后执行以下两个命令: 1.在Ubuntu中添加IP地址192.168.50.2,名为eth0:1

1
wsl -d Ubuntu -u root ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0 label eth0:1

2.在Win10中添加IP地址192.168.50.1

1
netsh interface ip add address "vEthernet (WSL)" 192.168.50.1 255.255.255.0

将来,访问Ubuntu时将使用192.168.50.2,访问Win10时将使用192.168.50.1。 您可以将上述两行命令另存为.bat文件,然后将其放入引导区,并使其每次自动执行。

Windows Terminal

您可以从Microsoft Store安装Windows Terminal:https://aka.ms/terminal 官方文档:https://docs.microsoft.com/en-us/windows/terminal/ 快速打开:运行 wt 快速启动ssh:wt -w 0 new-tab cmd /k ssh root@172.16.2.223 设置-打开JSON文件 settings.json

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
// This file was initially generated by Windows Terminal Preview 1.5.3242.0
// It should still be usable in newer versions, but newer versions might have additional
// settings, help text, or changes that you will not see unless you clear this file
// and let us generate a new one for you.

// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation
{
"$schema": "https://aka.ms/terminal-profiles-schema",

"defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}",

// You can add more global application settings here.
// To learn more about global settings, visit https://aka.ms/terminal-global-settings

// If enabled, selections are automatically copied to your clipboard.
"copyOnSelect": false,

// If enabled, formatted data is also copied to your clipboard
"copyFormatting": false,

// A profile specifies a command to execute paired with information about how it should look and feel.
// Each one of them will appear in the 'New Tab' dropdown,
// and can be invoked from the commandline with `wt.exe -p xxx`
// To learn more about profiles, visit https://aka.ms/terminal-profile-settings
"profiles":
{
"defaults":
{
// Put settings here that you want to apply to all profiles.
},
"list":
[
{
"guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
"hidden": false,
"name": "Ubuntu",
"source": "Windows.Terminal.Wsl"
},
{
// Make changes here to the powershell.exe profile.
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"name": "Windows PowerShell",
"commandline": "powershell.exe",
"hidden": false
},
{
// Make changes here to the cmd.exe profile.
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"name": "命令提示符",
"commandline": "cmd.exe",
"hidden": false
},
{
"guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
"hidden": false,
"name": "Azure Cloud Shell",
"source": "Windows.Terminal.Azure"
}
]
},

// Add custom color schemes to this array.
// To learn more about color schemes, visit https://aka.ms/terminal-color-schemes
"schemes": [],

// Add custom actions and keybindings to this array.
// To unbind a key combination from your defaults.json, set the command to "unbound".
// To learn more about actions and keybindings, visit https://aka.ms/terminal-keybindings
"actions":
[
// Copy and paste are bound to Ctrl+Shift+C and Ctrl+Shift+V in your defaults.json.
// These two lines additionally bind them to Ctrl+C and Ctrl+V.
// To learn more about selection, visit https://aka.ms/terminal-selection
{ "command": "closeTab", "keys": "ctrl+w" },
{ "command": "newTab", "keys": "ctrl+t" },
{ "command": "scrollUpPage", "keys": "alt+pageup" },
{ "command": "scrollUpPage", "keys": "shift+pageup" },
{ "command": "scrollDownPage", "keys": "alt+pagedown" },
{ "command": "scrollDownPage", "keys": "shift+pagedown" },
{ "command": { "action": "switchToTab", "index": 0 }, "keys": "ctrl+1" },
{ "command": { "action": "switchToTab", "index": 1 }, "keys": "ctrl+2" },
{ "command": { "action": "switchToTab", "index": 2 }, "keys": "ctrl+3" },
{ "command": { "action": "switchToTab", "index": 3 }, "keys": "ctrl+4" },
{ "command": { "action": "switchToTab", "index": 4 }, "keys": "ctrl+5" },
{ "command": { "action": "switchToTab", "index": 5 }, "keys": "ctrl+6" },
{ "command": { "action": "switchToTab", "index": 6 }, "keys": "ctrl+7" },
{ "command": { "action": "switchToTab", "index": 7 }, "keys": "ctrl+8" },
{ "command": { "action": "switchToTab", "index": 8 }, "keys": "ctrl+9" },
{ "command": { "action": "switchToTab", "index": 0 }, "keys": "alt+1" },
{ "command": { "action": "switchToTab", "index": 1 }, "keys": "alt+2" },
{ "command": { "action": "switchToTab", "index": 2 }, "keys": "alt+3" },
{ "command": { "action": "switchToTab", "index": 3 }, "keys": "alt+4" },
{ "command": { "action": "switchToTab", "index": 4 }, "keys": "alt+5" },
{ "command": { "action": "switchToTab", "index": 5 }, "keys": "alt+6" },
{ "command": { "action": "switchToTab", "index": 6 }, "keys": "alt+7" },
{ "command": { "action": "switchToTab", "index": 7 }, "keys": "alt+8" },
{ "command": { "action": "switchToTab", "index": 8 }, "keys": "alt+9" },
{ "command": {"action": "copy", "singleLine": false }, "keys": "ctrl+c" },
{ "command": "paste", "keys": "ctrl+v" },

// Press Ctrl+Shift+F to open the search box
{ "command": "find", "keys": "ctrl+shift+f" },

// Press Alt+Shift+D to open a new pane.
// - "split": "auto" makes this pane open in the direction that provides the most surface area.
// - "splitMode": "duplicate" makes the new pane use the focused pane's profile.
// To learn more about panes, visit https://aka.ms/terminal-panes
{ "command": { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }, "keys": "alt+shift+d" }
]
}

Windows SVN

https://tortoisesvn.net/downloads.zh.html

Windows GIT

https://tortoisegit.org/

接口调试工具

postman

https://www.postman.com/downloads/

PostmanCanary

https://www.postman.com/downloads/canary/

insomnia

https://insomnia.rest/download/

ApiPost

https://www.apipost.cn/download.html

Git bash

https://git-scm.com/download/win

配置

默认打开路径

修改文件:C:\Program Files\PortableGit\etc\profile 在底部加入

1
2
3
# set Project Path
proj="你的项目文件目录"
cd $proj

加入Alias

进入 C:\Users\username目录 添加3个文件(.bash_profile,.bashrc,git-prompt.sh): .bash_profile

1
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

.bashrc

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
alias s='screen -d -R'
alias mp='git commit -am "autopush" && git push'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias ls='ls -hFG'
alias l='ls -lFah'
alias ll='ls -alF'
alias lt='ls -ltrF'
alias ll='ls -alF'
alias lls='ls -alSrF'
alias llt='ls -altrF'

alias tarc='tar cvf'
alias tarcz='tar czvf'
alias tarx='tar xvf'
alias tarxz='tar xvzf'

alias g='git'
alias less='less -R'
alias os='lsb_release -a'
alias vi='vim'

# Colorize directory listing
alias ls="ls -ph --color=auto"

# Colorize grep
alias grep="grep --color=auto"

# Shell
export CLICOLOR="1"
if [ -f "$HOME/git-prompt.sh" ]; then
source $HOME/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE="1"
export PS1="\[\033[40m\]\[\033[34m\][ \[\033[36m\]\w\$(__git_ps1 \" \[\033[35m\]{\[\033[32m\]%s\[\033[35m\]}\")\[\033[34m\] ]$\[\033[0m\] "
# export PS1="\[\033[40m\]\[\033[34m\][ \u@\H:\[\033[36m\]\w\$(__git_ps1 \" \[\033[35m\]{\[\033[32m\]%s\[\033[35m\]}\")\[\033[34m\] ]$\[\033[0m\] "
else
export PS1="\[\033[40m\]\[\033[34m\][ \[\033[36m\]\w\[\033[34m\] ]$\[\033[0m\] "
# export PS1="\[\033[40m\]\[\033[34m\][ \u@\H:\[\033[36m\]\w\[\033[34m\] ]$\[\033[0m\] "
fi

export LS_COLORS="di=34:ln=35:so=32:pi=33:ex=1;40:bd=34;40:cd=34;40:su=0;40:sg=0;40:tw=0;40:ow=0;40:"

下载 git-prompt.sh

执行bat

git-bash下执行RUN.bat

1
cmd /cRUN.bat

编辑器

Markdown编辑器

Typora

https://www.typora.io/ Typora Beta 0.11.18 下载地址:

markdownpad

http://markdownpad.com/

Email: Soar360@live.com License Key: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6bnxn2kSE8qHqNY5QaaRxmO3YSMHxlv2EYpjdwLcPwfeTG7kUdnhKE0vVy4RidP6Y2wZ0q74f47fzsZo45JE2hfQBFi2O9Jldjp1mW8HUpTtLA2a5/sQytXJUQl/QKO0jUQY4pa5CCx20sV1ClOTZtAGngSOJtIOFXK599sBr5aIEFyH0K7H4BoNMiiDMnxt1rD8Vb/ikJdhGMMQr0R4B+L3nWU97eaVPTRKfWGDE8/eAgKzpGwrQQoDh+nzX1xoVQ8NAuH+s4UcSeQ==

VScode

下载:https://code.visualstudio.com/Download

同步配置

文件 - 首选项 - 设置同步 (可使用live账户)

插件

css压缩插件css-minify

https://marketplace.visualstudio.com/items?itemName=DiegoMolina.css-minify

终端下使用的字体(等宽字体)

https://github.com/abertsch/Menlo-for-Powerline

右键使用vscode打开.reg

1
2
3
4
5
6
7
8
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\VSCode]
@="VSCode"
"Icon"="C:\\Program Files\\Microsoft VS Code\\Code.exe"

[HKEY_CLASSES_ROOT\*\shell\VSCode\command]
@="\"C:\\Program Files\\Microsoft VS Code\\Code.exe\" \"%1\""

EmEditor

超大文件编辑器 https://www.rjsos.com/archives/emurasoft19.html

浏览器

Chrome

Chrome:

注意下载地址长期不变,但下到的始终是当前最新的Stable版。 32位:直接下载 64位:直接下载

Chrome Canary:

64位直接下载

Chrome Dev:

64位直接下载

Chrome Stable for Linux

64位 https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm chrome代理插件:https://github.com/FelisCatus/SwitchyOmega/releases

FireFox

下载地址: https://www.mozilla.org/en-US/firefox/all/

Opera

Opera浏览器桌面版历史版本下载 http://get.opera.com/ftp/pub/opera/desktop/ http://get.geo.opera.com/pub/opera/desktop/

Vmware

Vmware Workstation Pro 下载 15-14 https://my.vmware.com/group/vmware/info?slug=desktop_end_user_computing/vmware_workstation_pro/15_0

1
2
3
4
5
6
激活许可证
UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA
VF750-4MX5Q-488DQ-9WZE9-ZY2D6
UU54R-FVD91-488PP-7NNGC-ZFAX6
YC74H-FGF92-081VZ-R5QNG-P6RY4
YC34H-6WWDK-085MQ-JYPNX-NZRA2

Vmware Workstation Pro 历史版本下载 12-9 https://my.vmware.com/group/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/12_0

清理VMware.bat

1
2
3
4
5
6
net stop VMwareHostd
net stop VMAuthdService
net stop VMnetDHCP
net stop VMUSBArbService
net stop "VMware NAT Service"
taskkill /F /im vmware-tray.exe

远程桌面

RustDesk

http://rustdesk.com/

VNC

VNC Server VNC Viewer

TeamViewer

https://www.teamviewer.cn/cn/download/windows/

向日葵

https://sunlogin.oray.com/download/

ToDesk

https://www.todesk.com/download.html

清理远程.bat

1
2
3
4
5
6
7
8
sc stop "SunloginService"
sc stop "ToDesk_Service"
sc stop "teamviewer"
sc stop "vncserver"
taskkill /F /im SunloginClient.exe
taskkill /F /im todesk_service.exe
taskkill /F /im todesk.exe
REM start "" "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service -stop

启动远程.bat

1
2
3
4
sc start "SunloginService"
sc start "ToDesk_Service"
sc start "teamviewer"
sc start "vncserver"

虚拟组网

蒲公英 https://pgy.oray.com/download/ zerotier https://zerotier.com/download/

Win10启动时候加载bat

运行: shell:startup -> startup.vbs

1
2
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\auto_run\startup\start.bat /start",0

Beyond Compare

http://www.ucbug.com/soft/40421.html 安装说明:https://www.rjsos.com/archives/beyondcompare4.html

Adobe Photoshop CS6

http://xiazai.zol.com.cn/detail/15/146785.shtml 补丁 (将 amtlib 覆盖掉相应软件的源文件) http://xiazai.zol.com.cn/detail/45/440347.shtml

Adobe Premiere Pro 2020

https://www.rjsos.com/archives/premiere2020.html

Everything

Windows桌面搜索引擎 (快速搜索文件工具) https://www.voidtools.com

思维导图

XMind

https://www.xmind.cn/download/ 破解1 破解2

MindMaster

https://www.edrawsoft.cn/mindmaster/ 破解

Virtual Audio Cable

混音软件,可实现多音频设备同时输出 https://software.muzychenko.net/eng/vacselect.htm

翻译

https://appdownload.deepl.com/windows/full/DeepLSetup.exe

Hyper

https://hyper.is/ 安装主题

1
hyper i hyper-material-theme

配置文件路径:C:\Users\malu\AppData\Roaming\Hyper.hyper.js

1
2
3
shell: 'C:\\Program Files\\PortableGit\\bin\\bash.exe',
...
plugins: ["hyper-material-theme"],

SQL

Windows Redis

https://github.com/microsoftarchive/redis/releases

Redis 分析工具客户端

https://redislabs.com/redisinsight/

PowerDesigner v16.5

http://onlinedown.rbread04.cn/huajunsafe/powerdesigner1029.zip

ODBC for MySQL

(注意powerdesigner是用java32位的,所以ODBC也下32位 https://dev.mysql.com/downloads/connector/odbc/

BIOS

bios修改工具mmtool https://softradar.com/static/products/mmtool/distr/0/mmtool_softradar-com.zip win10适配修改器 http://www.angusj.com/resourcehacker 也可以直接下修改好的mmtool http://www.smxdiy.com/thread-1995-1-1.html 技嘉B85主板BIOS https://www.gigabyte.com/tw/Motherboard/GA-B85-HD3-A-rev-10/support#support-dl-bios B85芯片组主板也能用上NvmeSSD https://zhuanlan.zhihu.com/p/40367807

其他

https://www.rjsos.com/

linux nslookup安装

1
apt install dnsutils

DNSmasq安装

1
apt install dnsmasq

使用本地hosts做解析

小方转存SAMBA技巧

1.使用一台开有samba匿名共享的服务器 2.建立匿名目录TDDOWNLOAD 3.把手机里的网关指向该服务器 4.进入小方转存即可

使用 useradd 命令创建 SSH 用户:

1
useradd boy

也可以用高级交互式命名创建用户

1
adduser boy

根据提示一步步操作

使用 mknod 命令创建 /dev 下的文件。在下面的命令中,-m 标志用来指定文件权限位,c 意思是字符文件,两个数字分别是文件指向的主要号和次要号。

1
2
3
4
5
6
mkdir -p /home/test/dev/      
cd /home/test/dev/
mknod -m 666 null c 1 3
mknod -m 666 tty c 5 0
mknod -m 666 zero c 1 5
mknod -m 666 random c 1 8

对于交互式会话,这需要至少一个 shell,通常为 sh 和基本的 /dev 节点,例如 null、zero、stdin、stdout、stderr 和 tty 设备:

1
ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}

在 chroot 中设置合适的权限。注意 chroot 和它的子目录以及子文件必须被 root 用户所有,并且对普通用户或用户组不可写:

1
2
3
chown root:root /home/test
chmod 0755 /home/test
ls -ld /home/test

为 SSH chroot 设置交互式 shell,创建 bin 目录并复制 /bin/bash 到 bin 中:

1
2
mkdir -p /home/test/bin
cp -v /bin/bash /home/test/bin/

识别 bash 所需的共享库,如下所示复制它们到 lib64 和 lib 中

1
2
3
4
5
ldd /bin/bash
mkdir -p /home/test/lib64
cp -v /lib64/ld-linux-x86-64.so.2 /home/test/lib64/
mkdir -p /home/test/lib/x86_64-linux-gnu/
cp -v /lib/x86_64-linux-gnu/{libtinfo.so.5,libdl.so.2,libc.so.6} /home/test/lib/x86_64-linux-gnu/

创建 chroot 通用配置目录 /home/test/etc 并复制已更新的账号文件(/etc/passwd 和 /etc/group)到这个目录中:

1
2
mkdir /home/test/etc
cp -vf /etc/{passwd,group} /home/test/etc/

注意:每次向系统添加更多 SSH 用户时,都需要将更新的帐户文件复制到 /home/test/etc 目录中。

配置 SSH 来使用 chroot

打开 sshd_config 文件

1
vim /etc/ssh/sshd_config

文件中添加或修改下面这些行

1
2
3
4
# 定义要使用 chroot 的用户
Match User boy
# 指定 chroot
ChrootDirectory /home/test

重启sshd

1
2
3
systemctl restart sshd 或者

service sshd restart

参考文章

https://linux.cn/article-8313-1.html

相关脚本

创建低权限用户脚本

给用户sudo权限

方法一: 修改/etc/sudoers文件,添加 “malu ALL=(ALL) ALL” 方法二: 先查看sudo组ID cat /etc/group grep sudo 把用户加入sudo组 usermod -G 27 malu 方法三: 直接编辑/etc/group,在sudo组后面添加malu用户,多个用户用逗号”,”分割

初次使用配置用户信息

1
2
3
4
5
6
7
8
9
10
11
git config --global user.name "malu"
git config --global user.email "malu@malu.me"

git config --global alias.l 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --no-merges -30'
git config --global alias.ll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat -6'
git config --global alias.lll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat --graph -10'

git config --global alias.s 'status --short'

# 防止gitk中文乱码
git config --global gui.encoding utf-8

使用HTTP basic auth clone

使用http方式去clone时,如果用户名密码包含特殊字符,则都需要URL encode 比如用户名含有邮箱的@符号时需要转换成%40

1
git clone https://malu%40malu.me:password@github.com/pingmalu/test.git 

git赋予文件权限

查看当前权限

1
2
[localhost]$ git ls-files --stage run.sh
100644 c1bda43ae2d82769f5e66404fdbe7d752ddb383b 0 run.sh

增加可执行权限

1
[localhost]$ git update-index --chmod +x run.sh

git添加多个远程仓库

添加新的远程仓库:

1
git remote add malu https://malu.me/project/xxx.git

将本地的所有分支推送到新的远程仓库:

1
git push --all malu

强制推送到新的远程仓库:

1
git push -f malu

git基本使用方法

查看远程仓库地址

1
git remote -v

查看所有分支

1
git branch -a

查看每次提交的所有文件列表

1
git log --stat

查看特定的commit id中的文件列表

1
git show --stat <commit id>

查看最近一次提交的文件列表

1
2
3
git show --stat

git log --stat -1

查看配置

1
git config -l

一次完整提交

1
2
3
git add .
git commit -m'修改BUG'
git push

使用代理

1
git config http.proxy http://user:pwd@server.com:port

http全局代理

1
git config --global http.proxy http://127.0.0.1:1080

http当前项目代理

1
git config --local http.proxy http://127.0.0.1:1080

socks5全局代理

1
git config --global http.proxy socks5://127.0.0.1:1080

socks5全局代理,只对github.com

1
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

clone时使用代理

1
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080

clone时使用代理并取最新的

1
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080 --depth=1

取消代理

1
git config --global --unset http.proxy

取消只对github.com的代理

1
git config --global --unset http.https://github.com.proxy

查询

显示文件的每一行是在哪个版本最后修改。

1
git blame filename.c 

查找commit内容

1
git log  --pretty=onelinegrep 关键字

查看用户代码量

1
git log --stat --author='username'perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;'

分支

查看本地分支

1
git branch

查看所有分支 (加-v显示最后一次提交信息)

1
git branch -a -v

本地创建分支

1
git branch dev

将本地分支上传至远程

1
git push origin dev

下载在线的一个分支

1
git branch dev origin/dev

删除本地分支

1
git branch -d dev

删除远程分支

1
2
git branch -r -d origin/branch-name
git push origin :branch-name

切换本地分支到dev

1
git checkout dev

合并分支

1.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

1
2
3
4
5
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master

2.当master代码改动了,需要更新开发分支(dev)上的代码

1
2
3
4
5
git checkout master 
git pull 
git checkout dev
git merge master 
git push -u origin dev

3.假设本地有2个分支dev master,要把dev合并到master 也可以

1
git merge dev master

4.把dev合并到master还可以

1
git rebase dev master

合并冲突解决

1.如果合并冲突取对方代码

1
git merge -s recursive -X theirs dev --allow-unrelated-histories

2.如果合并冲突取当前分支代码

1
git merge -s recursive -X ours dev --allow-unrelated-histories

–allow-unrelated-histories 把两段不相干的 分支进行强行合并 3.一个分支完全覆盖另一个分支

1
2
3
git checkout master  // 切换到旧的分支
git reset –hard dev // 将本地的旧分支 master 重置成 dev
git push origin master –force // 再推送到远程仓库

标签

本地新建标签

1
git tag -a only_apache -m "只有apache集成环境"

查看本地标签

1
git tag

切换至指定标签

1
git checkout only_apache

把所有本地标签提交到服务器

1
git push origin --tags

将标签only_apache提交到服务器

1
git push origin only_apache

切换远程分支,Git每次提交需要密码处理

把远程分支从https切换到ssh模式

1
2
3
4
5
6
# 先查看远程分支
git remote -v
# 删除远程分支
git remote rm origin
# 添加远程分支
git remote add origin git@github.com:pingmalu/test.git

Git 合并遇到冲突解决办法

1.使用栈保存编辑数据后pull下来再合并

1
2
3
4
5
6
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git pull: 暂存了本地修改之后,就可以pull了。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash pop stash@{$num}: 如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

2.从xxxx分支合并到dev

先把xxxx分支上的提交hash找出来,再去dev上执行cherry-pick:

1
2
git cherry-pick a2a544fd01c2578046b335636e4
git push origin dev

Git后悔药(慎用)

放弃本地修改

1
2
git reset --hard
git clean -df

其他:

1
2
3
4
5
6
7
8
9
10
11
12
git rm --cached <FILE>:已 add(tracked) 未 commit 的文件,使其回到未 add 状态(untracked)。
git rm -f <FILE>: 从本地删除已 add 的文件。
git checkout -- <FILE> :有修改的文件回到 tracked 状态,对已 tracked 的文件撤销修改。
git reset HEAD <FILE>:撤销 commit,回到 modified 状态。
git reset --soft HEAD^:撤销 commit,回到 tracked 状态。
git clean:删除所有 untracked 文件。

git clean -n:演习
git clean -f:删除当前目录下 untracked 文件,除过 .gitignore 里的文件或文件夹
git clean -f <path>:指定路径下
git clean -df:删除当前目录下 untracked 文件和文件夹
git clean -xf:删除当前目录下所有 untracked 文件,不管 .gitignore

放弃本地修改,使用远程最新版本

1
2
3
git fetch --all
git reset --hard origin/master
git pull

如果只需要移除一个文件

1
git reset <文件名>

或者如果你想从暂存区移除所有没有提交的修改

1
git reset

放弃远程上一次提交的内容

1
2
3
4
5
git reset --hard HEAD^
或用:
git reset --hard HEAD~1

git push --force

修改错误的提交信息

1
2
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”
git push <remote> <branch> --force

恢复某个文件到指定hash

1
git checkout fc0c4369b362a38 .\index.html

Stash未提交的更改

stash在本质上会取走所有的变更并存储它们为以备将来使用

1
git stash

检查stash列表,你可以运行下面的命令

1
git stash list

如果想要解除stash并且恢复未提交的变更

1
git stash apply

每个stash都有一个标识符,一个唯一的号码(尽管在这种情况下只有一个stash)。 如果只想留有余地进行apply stash,你应该给apply添加特定的标识符

1
git stash apply stash@{2}

如果想取出stash

1
git stash pop

取出指定stash

1
git stash pop stash@{2}

清除stash

1
git stash drop stash@{0}

清除所有stash

1
git stash clear

找回删除的stash

1
2
git fsck --lost-found
git show 8dd73fa8d14880182f11e24dc10bca570b6127d7

Ubuntu git升级到最新版

1
2
3
4
apt-get install software-properties-common
add-apt-repository ppa:git-core/ppa
apt-get update
apt-get install git

cmd下git log乱码

windows配置环境变量

1
LESSCHARSET 为 utf-8

统一配置:

1
2
3
4
5
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8

export LESSCHARSET=utf-8 ## linux bash配置环境变量
set LESSCHARSET=utf-8 #windows配置环境变量

gitk乱码问题

编辑C:\Users\Administrator\.gitconfig 全局文件(也可编辑项目目录.git/config用于设定单个项目):

1
2
3
4
[gui]
encoding = utf-8
[i18n]
commitencoding = {utf-8gbk}

[gui]用于设定gitk总的编码格式 [i18n]用于设定commit等编码,这个默认不需要去设置

Git Bash中查看log中文乱码

修改%Git%\etc\profile (Linux下为 ~/.bash_profile 文件),在末尾添加如下一行:

1
export LESSCHARSET=utf-8

要马上生效,直接设置该环境变量,或者重新登录

git diff乱码问题也可以用上面的设置

1
export LESSCHARSET=utf-8

git-bash 乱码临时转换

utf-8转gbk

1
git status  iconv -f utf-8 -t gbk

gbk 转 utf-8 输出

1
winpty ipconfig

解决 idea Terminal 配置 git bash 中文乱码

修改:C:\Program Files\Git\etc\bash.bashrc 文件,在这个文件末尾追加

1
2
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

ERROR

git pull 报错:

Auto packing the repository for optimum performance. You may also run “git gc” manually. See “git help gc” for more information.

1
git gc

由于git本身不保存文件之前的差异文件.只保存每个文件的快照.所以在频繁修改大文件的情况下会造成git目录变得肥大不堪.git早就有了解决方案.git gc后,会在.git目录下生成一个packfile与idx文件.只保存文件差异

Git忽略规则及.gitignore规则不生效的解决办法

原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。 那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

1
2
3
git rm -r --cached .    #将会移除所有的缓存索引
git add .
git commit -m 'update .gitignore'

!!! 还有一种可能是.gitignore的文件编码问题导致 比如我遇到Unicode的编码,把它改成ANSI即可

git pull的时候遇到

Unlink of file ‘.git/objects/pack/pack-***.pack’ failed. Should I try again? (y/n) y

上面的问题,按n或者y都没有用,先Ctrl+C 再执行:

1
2
git gc --auto  #自动清理本地的文件
git repack -d -l #将版本库未打包的松散对象打包

openshift git clone Permission denied

openshift执行git clone ssh://xxx@xxx.rhcloud.com/~/git/xxx.git/ 时报错 :

Permission denied (publickey,gssapi-keyex,gssapi-with-mic). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

解决办法: 将密钥拷贝的.ssh目录下,改名id_rsa/id_rsa.pub(密钥/公钥)再执行克隆命令成功解决。

自动脚本

每次提交md笔记需要敲命令,感觉太麻烦了,于是有了这个windows BAT脚本 拉取:

1
2
3
4
5
@echo off
@echo ========================================================
@echo git pull
@echo ========================================================
git pull

提交:

1
2
3
4
5
@echo off
@echo ========================================================
@echo git push
@echo ========================================================
git add . && git commit -am 'update' && git push

部署gitlab服务器

docker安装: https://docs.gitlab.com/omnibus/docker/

目前VPS商家提供的Debian 10系统基本上都是4.19.x.x的内核版本,站长本着用新不用旧的原则,在初次部署环境的时候,总是忍不住将系统内核版本升级到比较新的版本。 1、查看系统内核版本

uname -r

站长用于演示的这台Debian 10系统的VPS原始内核版本为:4.19.0-5-amd64 2、添加Debian官方 buster-backports 源

deb http://deb.debian.org/debian buster-backports main

编辑nano /etc/apt/sources.list,站长用nano编辑演示,默认如下图所示(有些商家默认有buster-backports源的,则略过):新手教程 将 buster-backports 源添加进去,然后按Ctrl+X退出;新手教程 这里会提示保存,输入Y并回车;新手教程 直接按回车确认将buster-backports源写入,新手教程 3、安装官方最新5.1x.x内核 先更新系统,命令如下:

apt update

安装最新内核

apt install -t buster-backports linux-image-cloud-amd64 linux-headers-cloud-amd64

新手教程 更新启动内核版本

update-grub

新手教程 重启系统

reboot

4、卸载旧内核版本 输入uname -r即可看到内核版本已经是5.10.0-0.bpo.7-cloud-amd64;输入以下命令查看当前系统已经安装的内核版本;

dpkg –list grep linux-image

新手教程 使用apt purge命令卸载旧的内核版本(按实际卸载的内核版本修改命令):

apt purge linux-image-4.19.0-5-amd64

新手教程 输入以下命令查看当前系统已经安装的内核头文件;

dpkg –list grep linux-headers

新手教程 如果有4.19.x.x的内核头文件,也可以使用apt purge命令卸载,命令如下(按实际卸载的内核头文件版本修改命令):

apt purge linux-headers-4.19.0-5-amd64

最后再动更新一下启动内核版本,可以看到,只剩下5.10.0-0.bpo.7-cloud-amd64了。

update-grub

新手教程 搞定!收工!……等等,好像还没完呢,查看下方这篇文章开启BBR才算真正搞定!

WordPress是世界上最著名的博客及内容管理系统(CMS)之一,我们这个博客也是基于WordPress的。通常来说,从一个新装的系统搭建WordPress都是比较麻烦的,自己需要安装PHP, 数据库,服务器程序等等多个组件,装好WordPress大概需要一个多小时,而且性能优化也不能尽如人意。因此,我们今天介绍一行代码,可以从零开始,用一行代码帮你搭好WordPress系统。本文作者为香菇肥牛,原文链接为https://qing.su/article/146.html, 转载请注明原文链接,谢谢!

1, 服务器系统要求

  今天的教程支持CentOS 6, 7; Debian 7, 8, 9; Ubuntu 14, 16, 18.  所有系统均需为64位操作系统。安装时需要root权限。  

2, 安装的组件

  这个一行安装代码将在您的服务器上安装LLsMP组件与Wordpress程序,即OpenLiteSpeed服务器,MariaDB数据库,及PHP.  OpenLiteSpeed是非常高效的服务器软件,其性能可以直接吊打Apache, 甚至还可以性能数倍于Nginx.  现在大部分主机商的虚拟主机都是搭建在LiteSpeed系统上的,因为它对高并发访问的支持是所有服务器程序里面最好的,同时还能兼容.htaccess这类比较方便的Apache功能。OpenLiteSpeed自带了人性化的后台控制面板,因此不仅高效,而且非常易用。服务器自带的LSCache更是毫无争议的效率最高的WordPress缓存系统。**这个一行代码搭建出来的WordPress可以直接作为安全高效的生产环境。**下面,我们开始介绍这个一行代码。  

3, 安装Wordpress

  代码如下:

1
wget --no-check-certificate https://raw.githubusercontent.com/litespeedtech/ols1clk/master/ols1clk.sh && bash ols1clk.sh -w --adminpassword mypassword --email myemail@qing.su --lsphp 73 --wordpressplus mydomain.qing.su --wordpresspath /srv/www/mydomain.qing.su/public_html/ --dbrootpassword myrootpassword --dbname mywordpressdb --dbuser mywordpressdbuser --dbpassword mywordpressdbpassword --listenport 80 --wpuser mywpuser --wppassword mywppassword --wplang zh_CN

我们依次解释一下这行代码里面用到的几个参数。

  • -w 安装wordpress
  • –adminpassword 后面加上你设定的OpenLiteSpeed后台管理员密码
  • –email 后面跟你的WordPress管理员邮箱
  • –lsphp 后面加上你想要安装的PHP版本,比如7.3就输入73, 5.6就输入56.
  • –wordpressplus 后面加上你的WordPress域名。请提前将该域名解析到这台VPS或者服务器上。
  • –wordpresspath 后面跟WordPress的安装路径。
  • –dbrootpassword 后面加上MariaDB数据库root用户的密码。
  • –dbname 后面加上你需要新建的WordPress的数据库名。
  • –dbuser 后面加上你需要新建的WordPress的数据库用户名。
  • –dbpassword 后面加上你需要新建的WordPress的数据库密码。
  • –listenport 后面加上网站的端口,默认是80。
  • –wpuser 后面加上你需要新建的WordPress的管理员用户名。
  • –wppassword 后面加上你需要新建的WordPress的管理员密码。
  • –wplang 后面加上WordPress语言,如果需要中文,填zh_CN; 如果需要英文,填en.

输入并执行这行命令之后,会出现下面这个页面,可以确认一下信息输入是否有误。     如果没有问题,回车即可开始安装啦,一般来说很快就能安装好。如果缺一些依赖环境,这行命令也会自动帮你安装。 安装完毕之后,登录你的域名,就能管理WordPress啦,比如如果你的安装域名是mydomain.qing.su, 那么登录WordPress后台的地址是mydomain.qing.su/wp-login.php.  在后台,你可以继续设置主题、插件,布置模块样式等。 如果需要登录OLS的后台添加其他网站,请访问你的域名:7080, 比如这里是mydomain.qing.su:7080, 用户名是admin, 密码是刚才设定的第二个参数。   今天就介绍到这里。这个一行代码安装WordPress的方法是不是很方便呢?如果您遇到任何问题,欢迎留言与我交流。本文作者为香菇肥牛,原文链接为https://qing.su/article/146.html, 转载请注明原文链接,谢谢!   EDIT: 新增SSL安全证书的安装

4. [可选]安装SSL安全证书

这个脚本一键安装的WordPress是基于HTTP的,不带安全证书。如果您需要给网站加上安全证书,则还需要安装SSL.  刚开始用LiteSpeed的朋友们可能不清楚怎样安装SSL证书。我们这里假设用Let’s Encrypt生成好了证书,私钥储存在/etc/letsencrypt/live/domain.qing.su/privkey.pem, 证书储存在/etc/letsencrypt/live/domain.qing.su/fullchain.pem (这里我们使用全链,包含了证书和中间链)。然后,我们登录OpenLiteSpeed后台,地址是你的网址:7080, 比如example.com:7080, 用户名是admin, 密码是之前使用一键安装的时候设置的–adminpassword参数值。登录好之后,会看到类似下面的界面。     上面有服务器相关的基本信息。我们点击左侧的Listeners, 来到下图的界面。     然后点击图中的wordpressssl, 即可编辑我们刚刚安装的WordPress网站的相关设置。如下图。     我们点击头部的SSL选项卡,然后点击右上角小蓝色方框里面的图标,编辑第一个部分SSL Private Key & Certificate.  编辑的时候,我们在Private Key File里面填入服务器上私钥的地址,在Certificate File里面填入全链证书的地址,然后Chained Certificate选择Yes. 全部填好之后,保存并点击右上角绿色方框里的图标,重启LiteSpeed服务器。这样,我们就安装好SSL证书啦!

Mailu.io是一款免费开源且性能强大、功能丰富的域名邮箱系统。它基于Docker, 具有部署简单,可移植性高,备份方便等多种优势。之前,我们介绍过Poste邮箱系统的搭建;Poste已经很久不再更新了,而Mailu则是Poste的升级版,一直稳定更新。 今天,我们就来介绍如何搭建并使用Mailu.io域名邮箱。类似的域名邮箱系统,我们还推荐iRedMailZimbra, 您可以自行比较并选择喜欢的程序。本文作者为香菇肥牛,原文链接为https://qing.su/article/mail-hosting-with-mailu-io.html, 转载需注明原文链接。  

1, 系统环境要求

由于Mailu基于Docker, 因此几乎可以在任何版本的Linux发行版上安装使用。安装前,请确保您的服务器有2 GB的内存,并拥有一个独立IP地址。 在安装之前,您需要确保您的VPS的25端口是开放的。您可以在您的VPS上执行下面的命令来测试25端口是否开放。

1

telnet smtp.aol.com 25

如果看到类似下面的回显,则说明端口是开放的:

1 2 3 4

Trying 74.6.141.50… Connected to smtp.aol.g03.yahoodns.net. Escape character is ‘^]‘. 220 smtp.mail.yahoo.com ESMTP ready

如果显示超时,说明25端口不开放;您需要向主机商申请开放25端口,或者更换一台VPS. 本文中,我们将在一台Ubuntu 20.04 LTS 64 bit操作系统的VPS中安装。在其他操作系统中的安装步骤类似。  

2, 主机名与DNS设置

设置好主机名(服务器名, Hostname)是所有邮件服务器必不可少的一步,否则在发信时将会遇到各种错误。 如果您的域名为example.com, 那么我建议您的邮件服务器主机名可以设置为_mail.example.com或者mx.example.com.  如果您不知道如何设置服务器名,请参考我们的图文视频教程。 下文中,我们将以mx.qing.su_作为主机名介绍整个系统的部署。当您设置好主机名之后(以mx.qing.su为例),在SSH中执行命令:

1

hostname

此时您应当看到系统显示_mx.  如果系统显示mx.qing.su_, 说明主机名设置错误,请重新设置。 在SSH中执行命令:

1

hostname -f

此时您应当看到系统显示_mx.qing.su_. 设置好主机名之后,您还需要设置DNS解析记录。DNS记录的设置分为两部分,一部分需要在搭建邮箱之前设置,另一部分(DKIM)在搭建邮箱之后设置。我们先介绍第一部分。假设您的服务器IP地址为88.88.88.88, 那么您需要到您域名的DNS服务提供商处,添加下面的五条记录:

  • 将域名_qing.su_设置任意一条A记录或者ALIAS记录,值为任意。如果您不使用该域名做网站,您可以设置一条A记录,解析到127.0.0.1.  请注意,根域名不能设置CNAME记录。
  • 将域名_mx.qing.su_设置A记录,解析到88.88.88.88
  • 将域名_qing.su_设置MX记录,优先级为10,解析值为mx.qing.su
  • SPF: 将域名_qing.su_设置TXT记录,解析值为”v=spf1 mx ~all”
  • DMARC: 将域名_**_dmarc.qing.su**_设置TXT记录,解析值为”v=DMARC1; p=none; pct=100; rua=mailto:admin@qing.su

然后,您需要到您的VPS服务商处,为您的IP地址设置逆向DNS记录(Reverse DNS, PTR), 将88.88.88.88解析到mx.qing.su. 设置好这些之后,我们就可以开始部署Mailu域名邮箱了。  

3, 安装Docker与Docker Compose

前面说过,Mailu基于Docker.  这里我将以Ubuntu 20.04 LTS操作系统为例,简要记录Docker与Docker Compose的安装。如果您对Docker非常了解,可以跳过这一部分。如果您使用的是其他操作系统,可以在这里(https://docs.docker.com/engine/install/, https://docs.docker.com/compose/install/)找到对应的安装步骤。 安装Docker Engine:

1 2 3 4 5 6

apt-get update && apt-get upgrade apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg  apt-key add - add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” apt-get update apt-get install docker-ce docker-ce-cli containerd.io

安装Docker Compose:

1 2

curl -L “https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

 

4, 配置Mailu服务器

Mailu服务器提供了一个自动生成配置文件的网页,非常方便。因此,我们将使用这个网页来生成配置文件。它的地址是https://setup.mailu.io/ 打开网页后,第一步是选择版本与Docker管理方式。这里我们选择最新版1.7, Docker管理方式选择Docker. 设置Mailu版本与Docker 第二步,需要设置路径与域名信息。请按照下图填写,并替换为您的域名。请注意,Main mail domain and server display name应该填写您的根域名,比如我这里是qing.su; 而Linked Website URL, 则填写您的邮件服务器主机名,这里我们填写https://mx.qing.su.  在TLS certificates这里,我们选择letsencrypt, 系统将会自动帮我们生成Let’s Encrypt证书。您也可以选择自己提供证书。下方的Enable the admin UI请务必勾选,否则系统将不会安装Web管理面板。 设置Mailu路径与管理员信息 第三步,选择网页邮箱的面板。这里可以选择Roundcube和Rainloop, 您可以根据个人偏好来选择。我这里推荐Rainloop,它更美观,且对移动端的适配更好。Rainloop支持中文显示。下面的三个选项分别是杀毒、WebDAV、邮件代收,您可以根据自己的需要来勾选。 第四步,配置IP与主机名。请在IP listen address中填写您服务器的IP地址,比如88.88.88.88.  第二行是设置Docker的子网,一般保持默认即可。IPv6建议不启用。Unbound resolver建议启用。最后一栏,填写您的服务器的长主机名,我这里是mx.qing.su. 配置IP地址与主机名 第五步,也是最后一步,选择数据库。这里我们选择最简单的Sqlite即可。您也可以选择其他的数据库,比如MySQL或者PostgreSQL. 选择数据库 选择完毕后,点击Setup Mailu, 系统就会自动帮你生成好配置文件了,如下图。 系统生成的Mailu配置文件  

5, 运行Mailu服务器

按照上述步骤生成好Mailu配置文件,就可以运行Mailu服务器了。回到SSH, 执行:

1 2

mkdir /mailu cd /mailu

然后找到之前那个页面生成的配置文件链接,下载到/mailu文件夹中:

1 2

wget http://setup.mailu.io/1.7/file/edda7279-qing-su-qing-su-04773fdf23f9/docker-compose.yml wget http://setup.mailu.io/1.7/file/edda7279-qing-su-qing-su-04773fdf23f9/mailu.env

最后,使用Docker compose运行。

1

docker-compose -p mailu up -d

初次使用,系统将会下载几个Docker镜像,需要数分钟的时间。等系统提示完成后,Mailu就处于运行状态了。 部分朋友在初次运行Mailu的时候会遇到类似于下图的报错: Mailu运行报错 如果遇到这种情况,您可以编辑_docker-compose.yml_文件,删除掉所有绑定了**[::1]**地址与端口的行,然后重新运行上面的命令即可。  

6, 使用Mailu域名邮箱

在第一次登录Mailu服务器后台面板之前,需要新建一个管理员账户。在SSH中执行:

1

docker-compose -p mailu exec admin flask mailu admin hello example.com qing.su

这样,我们就创建了一个用户名为hello@example.com, 密码为qing.su的管理员账户。请替换为您需要的值。 创建完毕,您就可以在浏览器中访问https://mx.qing.su/admin登录您的管理员面板了,如下图。 Mailu后台面板 点击左侧Mail Domains, 就能管理我们的邮箱域名。在域名管理界面,点击右上角New domain, 即可添加域名。点击下图中的红框部分,即可添加用户;点击绿框部分,则进入域名详情页。 管理邮箱域名 点击上图中的红框,进入用户管理界面,如下图: 添加邮箱用户 这里我们可以输入邮箱前缀,密码,姓名。下方的Features and quotas可以设置邮箱容量,并且可以设置是否允许IMAP和POP3客户端登录收信。设置完毕后,点击Save, 就添加好了用户。 在域名管理界面,点击之前那张图的绿框部分,则进入了域名详情页。我们点击右上角的Generate keys, 即可生成DKIM记录。如下图。 根据上图的信息,您需要去您的DNS服务器运营商设置域名的DKIM记录。比如,以我的qing.su域名为例,我需要设置下面的DKIM记录:

  • 将域名_dkim._domainkey.qing.su_设置TXT记录,解析值为”v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK8nX8NbQ/16bb7zUqZif39emugOQpBDTXeLTqKhmrhPHFt5RgrDj9ibL18ovXKsQONjXZ+qNE407+KQZWcVLFvCQ6jtl1ojSfnJGeltGRqgfjw0nIAFQ9P6UVO5fiyrnxR4NZ+MDKvsv33NMgJxpEH6O8hQ/K2mDM+mDcIIbOwQIDAQAB”

这样,我们就完成了全部的DNS设置。此时,您的域名邮箱已经全部搭建并配置完毕,可以收发信了。 访问https://mx.qing.su就会自动跳转到网页邮箱的登录界面。如果您在配置时选择了Rainloop, 则第一次登录时可以在界面上选择语言,比如简体中文。 我们使用mail-tester.com测试发信,可以看到评分为满分10分。 Mail-tester邮件测试

Linux 下软件安装基本都是在终端下进行的…. 虽说安装软件基本上选对源就没有无法安装的,但是 Archlinux 下的 yaourt 安装就是社区打包的软件了. 软件来源各种各样,有的是 Google code 上的,有的是 GitHub 上的,有的就是 sourceforge 上的了. 但是在中国的大环境下不能保证上面网站的正常访问 QAQ Google 的话有 hosts 的情况下基本上是 把 http 修改成 https 就可以下载了,其余两个就只能代理进行下载软件并安装了.

#代理

首先科学上网的话就需要代理,SSH 这样进行端口监听的比较不错.VPN 是全局代理就不用讲述了. 不过 VPN 也可以走路由表进行部分代理(不在本文讨论范围之内)SSH 的话在 Linux 下就是简单的一句 ssh -NfD 127.0.0.1:7070 user@server 因为 SSH 不是 HTTP 代理,所以需要转发,如果是纯 HTTP 代理的话直接配置环境变量即可. 前面写的是本机代理的端口,后面是服务器的用户名和服务器 IP 地址.

#转发

SSH 是 SOCKET5 代理,但是下载的话基本上就是 HTTP 代理怎么转发呢? 这里就需要一个软件叫做Privoxy(opens new window) Privoxy 可以把 SOCKET5 转 HTTP 代理, 首先安装它 sudo pacman -S privoxy 然后进行配置 sudo vim /etc/privoxy/config在配置文件里面添加 forward-socks5 / 127.0.0.1:7070 . 注意后面有个点,容易忽略. 这个是转入的 SOCKET5 代理,指的是 SSH 的代理监听的端口号. 配置文件里面有句话是 listen-address 127.0.0.1:8118 这个是转发出去的 HTTP 代理的端口号. 这样写好之后, 启动服务 sudo systemctl start privoxy.service

#配置环境变量

转发实现之后就可以应用在终端里面了, 在终端里面输入

1
2
3
export https_proxy=127.0.0.1:1080 
export http_proxy=127.0.0.1:1080
export ALL_proxy=socks5://127.0.0.1:1080

这样就完成代理的设置了. 测试 IP 获取,如无意外,此时会返回国外服务器的IP地址。全局出国。

1
curl ip.gs

取消代理

1
2
unset http_proxy
unset https_proxy
0%