Linux使用笔记

在公司的开发环境是一台Win10机器,我喜欢生产环境稳定可以长期不关机,所以拿了一台公司的电脑重装了Ubuntu部署生产环境。

怎么番茄

现在用的机场服务是CNIX

订阅软件,Windows首推Clash for Win; macOS平台首推clash X。

Git代理

代理是SS/SSR的话可以用socks5,下面两种方法本质上一样

1
2
3
# 鼠标停留在状态栏的小火箭上会显示端口
git config --global http.proxy 'socks5://127.0.0.1:7890'
git config --global https.proxy 'socks5://127.0.0.1:7890'

也可以直接编辑文件

1
2
3
vim ~/.gitconfig
# [http]
# proxy = http://<主机ip>:<7890>

npm淘宝源

npm install在ssr设置了全局代理的情况下还是会下载卡死,npm config配置代理实测并不能解决问题。可以配置淘宝源结局,如果 已经设置了代理要npm config edit把代理相关的行删掉,再

1
npm config set registry http://registry.npm.taobao.org

Linux虚拟机

以前用过VirtualBox和Mac的Parallel Desktop,总体来说Parallel Desktop的体验要好一些,毕竟收费,但还是存在一些比较烦人的 bug。这次尝新了VMware Workstation。VMware也是付费程序,但由于不重视保护版权,激活码在网上很多,商用的话还是要支持正版。

用VMware在Windows下安装Ubuntu的手把手教程

配置虚拟机的代理

  • 假设主机上番茄软件用的是Clash for win,General > 勾选Allow LAN(允许局域网的连接),记录下Port端口(默认7890)
  • 切换到Ubuntu,Settings>Network,Network Proxy设置为Manual
  • 四个选项都设置为<主机ip>:7890

VMware的网络模式最好是桥接模式,不推荐用NAT模式,虚拟机上的web服务会没办法广播到全局域网,给同事demo东西会不方便。桥接 模式下,虚拟机和主机是并列关系,有自己的独立ip。但估计是权限的原因虚拟机虽然可以上网但是不能独立配置代理,只能通过主机 的LAN连接走主机的代理。

配置apt-get使用代理

1
sudo vim /etc/apt/apt.conf

内容为Acquire::http::proxy "http://<主机ip>:7890"

在Win和Linux之间共享文件

出于安全考虑,VMware默认是打开文件共享,关机后在虚拟机设置菜单打开,选择主机上需要共享的目录。这里有个bug,重启虚拟机 会导致虚拟机丢失共享的路径,需要再次手动锚定。

把这一段放在你的.bashrc或者.zshrc

1
alias mount='/usr/bin/vmhgfs-fuse .host:/ /home/yangrq/share -o subtype=vmhgfs-fuse,allow_other'

每次重启在shell里运行mount

##远程办公 公司配了蒲公英的内网穿透服务,其实就是个各个大学都有的校园网vpn服务。下载蒲公英的客户端(全平台都有,包括ios),挂上代 理,可以访问内网上的共享文件,web服务,或者远程桌面。远程桌面的软件可以用微软自己的Remote Desktop,或者蒲公英的产品向日葵。

后来去了九坤之后,发现大公司用的是完全不一样的一套东西。出于合规方面的原因,投研部门的所有代码的开发和部署都在公司的 服务器上进行,服务器不允许和个人电脑传输任何数,需要通过堡垒机ssh到服务器上进行工作。

对于数据库架设在局域网内的环境,有这个内网穿透在家可以持续开发调试,还是很方便的。

Oracle数据库

因为现在写的东西可视化用的是eCharts(Python封装调用)+ Flask的组合,prototype当然要用一个开发足够快的数据库, 选了non-SQL的数据库mongoDB,第一次使用非关系数据库,不过很好上手,eCharts本体又是个JS写的库(百度程序员很猛), 这一套前后端交互用起来省不少心。

等IT把Oracle数据库弄好,转债和股票的数据就上生产环境了。以前在工行实习的时候,学了python怎么开发Oracle数据库。Oracle 那套东西体型太臃肿,80%的东西都是BAT这种体量的公司才用得上的。感谢我坑的DBM课,SQL还是会写一点的😤。

  1. 图形化工具

我推荐DBeaver,这是一个universal database manager,社区版本是免费的,可以连接所有支持jdbc接口的数据库。除了需要知道 数据库的host, schema (username), password, service之外,还需要一个跟数据库版本对应的ojdbc包,我们公司的数据库是 Oracle 11g,要用ojdbc6.jar,用更高级的会兼容不了。

  1. python driver

cx_Oracle是Oracle的python封装借口,除了pip install cx_Oracle外呢,你还要在电脑上安装Oracle Instant Client(除非你的数 据库是在自己电脑上),商用数据库就是这么事儿妈。不同系统的安装方法有所不同,参考Oracle。下载之后要让python能找到这个客户端,对于泛UNIX系统来说,在系统$PATH上建立软symlink是最方便的

1
2
ln -s ~/instantclient_19_3/libclntsh.dylib /usr/local/lib
ln -s ~/instantclient_19_3/libclntsh.dylib.12.1 /usr/local/lib

Elastic && Kibana

经常性出现Kibana的docker服务挂掉的情况

检查es的index健康

1
curl -XGET 'http://10.168.1.185:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason'

如果看到有kibana_task_manager的primary shard处于unassigned状态,那就是es的分片挂掉导致kibana无法启动了。

解释shard未分配的原因

1
curl -XGET 'http://10.168.1.185:9200/_cluster/allocation/explain?pretty' -H 'Content-Type:application/json' -d'{"index": ".kibana_task_manager_7.15.2_001", "shard": 0, "primary":true}'

提到文件损坏,hash无法匹配问题。

使用es的命令行工具删除损坏的数据

1
bin/elasticsearch-shard remove-corrupted-data

使用这种方法可能会遇到需要停止集群才能移除损毁数据的警告,笔者还没发现解决办法。

或者使用RESUTful API删除index

1
curl -XDELETE  'http://<elastic>:9200/.kibana_task_manager_7.15.2_001'

curl可能不会返回,但是稍等一下Ctrl+C终端即可,损坏的index会被删除,然后Kibana就可以继续用了,不需要重启容器。

重新启动Kibana容器

SSH使用私钥免密码登录

  1. 如果SSH from的机器上还没有生成RSA私钥,使用SSH工具生成一对公钥私钥,

    1
    ssh-keygen -t rsa

    生成一对密钥(公钥和私钥)到~/.ssh/目录下

  2. 复制公钥到SSH to机器上

    1
    cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> .ssh/authorized_key'

    然后就可以直接使用ssh命令登录了,不需要输入密码。

NGINX websocket 域名反向代理

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
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
server_name emby.xuanlingasset.com;
listen 443 ssl;
ssl on;
ssl_certificate /home/xlc1/ca/site/site.crt;
ssl_certificate_key /home/xlc1/ca/site/site.key;

location / {
proxy_pass http://localhost:8096;
proxy_http_version 1.1;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_read_timeout 300s;
proxy_send_timeout 300s;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

关键是

1
2
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

使用了map指令,自动根据客户端请求是否有Upgrade头来判断是否要传递Connection头,这样比全部传递upgrade要优雅.

修改之后重启nginx,服务器返回的响应头为

1
2
3
4
5
6
HTTP/1.1 101 Switching Protocols
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 15 Dec 2021 14:29:29 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: eFA5kG7ymK/WCHSre7godV54+2Y=

解压.tar.gz文件

.tar.gz是Linux系统上很常见的压缩文件格式,很多以二进制形式发行的软件下载下来是*.tar.gz的形式

tar -xvf abc.tar.gz

简单来说,压缩文件

tar -czvf abc.tar.gz folder/

解压文件

tar -xzvf abc.tar.gz

参数:

  • -x extract解压
  • -c create压缩
  • -z filter through gzip, i.e. compress or decompress with gunzip
  • -v verbose mode, e.g. print file names while decompressing
  • -f specify archive file name
  • -t list the contents of an archive

cURL Get以GBK格式编码的网页

在从深交所网站爬取ETF基金申赎清单的过程中,遇到了一点问题。运行Go程序从地址请求一个文本文件 (内容是基金159918的申赎成分),返现返回内容是403 Forbidden,但是用curl命令可以。

curl -XGET http://reportdocs.static.szse.cn/files/text/etf/ETF15991820220527.txt

返回的结果是乱码,很容易判断是因为该文本文件是以GBK格式编码的。在如今的绝大部分金融机构都是使用这样一个古怪的编码,而不是拥抱更现代化的UTF-8。那么如何显示正确的内容呢,可惜的是,curl本身并不支持配置网页返回的编码格式,但是可以用Linux的iconv命令,用pipeline的形式处理curl的输出

curl -XGET http://reportdocs.static.szse.cn/files/text/etf/ETF15991820220527.txt | iconv -f gbk -t utf8

iconv命令的-f参数是from_code,指输入字符串的编码格式,-t是输出编码格式,绝大多数的命令行环境都是标准的utf-8编码,所以输出指定为-t utf-8

显示磁盘占用情况,和计算文件夹体积

du -sh * 列出当前路径下的每个文件夹/

TMUX

tmux是Linux平台上一个常用的终端复用器,通过tmux命令创建的session,在ssh连接断开后仍然保持运行,在下次连接可以重新 回复的任意session。相对于裸连ssh,其优越性在于当由于网络不稳定或者超时连接断开时,正在运行的程序并不会中断丢失,这对于 需要很长时间的计算密集型程序或者Web Server类的程序,是十分重要的,毕竟谁也不想在服务器跑了几个小时的程序因为电脑休眠了 白跑了。

在使用TMUX之前,做一些必要的配置。TMUX的默认行为会有些古怪,比如鼠标滚轮不能上下滚动输出,快捷键CTRL+B的组合按起来对手 小的人十分不友好,还有分屏的快捷键居然是莫名其妙的%,而不是跟vim类似的-|键。

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
# 修改prefix为跨度更小的Alt+B
set-option -g prefix M-b
# 允许鼠标滚轮滚动输出
set -g mouse on

# 更合理的分屏
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %

# Smart pane switching with awareness of Vim splits.
# See: https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"

bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l

vim-tmux-navigator 的功能需要搭配vim插件使用,如果你的vim plugin manager是vim-plug,在vimrc中安装该插件 Plug 'christoomey/vim-tmux-navigator'。配合该插件,你可以使用一套快捷键,比如Ctrl + hjkl无缝地在vim的分屏和 tmux的分屏之间切换。

  • 列出session tmux ls
  • 新建session tmux new -s "session name"
  • 进入session tmux attach -t "session name"
  • 在session内,切换到其他session <prefix> s
  • 分屏,<prefix> - (水平), <prefix> | (垂直)
  • 在分屏时,对调pane,<prefix> Ctrl-o
  • 强制关闭当前session, <prefix> x
  • 重命名当前session, <prefix> $
  • 从水平分屏切换成垂直分屏,<prefix> <space> (cycle through available layouts)
  • 修改.tmux.conf之后重载配置 tmux source-file ~/.tmux.conf
  • 退出TMUX <prefix> d

在使用中,发现有事电脑自动休眠导致ssh断开后,tmux ls有几率出现报错,无法显示session也无法attach。原因可能是tmux的 socket被意外删除了。解决方法是

1
pkill -USR1 tmux

发送USR1信号给tmux进程,tmux会自动重新创建。

tmux + vim italics

我的vim使用的是类似Jetbrain家族IDE的darcula theme, 主题把编程语言中的如true/false之类的关键字使用斜体 (italic)高亮。该行为在terminal启动的vim是正常现实的,但是在tmux中启动的vim,高亮以背景颜色的反色显示,字体并非是 斜体。原因很显然是tmux无法支持显示斜体字体导致的。

tmux默认使用的screen terminal对斜体字符串的escape序列[3m[23m支持有问题,参考了原文 的解决方案。

1. 在终端
echo -e "\e[3mitalic\e[23m""]]"
检查能否正常显示斜体

2. 创建一个文本文件screen-256color.terminfo

1
2
3
4
5
6
7
8
9
10
11
12
13
# A screen-256color based TERMINFO that adds the escape sequences for italic.
#
# Install:
#
# tic screen-256color.terminfo
#
# Usage:
#
# export TERM=screen-256color
#
screen-256color|screen with 256 colors and italic,
sitm=\E[3m, ritm=\E[23m,
use=screen-256color,]]

执行 tic screen-256color.terminfo

  1. 编辑.vimrc,增加如下两行
    1
    2
    let &t_ZH="\e[3m"
    let &t_ZR="\e[23m"

编辑.tmux.conf,增加如下

1
set -g default-terminal "screen-256color"
  1. 启动tmux之前,需要设置环境变量,否则是无法生效的 $ env TERM=screen-256color tmux

可以把export TERM=screen-256color写入.zshrc中,避免每次使用tmux都要设置环境变量。 但这么操作有一个副作用就是会影响terminal本身,造成一些意想不到的效果。比如笔者在家用的电脑上设置TERM=screen-256color 之后,光标变回了cursor(一条竖线)而不是原本配置好的block形式。因为在操作vim的时候还是block样子的光标比较舒适,这个 副作用显然是不可接受的。

tmux命令设置一个别名即可

1
alias tmux="env TERM=screen-256color tmux"

Ubuntu 22.04 中文输入法(Pinyin)

IME: fcitx5 简繁切换, C+S+F, gui won’t work wiki-pinyin dictionary version rebuild should delete libfcitx5utils after building and replacing libIMEPinyin.so, or dependecies .so can’t be found after reboot

字典文件无法加载问题

dict files, patch libIMEPinyin.so to 1.1.4

资源监视器

btop

Git美化

lazygit

文件管理器

ranger