Shawn's Blog

一个伪程序员的伪技术博客

0X00 前言

在这里介绍 Shell 脚本编程和日常的命令行操作中最常用的 9 个命令,希望对读到这篇文章的你有所帮助~

这是一篇基础得不能再基础的内容,如果你看完还能有两三个收获的话,那就一起来恶补 Linux 知识吧🤣

0X01 cat

cat 命令应该是学习 Linux 命令时候最早接触到的命令之一了,自然不用多说什么,这里只提一个用法:如何 cat 命令创建一个文件。例如在脚本中我们需要创建一个配置文件,当然可以把配置文件跟脚本文件放一起,然后 cp 过去,但是如果你想用一个文件搞定的话(这样在看脚本的时候就知道配置文件是什么内容了,看着舒服改起来也方便)就可以这么操作

1
2
3
4
5
cat << EOF > xxx.conf
[main]
var = 123
var = 123
EOF

这段命令写在 shell 脚本中就意味着会把两个 EOF 中间行的内容作为文件 cat 一下,再接上后面的重定向,就把它写入到 xxx.conf 中了。不仅可以在脚本中,直接写在命令行中也是可以的。当然也可以不带重定向使用。

这里有一篇阮一峰的文章在相对详细的介绍什么是 EOF。

需要注意的是 EOF 只是我们约定俗成的 Enf Of File 的缩写,你非要用别的表示也是可以的(比如你的文本中包含 EOF 的话就有必要改用别的)

0X02 echo

echo 命令用起来比 cat 还要更简单,只需要介绍三个简单的参数

  • echo -n 不输出尾部换行符
  • echo -e 启用反斜杠转义
  • echo -E 禁用反斜杠转义(Debian 默认是禁用的)

0X03 printf

printf 是一个类似于 echo 但是比 echo 用法更细致的命令,非常类似于 C 里面的 printf

1
2
3
4
5
printf "hello, world\n" # 会有转义
printf "%-10s" xxxxx # 会输出内容并且长度不足 10 的用空格填充,左对齐
printf "%10s" yyy # 同上,右对齐
printf "%-4.2f" 12.345 # 与 C 的用法一致
printf "%4d" 12 # 与 C 的用法一致
阅读全文 »

0X00 介绍

不管对 sudo 的了解具体有多少,至少应该都用过 sudo 命令来临时将自己的非 root 用户提权至 root 了吧。不过 sudo 当然不只是将用户变成 root 的这么一个简单工具了,虽然它确实是将用户临时变更为 root ,但是页还是有不少其他更加细致的配置与选项。

sudo 是 Linux 中的一个命令,用于以管理员身份执行命令。它允许普通用户在不切换到 root 用户的情况下执行需要特权的操作,从而提高了系统的安全性和可管理性。sudo 可以通过配置文件进行自定义,以控制哪些用户可以以何种方式执行哪些命令。同时,sudo 还可以记录用户的操作日志,以便系统管理员进行审计和监控。

还有一个需要注意的就是,sudo 本质上是一个应用,并非最基础系统的一部分,它比 Unix 晚诞生了有近 10 年。这也就意味着并不是所有的 Linux 发行版本都会自带这个程序(比如 minimal 模式安装的 Ubuntu Server 就是没有的),如果遇到这种情况还是需要自己手动安装一下,不过这种多人共用的操作系统中没有 sudo 的情况还是很罕见的。

0X01 修改配置

说在前面

sudo 的配置文件是 /etc/sudoer,虽然它是一个纯文本但是这里要提醒一下 不要使用任何文本编辑器直接打开并编辑这个文件。因为一旦这个文件被改出问题来了,那可就麻烦大了。在一个没有给 root 用户手动设置密码的操作系统中,用自己的用户把 sudo 的配置文件改崩了,这时候想再 sudo vim /etc/sudoer 的时候极有可能因为配置文件蹦了导致 sudo 不能正常工作,这也就意味着可能你甚至所有用户都永久失去了成为 root 的机会,任何需要 root 的操作就都没办法操作了。

那应该怎么改这个文件呢?答案是用 visudo 这个命令。不要慌,即使你不会用/用不好 vi 也没关系,这个工具的名字虽然带有 vi 但其实是根据你环境变量的 $EITOR 来决定的,你也可以用 EDITOR=/bin/nano visudo 来临时用 nano 进行编辑。

那用 visudo 有什么好处呢?主要是下面两点

  1. visudo 带锁,当有一个用户正在编辑配置文件的时候你用了这个命令,你就会被通知并且没有办法修改该配置文件,直到对方保存退出了你才可以打开文件进行编辑。这样一来保障了多人同时编辑带来的问题。
  2. visudo 有语法检查,也就是说每当你保存配置文件的时候都会进行一次基础的语法检查,防止该文件出现语法错误。如果单行配置写的不对,可能只会影响到对应的那行配置;但是如果语法有问题则会导致整个配置文件出错,问题就大了

最后关于如何编辑配置文件还有一个需要注意的是:使用 visudo 编辑配置文件后,保存并不会生效,要退出才会生效。这里可以注意观察一下,用 visudo 打开文件后直接保存,vi 的下面会提示将配置文件保存到 /etc/sudoers.tmp 了,只有当退出之后才会将配置写入到 /etc/sudoers

sudoers_config_file

一个 Linux 系统上的小 Tips:man命令不仅可以看某个命令的文档,输入 man /etc/sudoers 试试吧~

阅读全文 »

0X00 简单介绍

想必看到这篇博客的各位肯定会经常工作在 Terminal 中吧,而且对自己稍微好一些的人应该也都会配置一下自己的终端环境,比较常见的就是 Linux 下装个 terminator 或者 macOS 下装一个 iTerm2 这种软件,然后再用 zsh 配合不同的主题和插件完善自己的体验。而且真正用过一段时间终端的人肯定都会有那种一个窗口不够用的情况,那么你可能要用到终端模拟器(terminator/iTerm2)的 tab 功能了,每次都额外开一个新 tab 出来,或者上下左右开始分屏了。

一切都很顺利,直到你开始频繁的连接到远端的服务器上去,然后发现自己习以为常的分屏和 tab 全都没有了,每次想再开一个远端的 shell 时都需要在本地开一个分屏然后重新 ssh 重新输密码,需要 sudo 的话还可能需要再重复一下密码。一次两次还好,次数多了肯定就麻了,这时候就是 tmux 大展身手的时候了~

tmux 本身是一个终端复用器,可以做到的功能包括终端横向纵向的分屏、多 tab 切换等等。

0X01 基本用法

要用 tmux 首先要有 tmux 才行(废话文学),有些 Linux 发行版本预装了的,如果没有的话用对应的软件包管理器装一下就行了,非常小且没什么依赖。

在使用之前先要区分一下 tmux 中 Server/Session/Window/Pane 这四个比较重要的概念:

  • Server 服务,是最上级的,是整个 tmux 的后台服务,一般很少会直接操作它
  • Session 会话,是我们在终端敲下 tmux 之后随之启动的东西,类似于其他终端模拟器的一个窗口
  • Window 工作区,默认情况下新建一个 Session 就会带有一个 Window,类似于其他终端模拟器的 tab,也就是说一个 Session 可以创建很多个 Window
  • Pane 就是最小一级了,默认情况下一个 Window 就会带有一个 Pane,也就是说一个 Window 下面可以选择左右上下分很多个 Pane,类似下面这张图(这个是我自己配置过的,跟原生配置不同但是概念是一致的)

SCR-20230517-txv

图里看到的是一个 Session,我在其中创建了 4 个 window 并且在 window 4 上创建了 3 个 pane

然后打开自己的终端,输入 tmux 并回车就可以了,看起来和刚刚没什么区别。现在对着这个平平无奇的终端开始介绍一下具体的用法。

tmux 本身有非常多的快捷键,使用这些快捷键的前提是「进入 tmux 的命令模式」,默认按键是 <Ctrl> + B ,熟悉 vim 的人可能比较容易理解。因为默认配置下进入命令模式之后界面上并没有什么提示,所以不放心的话可以先敲两次 ESC 回到普通模式再按触发键。

要搞成上面我截图的这种(指的是用法不是外观)是很简单的,首先我们先按快捷键 <Ctrl> + B 进入命令模式,然后再按 b 就可以创建一个新的 window 了,连续创建 3 个之后大概会长成这样(截图是一个没有经过配置的 tmux 的样子)

SCR-20230517-u9t

可以看到下面有四个 window 了,其中打了星号的就是当前正在操作的 window。想切换不同的 window 的话就是命令模式下直接输入数字即可。

SCR-20230517-ufn

接下来在当前 window 下进行分屏,命令模式下 " 是左右分屏,% 是上下分屏。在一个 window 下有多个 pane 的时候可以使用命令模式下的方向键在多个 pane 之间切换,存在光标的就是当前正在激活的 pane(通过绿颜色的边框同样可以快速找到当前正在激活状态的 pane)。

0X02 修改配置

「新安装一个软件之后第一件事不是开始用,而是先点开设置看看有什么好玩的东西」的人应该不止我一个喔。

tmux 的配置文件是 ~/.tmux.conf (其实还有其他会影响全局的,但是不建议改它所以这里并不打算告诉你),这里贴下我自己的一部分配置并在注释里简要说明一下,仅供参考。

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
# bind new prefix  修改前缀按键(也就是命令快捷键)
unbind-key C-b # 取消绑定 Ctrl + b
set-option -g prefix C-f # 绑定 Ctrl + f
bind-key C-f send-prefix

# using vi mode
setw -g mode-keys vi # 使用 vi 模式
bind-key -T copy-mode-vi 'v' send -X begin-selection # vi 模式下的粘贴
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle
bind-key -T copy-mode-vi 'y' send -X copy-selection # vi 模式下的复制

# plugins # 一些插件,可以在 GitHub 上找到详细介绍
set -g @plugin 'tmux-plugins/tpm' # 插件管理器
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'tmux-plugins/tmux-yank'

# status bar # 截图下方右侧的状态栏
set -g status-style bg='black',fg='white'
set -g status-interval 1
set -g status-left '#{?client_prefix,,}'
set -g status-right '#[bg=default]#[fg=default]#(date "+%R ")#[bg=black]#[fg=brightgreen]#[bg=brightgreen]#[fg=black]Shawn#[bg=brightgreen]#[fg=black]' # 字体原因可能现实不全,但是可供参考

# window bar # 截图下方左侧的 window bar
set -g window-status-current-format "#[bg=brightgreen]#[fg=black]#[bg=brightgreen]#[fg=black]#I:#W#[bg=black]#[fg=brightgreen]" # 同上字体原因
set -g window-status-format "#[bg=default]#[fg=default]#I:#W"

# pane border # pane 之间的分割线配置
set -g pane-border-style fg='gray'
set -g pane-active-border-style fg='brightgreen'

# window and pane index # 违背祖宗之法的从 1 开始编号
set -g base-index 1
set -g pane-base-index 1


# hotkeys # 配置一些快捷键
bind h select-pane -L # 继承自 vim 的 h 为切换到左侧 pane
bind j select-pane -D # 同上继承自 vim
bind k select-pane -U # 同上继承自 vim
bind l select-pane -R # 同上继承自 vim
bind y resize-pane -L 5 # 选取 hjkl 上面四个按键,用于上下左右拉伸 pane
bind u resize-pane -D 5
bind i resize-pane -U 5
bind o resize-pane -R 5
bind r source-file ~/.tmux.conf \; display-message "Config reloaded.." # 修改配置文件后方便重载配置

set -g display-panes-time 3000
set-option -g mouse on # 启用鼠标操控

# split pane
unbind '"' # 弃用双引号分割
unbind % # 弃用百分号分割
bind - splitw -v -c '#{pane_current_path}' # 将 - 绑定为上下分屏(图像记忆,像是横着的一刀)
bind \\ splitw -h -c '#{pane_current_path}' # 将 \ 绑定为左右分屏(同上)


# run TmuxPluginManager 插件管理器
run '~/.tmux/plugins/tpm/tpm'

⚠️ tmux 就像 vim 一样,你当然可以在自己的电脑上疯狂配置,但是请牢记:首先不论如何都要记得默认配置下的基本用法,否则当你远程到服务器上的时候必定会一脸懵逼;其次千万不要修改服务器上的操作相关的配置,否则你的同事可能会提刀来见你☠️

0X03 命令速查

默认配置

系统指令:

  • ? 帮助文档
  • d 断开会话
  • D 选一个 session 断开
  • C-z 挂起当前 session
  • r reload 当前 session
  • s 显示 session 列表并切换
  • : 进入系统 shel
  • [ 进入复制模式,按 q 退出
  • ] 粘贴复制模式的文本window 指令
  • c 新建
  • & 关闭当前
  • 0~9 切换
  • p 上一个
  • n 下一个
  • w 打开列表用于切换
  • ‘ 重命名当前 window
  • . 修改当前编号
  • f 快速定位(匹配名称Pane 指令
  • ” 左右分屏
  • % 上下分屏
  • x 关闭当前 pane
  • z 临时全屏,再按恢复
  • ! 将 pane 挪出当前 window
  • ; 切换到上一个 pane
  • { 向前置换
  • } 向后置换
  • Alt + ↑↓←→ 调整当前 pane 边缘
  • t 显示时间
  • o 切换 pane
  • q 显示 pane 的 index,快速输入 index 可切换

0X04 更好的资料

是的没错,阮一峰大佬的文章当然比我写的更好很多很多倍😄

0X00 基本内容

你应该听人跟你说过类似于「你看 2333 这个端口在没在监听」这句话吧,也应该听过「我可以 ping 通所以肯定不是网络的问题」这种话吧。虽然听的多了,但实际上它漏洞百出。

首先我们都知道端口号是一个数字,从 0 到 65535 其中 0~2013 叫 well-known ports 知名端口,也就是说通常某个端口就固定给某个服务使用,比如你见到 22 就第一反应该是 ssh 而非 MySQL,见到 80 就知道是 HTTP 而非 smtp。也正是如此,在 Linux 中你自己开发的程序平时监听 8080 没啥问题,但是想监听 80 的时候就要校验你的 root 权限了。

其次要知道端口是 IP 地址上的,并非电脑上的。也就是说当你电脑同时拥有 192.168.2.123192.168.2.234 两个 IP 的时候,你可以启动两个 Nginx 分别监听他们的 80 端口。

最后要知道端口也是分类型的,即使是同一地址的统一端口也可以 tcp 和 udp 分开监听,也就是说你可以同时监听:

1
2
3
4
192.168.2.123:80 tcp
192.168.2.123:80 udp
192.168.2.234:80 tcp
192.168.2.234:80 udp

SCR-20230331-paqh

0X01 如何检查

通常来说有什么服务直接用就试了,不过有时候我们需要自底向上的检查问题,那么第一步就是检查服务端的监听是否正常,正常的话客户端的连通是否顺利。首先保证我们的 TCP 和 UDP 通信时正确的,再来排查上层的程序,否则可能你调了半天程序最终发现网络压根就没通。

ss 命令

首先介绍一下用 ss 命令(socket statistics)来查看自己机器上的端口开放情况,比较常见的用法是 ss -apnl

  • a 是所有 socket,包含了 tcp udp 的,也可以单独使用 t 或者 u 筛选
  • p 显示进程名和 PID 这些
  • n 不解析服务名,这样不仅速度更快而且也更便于筛选端口号
  • l 仅显示监听状态

SCR-20230331-ohke

nc 命令

这个 nc 命令一般会随系统附带,没有的话需要安装 netcat 软件包。它可以快速绑定一个地址和端口并进行监听,也可以快速向指定 ip 和端口发送数据。

1
2
3
4
5
6
7
8
9
10
11
# 监听 tcp 0.0.0.0 2333
nc -l 0.0.0.0 -p 2333

# 监听 udp 0.0.0.0 2333
nc -ul 0.0.0.0 -p 2333

# 向 tcp 127.0.0.1 2333 发内容
echo "hello, world" | nc 127.0.0.1 2333

# 向 udp 127.0.0.1 2333 发内容
echo "hello, world" | nc -u 127.0.0.1 2333

用法应该很好理解,其中 -l 是 Listen 也就是监听,-u 是指 UDP(默认情况下是 TCP)

好了,现在可以和以前那个只知道用 ping 来判断网络通不通的自己说再见了👋

0X00 介绍

奖杯系统这东西是从 PlayStation 上借鉴过来的,PlayStation 上每个游戏均会设置一些奖杯,当玩家达成奖杯对应条件的时候就会解锁该奖杯,从而给玩家的游玩过程以正反馈。XBox 上也有类似的成就系统,都是用来给玩家正反馈的。

我作为一个游戏玩家就很喜欢拿到奖杯的感觉,尤其是拿到了一个金杯、白金杯(虽然我还从来没拿过白金杯)然后看到只有百分之一的玩家得到了这个奖杯的时候。既然游戏制作人可以为游戏设置将被,那我们为什么不考虑把自己的人生作为一个游戏来给它设置一些奖杯呢~

在开始之前要说明一下人生奖杯系统是什么又不是什么:

  • 奖杯系统是成就系统,不是代办清单
  • 奖杯系统是自我激励和正向反馈的,不是用来给自己压力的
  • 奖杯系统是非常个人化的,不是有最佳实践的

0X01 我的奖杯系统

奖杯系统

先来给大家介绍一下我自己的奖杯系统,它是用 Notion 的数据库功能制作的。细心的朋友可以看出来我整个 Notion 都是「游戏化」的,工作区叫做「地球Online」,核心页叫「初始台地」,专业技能的笔记叫「主修技能」,一些其他的非专业技能笔记叫做「辅修技能」,还有武功秘籍之类的东西。

不要问我为啥我一个奖杯都没拿到,这不是为了截图公开出来就把完成了的放在后面了嘛~

我的奖杯系统算是比较简单的,目前只设置了:名字、描述、难度、日期和图片五个字段。

  • 其中「名字」是尽可能参照之前玩过的游戏奖杯风格去设计的。我觉得用「永不消失的电波」作为奖杯名比「通过无线电考试」感觉更酷一点~
  • 「描述」则是对成就的具体描述,说清楚了如何才能拿到这个奖杯。比如光看「好机车噢」可能并不能知道怎么才能拿到,所以需要一个描述的稍微详细一些的字段
  • 「难度」就很好理解了,我是把它分成了:青铜、白银、黄金、白金、梦幻五个档次。其中铜杯是稍稍努力就能轻松拿到的,银杯是七八成努力就稳稳能拿到的,金杯是全力输出后大概率可以拿到的,白金杯是全力输出后拿到奖杯的概率也并不很高的,梦幻则是全力输出也大概率拿不到的(比如我奖杯系统中的买一套 130+ 平米的房子😭)
  • 「时间」和「图片」最好理解,就是拿到这个奖杯的时间和记录性质的一张照片或者截图。

0X02 你的奖杯系统

介绍完了我的奖杯系统该看看如何创建你的奖杯系统了~

首先选择一个工具,比如 Notion、Excel、滴答清单、甚至最朴素的纸笔都是可以的。如果打算创建一个我这类的奖杯系统建议选择对表格支持的比较好的软件。

其次就该规划字段了,看看每个奖杯都有一些什么属性。通常来说:名字、描述、难度、加入时间、完成时间、奖励点、照片、感受、备注等等这种字段都可以加,完全看自己觉得需要些什么东西。

  • 「名字」最好短一些,与奖杯内容关联强一些,有趣一些就更好了
  • 「描述」也是精简一些,说清楚究竟完成了什么事情就能拿到这个奖杯即可
  • 「难度」则可以从三档到五档分一分,当然你想用 0~100 的数字来精细化管理也是可以的
  • 「奖励点」是我一直想设置,但最终因为麻烦放弃的。如果要设置的话,可以根据每个奖杯的具体难度设置一些奖励点,例如「通过英语四级考试 – 3点」、「通过英语六级考试 – 5」、「首次跑完一场半马 – 3」、「首次跑完一场全马 – 5」这样,然后再给这些奖励点一个倍数比如 100。这样当你完成半马之后就获得了 3 * 100 = 300 元的奖励资金,可以买个自己喜欢的东西来奖励自己~当然也可以针对性的对每一个奖杯设置一个奖励,比如「跑完一场半马 – 奖励自己一双xxx跑鞋」或者「自己的照片被XX杂志选中 – 奖励自己一颗新镜头」

好了现在奖杯系统设置好了,就差内容填充了。那么 什么样的事情适合作为奖杯加入其中呢? 其实原则上小到「连续一周不迟到」,大到「三小时速登珠峰」都是可以的。但是如果太多极低难度奖杯的话,拿到奖杯的成就感会大打折扣,难度太高的话又会导致三两年也拿不到一个,最后都是让这个奖杯系统废掉。所以我认为比较合理的就是从「稍稍努力就能完成」到「全力以赴才有一点点可能」的这个范围内的事情,从简单到困难数量递减分布,这样每隔一段时间都会拿到一个奖杯有正向反馈,也会有高难度奖杯在吊着你让你更努力的生活去完成它。

那么现在你的奖杯系统已经准备好了,可以开始尽情的填充内容了~

0%