Linux Notes
Currently using Kubuntu
Linux命令行有这么多的好东西?
换源
清华、阿里、中科大
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
然后 sudo apt-get update
fisher
FZF
Shadowsocks
ss-qt5 sudo add-apt-repository ppa:hzwhuang/ss-qt5 sudo apt-get update sudo apt-get install shadowsocks-qt5
https://github.com/shadowsocks/shadowsocks-libev
pyss 好像坏了....所以用这个
sudo apt install libsodium-dev
sudo apt-get install shadowsocks
or sudo apt-get install shadowsocks-libev
provixy
install sudo apt-get install privoxy
config sudo subl /etc/privoxy/config
listen-address localhost:8118 ... forward-socks5 / 127.0.0.1:<PORT> .
/etc/privoxy/user.action
``` + restart ```bash sudo privoxy --user privoxy /etc/privoxy/config sudo service privoxy restart sudo service privoxy start sudo service privoxy stop sudo service privoxy status ??? [X] sudo systemctl enable privoxy [X] sudo systemctl start privoxy [X] sudo systemctl restart privoxy
export (~/.bashrc
) function down_proxy(){ unset http_proxy unset https_proxy unset APT_CONFIG # npm config delete proxy git config --global --unset http.https://github.com.proxy echo -e "proxy down!" } function up_proxy() { sudo service v2ray restart # sudo service privoxy restart # pkill ss-local # nohup ss-local -c ~/.shadowsocks/config.json >> ~/.shadowsocks/log.txt 2>&1 & export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com" export http_proxy="http://127.0.0.1:8118" export https_proxy=$http_proxy # npm config set proxy=http://127.0.0.1:8118 # export APT_CONFIG=~/.apt_proxy.conf echo -e "proxy up!" }
~/.config/fish/functions/up_proxy.fish
function up_proxy sudo service privoxy restart sudo service v2ray restart # pkill ss-local # nohup ss-local -c ~/.shadowsocks/config.json >> ~/.shadowsocks/log.txt 2>&1 & pkill trojan nohup ~/Misc/trojan/trojan ~/Misc/trojan/config.json >> ~/Misc/trojan/log.txt 2>&1 & set -xU no_proxy "localhost,127.0.0.1,localaddress,.localdomain.com" set -xU http_proxy "http://127.0.0.1:8118" # 6666 for v2ray_http, 8118 for privoxy set -xU https_proxy "http://127.0.0.1:8118" npm config set proxy=http://127.0.0.1:8118 # git config --global http.proxy http://127.0.0.1:8118 git config --global https.proxy socks5://127.0.0.1:1080 # 2333 for v2ray_socks5, 1080 for ss/trojan sock5 git config --global http.proxy socks5://127.0.0.1:1080 # 2333 for v2ray_socks5, 1080 for ss/trojan sock5 echo -e "proxy up!" end
~/.config/fish/functions/down_proxy.fish
function down_proxy # sudo service v2ray stop # sudo service privoxy stop # pkill trojan set -xU no_proxy "" set -xU http_proxy "" set -xU https_proxy "" npm config delete proxy git config --global --unset http.proxy # keep sock5 running, for git config --global --unset https.proxy # keep sock5 running, for github ssh echo -e "proxy down!" end
/etc/apt/apt.conf
Acquire::http::proxy "http://127.0.0.1:8118/"; Acquire::https::proxy "https://127.0.0.1:8118/";
in case apt doesn't use conf sudo apt-get -c ~/.apt_proxy.conf update
git, https://gist.github.com/laispace/666dd7b27e9116faece6
HTTP git config --global http.proxy http://127.0.0.1:8118
socks5 git config --global http.proxy socks5://127.0.0.1:1080
SSH git@ -- ~/.ssh/config
Host github.com ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p # (For linux. Change to "ProxyCommand connect -S 127.0.0.1:1080 %h %p" for Windows.)
git config --global --unset http.https://github.com.proxy
squash
gfwlist
for provixy: https://www.igfw.net/archives/1178
GenPAC sudo pip install genpac pip install —-upgrade genpac genpac --pac-proxy "SOCKS5 127.0.0.1:<PORT>" --gfwlist-proxy="SOCKS5 127.0.0.1:<PORT>" --gfwlist-url=https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt --output="autoproxy.pac”
.tmux.conf
set -g prefix C-t set -g base-index 1 # 窗口编号从 1 开始计数 set -g display-panes-time 10000 # PREFIX-Q 显示编号的驻留时长,单位 ms set -g mouse on # 开启鼠标 set -g pane-base-index 1 # 窗格编号从 1 开始计数 set -g renumber-windows on # 关掉某个窗口后,编号重排 setw -g allow-rename off # 禁止活动进程修改窗口名 setw -g automatic-rename off # 禁止自动命名新窗口 setw -g mode-keys vi # 进入复制模式的时候使用 vi 键位(默认是 EMACS) # ----------------------------------------------------------------------------- # 使用插件 - via tpm # 1. 执行 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm # 2. 执行 tmux source ~/.tmux.conf # 3. 执行 bash ~/.tmux/plugins/tpm/bin/install_plugins # ----------------------------------------------------------------------------- setenv -g TMUX_PLUGIN_MANAGER_PATH '~/.tmux/plugins' # 推荐的插件(请去每个插件的仓库下读一读使用教程) set -g @plugin "arcticicestudio/nord-tmux" # set -g @plugin 'seebi/tmux-colors-solarized' set -g @plugin 'tmux-plugins/tmux-pain-control' set -g @plugin 'tmux-plugins/tmux-prefix-highlight' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-sensible' set -g @plugin 'tmux-plugins/tmux-yank' set -g @plugin 'tmux-plugins/tpm' # tmux-resurrect set -g @resurrect-dir '~/.tmux/resurrect' # tmux-prefix-highlight set -g status-right '#{prefix_highlight} #H | %a %Y-%m-%d %H:%M' set -g @prefix_highlight_show_copy_mode 'on' set -g @prefix_highlight_copy_mode_attr 'fg=white,bg=blue' # 初始化 TPM 插件管理器 (放在配置文件的最后) run '~/.tmux/plugins/tpm/tpm' # ----------------------------------------------------------------------------- # 结束 # -----------------------------------------------------------------------------
Ctrl+t
tmux [new -s 会话名 -n 窗口名]
Ctrl+t, $
Ctrl+t, ,
tmux at -t 0
tmux ls
tmux kill-session -t 会话名
Ctrl+t, d
Ctrl+t, q
Ctrl+t, %
Ctrl+t, x
Ctrl+t, & (kill window? but I think it's kill session...)
Ctrl+t, s or Ctrl+t, w: 列出所有会话/窗口 (会话>window)
Reverse proxy
ssh
内网 ssh -f -NT -R 7788:localhost:22 username@public_host
外网 ssh -p 7788 username@localhost
frp
server # frps.ini [common] bind_port = 7000
sudo cp frps /usr/local/bin/frps sudo cp frps.ini /usr/local/bin/frps.ini sudo chmod +x /usr/local/bin/frps
sudo vim /etc/init.d/frps
#!/bin/sh -e ### BEGIN INIT INFO # Provides: frps # Required-Start: $network $remote_fs $local_fs # Required-Stop: $network $remote_fs $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: autostartup of frp for Linux ### END INIT INFO NAME=frps DAEMON=/usr/local/bin/$NAME PIDFILE=/var/run/$NAME.pid [ -x "$DAEMON" ] || exit 0 case "$1" in start) if [ -f $PIDFILE ]; then echo "$NAME already running..." echo -e "\033[1;35mStart Fail\033[0m" else echo "Starting $NAME..." start-stop-daemon -S -p $PIDFILE -m -b -o -q -x $DAEMON -- "--c /usr/local/bin/frps.ini" || return 2 echo -e "\033[1;32mStart Success\033[0m" fi ;; stop) echo "Stoping $NAME..." start-stop-daemon -K -p $PIDFILE -s TERM -o -q || return 2 rm -rf $PIDFILE echo -e "\033[1;32mStop Success\033[0m" ;; restart) $0 stop && sleep 2 && $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0
sudo chmod 755 /etc/init.d/frps sudo /etc/init.d/frps start sudo /etc/init.d/frps stop sudo /etc/init.d/frps restart
cd /etc/init.dsudo update-rc.d frps defaults 90 sudo update-rc.d -f frps remove
client # frpc.ini [common] server_addr = x.x.x.x server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
sudo cp frpc /usr/local/bin/frpc sudo cp frpc.ini /usr/local/bin/frpc.ini sudo chmod +x /usr/local/bin/frpc
sudo vim /etc/init.d/frpc
#!/bin/sh -e ### BEGIN INIT INFO # Provides: frpc # Required-Start: $network $remote_fs $local_fs # Required-Stop: $network $remote_fs $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: autostartup of frp for Linux ### END INIT INFO NAME=frpc DAEMON=/usr/local/bin/$NAME PIDFILE=/var/run/$NAME.pid [ -x "$DAEMON" ] || exit 0 case "$1" in start) if [ -f $PIDFILE ]; then echo "$NAME already running..." echo -e "\033[1;35mStart Fail\033[0m" else echo "Starting $NAME..." start-stop-daemon -S -p $PIDFILE -m -b -o -q -x $DAEMON -- "--c /usr/local/bin/frpc.ini" || return 2 echo -e "\033[1;32mStart Success\033[0m" fi ;; stop) echo "Stoping $NAME..." start-stop-daemon -K -p $PIDFILE -s TERM -o -q || return 2 rm -rf $PIDFILE echo -e "\033[1;32mStop Success\033[0m" ;; restart) $0 stop && sleep 2 && $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0
sudo chmod 755 /etc/init.d/frpc sudo /etc/init.d/frpc start sudo /etc/init.d/frpc stop sudo /etc/init.d/frpc restart
cd /etc/init.dsudo update-rc.d frpc defaults 90 sudo update-rc.d -f frpc remove
ssh it ssh -oPort=6000 test@x.x.x.x
Git
tig
https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository
fork 同步原仓库,merge 原仓库到 fork 仓库
git remote add upstream https://github.com/whoever/whatever.git git fetch upstream git checkout master git rebase upstream/master
Commit Msg
Node 插件 validate-commit-msg
<type>(<scope>): <subject>
type:
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
perf
build
ci
revert
...
scope
commit 影响的范围
数据层、控制层、视图层等
简短描述
以动词开头
第一人称现在时,比如change,而不是 changed 或 changes
第一个字母小写
结尾不加句号
git-tips
emoji
speed up terminal github ssl:
--dry-run
to see the result of running it without actually running it
vim commit editor
git config --global core.editor vim
cleaning up old remote git branches (or --system
for system-wide) git config --global fetch.prune true
or per-repo hand-by-hand: git branch -r -d origin/devel git remote prune origin git fetch origin --prune git fetch --prune git config remote.origin.prune true
or per-repo config: git config remote.origin.prune true
delete submodule
https://gist.github.com/myusuf3/7f645819ded92bda6677
+ Delete the relevant section from the .gitmodules file. + Stage the .gitmodules changes git add .gitmodules + Delete the relevant section from .git/config. + Run git rm --cached path_to_submodule (no trailing slash). + Run rm -rf .git/modules/path_to_submodule (no trailing slash). + ~~Commit git commit -m "Removed submodule "~~ + ~~Delete the now untracked submodule files rm -rf path_to_submodule~~
completely delete submodule
https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule
0. mv a/submodule a/submodule_tmp 1. git submodule deinit -f -- a/submodule 2. rm -rf .git/modules/a/submodule 3. git rm -f a/submodule # Note: a/submodule (no trailing slash) # or, if you want to leave it in your working tree and have done step 0 3. git rm --cached a/submodule 3bis mv a/submodule_tmp a/submodule
grep -irl "some pathern" .
find . -name "filename"
locate "filename"
+ sudo updatedb
which "binfilename"
whereis "binfilename"
Cargo
~/.cargo/config
[source.crates-io] registry = "https://github.com/rust-lang/crates.io-index" replace-with = 'ustc' [source.ustc] registry = "git://mirrors.ustc.edu.cn/crates.io-index"
Misc
ag
tig
字符模式下交互查看git项目,可以替代git命令。
mycli
mysql客户端,支持语法高亮和命令补全,效果类似ipython,可以替代mysql命令。
Kubook
Current State of Surfaces
The default driver works fine for some, but not for others, to install the Marvell Driver, follow the instructions here
Open a Terminal and install Git via
Download the drivers from the Git repository, to do so, run: git clone git://git.marvell.com/mwifiex-firmware.git mkdir -p /lib/firmware/mrvl/ sudo cp mwifiex-firmware/mrvl/* /lib/firmware/mrvl/
disable power saving in Network Manager
. sudo sed -i 's/3/2/' /etc/NetworkManager/conf.d/* sudo service network-manager restart
kubuntu alt-space history
lockscreen wallpaper
/usr/share/sddm/themes/breeze
cross-platform
apt-cache search <keyword>
apt-cache search mingw
-ldflags '-linkmode "external" -extldflags "-static"'
sse, sse2, avx, avx512....
fdisk -l
/etc/fstab
/etc/grub.d/40_custom
/etc/default/grub
update-grub
power management
restart network interface
sudo /etc/init.d/networking restart
Restart networking (via systemctl): networking.service.
sudo service networking restart
?
go
$HOME/.profile
PATH
export PATH=$PATH:/usr/local/go/bin
GOPATH
export GOPATH=$HOME/Miscellaneous/go
source ~/.profile
powerline
apt install powerline
/usr/share/powerline/config_files/config.json
["shell"]["theme"] = "default_leftonly"
~/.bashrc
POWERLINE_SCRIPT=/usr/share/powerline/bindings/bash/powerline.sh if [ -f $POWERLINE_SCRIPT ]; then source $POWERLINE_SCRIPT fi
konsole-theme
Atom
Copy the themes from the konsole directory to $HOME/.config/konsole
(in some versions of KDE, the theme directory may be located at $HOME/.local/share/konsole
), restart Konsole and choose your new theme from the profile preferences window.
Check occupied ports sudo netstat -tulpn | grep LISTEN sudo lsof -i -P -n | grep LISTEN sudo nmap -sTU -O IP-address-Here
Kill process by port
Screen screen ... Ctrl_a + Ctrl_d screen -ls screen -r
nohup
nohup ... > xxx.log &
and press ENTER
nohup ... > xxx.log 2>&1 &
2>&1
edirects stderr to stdout
File Descriptor
0
: STDIN
1
: STDOUT
2
: STDERR
restart program
bash grep way keyw=myprog mycmd="echo 1" prepare () { mkdir -p ./log/ echo "Restart." } dosth () { prepare nohup $(echo $mycmd ) > ./log/$(date "+%Y%m%d_%H%M%S" ).log 2>&1 } while [ : ]do x=$(ps -ef | grep -v grep | grep -v sudo | grep $keyw | wc -l) if [ "$x " -lt 1 ] then dosth fi sleep 5s done
crontab
supervise
python SimpleHTTPServer python -m SimpleHTTPServer 8000
Ops
https://github.com/docker/awesome-compose
Container
Docker
docker build with proxy docker build . \ --build-arg "HTTP_PROXY=http://127.0.0.1:8118" \ --build-arg "HTTPS_PROXY=http://127.0.0.1:8118" \ --build-arg "NO_PROXY=localhost,127.0.0.1" \ --network host
docker run with proxy docker run.... \ --env "HTTP_PROXY=http://127.0.0.1:8118" \ --env "HTTPS_PROXY=http://127.0.0.1:8118" \ --env "NO_PROXY=localhost,127.0.0.1" \ --network host
VM is about emulation, Docker is about isolation.
Image
An image is an inert, immutable, file that's essentially a snapshot of a container.
An instance of an image is called a container.
commit vs build
docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。
难度
文档化
升级,维护
后续升级和维护麻烦,需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性
docker build 创建镜像需要编写 Dockerfile
本质上是运行一个镜像,然后在镜像中按序执行在 Dockerfile 中的命令
对 Linux 不熟悉的用户相对难,要求有一定的linux和脚本基础知识
文档化
Dockerfile 本身就是比较好的文档,可读和可理解性比较强
也可配合其他文档带来详细说明
升级,维护
后续升级和维护会相对简单,可以直接在dockerfile中更改并增加新特性
mount the folder on the host
docker run -it -v <HOST_FOLDER>:<CONTAINER_FOLDER> <IMAGE>
使用Docker部署MySQL
Docker compose
本地docker容器编排问题
批量创建和销毁容器
编写文件声明好要启动的容器,配置参数(镜像、启动命令、端口映射等)
Framework
Docker Swarm
解决多主机多个容器调度部署问题
基于docker平台实现的集群技术,通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。
swarm技术不成熟,很多配置功能都无法实现,半成品,目前更多的是使用Kubernetes来管理集群和调度容器。
Kubernetes
Mesos
Pinyin
在使用拼音了,因为觉得延迟和复制还是太麻烦?而且又省掉一个 chrome 标签页。
(安装 之后好像 kde 登录界面会变中文?待确认。有可能只能忍受。)
Rime
Rmie 不错的!
fcitx
安装 fcitx:
sudo apt install fcitx-bin sudo apt install fcitx-table
可能非必要:
sudo apt purge ibus sudo apt autoremove
下载: https://pinyin.sogou.com/ 并安装
或者使用 google-pinyin
sudo apt install fcitx-googlepinyin
重启。
需要 设一下 Imput Method。kubuntu Super 键 搜索 并调一下。好像也要 搜一下 fcitx configuration 然后加一下 sougou。
sogou/google 默认配置应该没问题
fcitx 的 preedit 好像会搞掉 sublime? 干掉它!
subl ~/.config/fcitx/config TriggerKey= UseExtraTriggerKeyOnlyWhenUseItToInactivate=False SwitchPreedit=CTRL_ALT_e SwitchKey=Custom CustomSwitchKey=CTRL_SPACE IMSwitchKey=False
使用 sogou pinyin 而不是 google 的主要原因应该是因为
首先)完全用 pinyin 输入法包括输入英文明显是不现实的,比如在 shell 中,那么就需要分开输入法。
然后)就算不管 shell 和浏览器,假设他们不需要经常需要输入法,i.e.,输入法可以保持,那么 sublime 中其实是经常需要切换输入法的,就算是在打 中文的时候,假设在 sublime 中用中文输入法打英文也没什么问题,但是 打代码呢?git呢?那么就需要经常切,就算假设平时是用英文多,那么万一是中文也要看一眼比较好,虽然说按下去就能知道是什么输入法了,可是看一眼浮动条再开始也不错啊。
汗我发现就算开始用了其实也不是这么一回事,我还是倾向于直接开始敲而不是看一眼。看一眼的心智负担多重啊,敲完shift一下多方便。
但是聊天什么的 sogou 其实更加方便?关键字什么的。主要是有云端加持。好吧。想想也对,打字是为了快,要快的话,现在还是搜狗的资源好。
为什么我觉得 苹果电脑 很坑爹
基于 BSD, 但命令参数和 Linux 不一致,导致脚本不兼容
键位