Shawn's Blog

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

0X00 header

首先,git 是没有 header 这个命令的:)

平时经常会用到一些 git 的用法,也有遇到过别人来问怎么实现某某操作,但是都太零散了并不成体系,所以这里就简单整理一下不做分类了。希望对不小心通过 Google 搜到该文章的你有所帮助(不会的有人能搜到吧🤣)

0X01 pull 与 pull –rebase

首先是搞清楚 git pullgit pull --rebase 的区别,我们学 git 第一天肯定就学了 git push 是推代码,git pull 是拉代码,那么这个 git pull --rebase 又是个什么东西呢?

git pull 本质上是 git fetch 加上 git merge 的功能,也就是说把代码拉到本地来再和本地代码进行一次 merge。这就意味着,如果出现冲突的话 git 会创建一个 Merge commit 来解决这个问题。

git pull --rebase 则是 git fetchgit rebase 的组合。使用的时候会先将本地比远端多出来的 commit 暂存起来,等将本地代码与远端代码同步后再将暂存的 commit 逐个应用。这样一来提交历史会更加整洁(因为没有额外的 Merge),但是需要注意的是使用 rebase 可能会造成 commit 历史发生变化。

吐槽一句,这个 rebase 被中文翻译成「变基」虽然确实合理,但真的好怪啊🤔

阅读全文 »

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 来判断网络通不通的自己说再见了👋

0%