给你的 SSH 登录加上 fastfetch

请看 VCR。

<del>水一篇 blog</del>

其实是不限于 fastfetch 的。想要定制你的 SSH 会话其实很简单。

“这个我知道!你是不是想说加到 .bashrc / .zshrc 里就好了!”

不是的。这样会导致你在桌面正常开启终端的时候也调用一次 fastfetch,这不是我们想要的,我们只想要在 SSH 会话时输出炫酷系统信息。我们接下来要用到的也不是 /etc/update-motd.d 这种东西(只有未开化的野蛮发行版才会有这种设置。说的就是你,Ubuntu)。实际上我们只需要用到 OpenSSH 的特性,这甚至不需要你是 sudoer。

罚你重读 ssh(1)

SSH(1) - General Commands Manual
1
2
3
4
5
6
7
FILES
...

~/.ssh/rc
Commands in this file are executed by ssh when the user
logs in, just before the user's shell (or command) is
started. See the sshd(8) manual page for more information.

很好,你找到了这一段,那么你已经完全明白接下来要干什么了。

~/.ssh/rc
1
2
3
#!/bin/sh

fastfetch

哦当然,记得检查一下 /etc/ssh/sshd_config,确保里面没有什么 PermitUserRC no 的设置…

这样就 OK 了!


这样就 OK 了…吗?

实际上是 OK 的,你也可以这么一直用下去,不会有什么问题。直到某一天,由于某些原因你突然需要 rsync 到你的服务器…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ rsync some_file.zip zfs:
Host key fingerprint is SHA256:UGFknAum2hVeX+R/GxXWvbA2OKye8UJw2Q/6kihrgTY
+--[ED25519 256]--+
| o*o .. oo|
| +++ .... +|
| +.+ o+.o o o|
| . oo.o.* = ..|
| o.. S o = o..|
| .E.. = . .o|
| . . . + * . |
| o . * o |
| ..o o |
+----[SHA256]-----+
protocol version mismatch -- is your shell clean?
(see the rsync manpage for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(626) [sender=3.3.0]

rsync 爆掉了。(或者如果你想要通过 ssh 进行 git clone,同样会炸掉。)

何意啊。在你百思不得其解之际突然想到,是不是你的 fastfetch 搞的鬼?试试从 ~/.ssh/rc 中注释掉那一行,发现还真是。这要怎么办?总不能在服务器上单独开一个 rsync server 吧?

聪明的小朋友说:“这个我知道!只要用 tty 判断一下就好了!像下面这样!”

1
2
3
if tty >/dev/null; then
fastfetch
fi

…很抱歉,放在 .bashrc / .zshrc 里是可以的,但这对于 ~/.ssh/rc 是行不通的。你大可试试在 ~/.ssh/rctty 的结果是怎样的。

~/.ssh/rc
1
2
3
4
#!/bin/sh

# fastfetch
tty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ssh zfs
Host key fingerprint is SHA256:UGFknAum2hVeX+R/GxXWvbA2OKye8UJw2Q/6kihrgTY
+--[ED25519 256]--+
| o*o .. oo|
| +++ .... +|
| +.+ o+.o o o|
| . oo.o.* = ..|
| o.. S o = o..|
| .E.. = . .o|
| . . . + * . |
| o . * o |
| ..o o |
+----[SHA256]-----+
Linux kali-zfs 6.8.11-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.8.11-1kali2 (2024-05-30) x86_64
Last login: Sat Aug 10 23:54:30 2024 from 100.118.63.98
not a tty

怎么就 not a tty 了,我 shell 呢?

这次罚你读 sshd(8)

SSHD(8) - System Manager's Manual
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
LOGIN PROCESS
When a user successfully logs in, sshd does the following:

1. If the login is on a tty, and no command has been speci‐
fied, prints last login time and /etc/motd (unless pre‐
vented in the configuration file or by ~/.hushlogin; see
the “FILES” section).

2. If the login is on a tty, records login time.

3. Checks /etc/nologin; if it exists, prints contents and
quits (unless root).

4. Changes to run with normal user privileges.

5. Sets up basic environment.

6. Reads the file ~/.ssh/environment, if it exists, and
users are allowed to change their environment. See the
PermitUserEnvironment option in sshd_config(5).

7. Changes to user's home directory.

8. If ~/.ssh/rc exists and the sshd_config(5) PermitUserRC
option is set, runs it; else if /etc/ssh/sshrc exists,
runs it; otherwise runs xauth(1). The “rc” files are
given the X11 authentication protocol and cookie in
standard input. See “SSHRC”, below.

9. Runs user's shell or command. All commands are run un‐
der the user's login shell as specified in the system
password database.

你看到,“Runs user’s shell or command” 位于第 9 条,而运行 ~/.ssh/rc 位于第 8 条。你又明白了,运行 ~/.ssh/rc 的并不是你的 shell,也就没有 tty 可言了。(实际上从最开头的那张图中也能看到,fastfetch 显示 shell 是 systemd,而不是我们所期望的 zsh 5.9。)

似乎陷入了死路。现在要怎么办呢?怎么能让 fastfetch 不和 rsync 打架呢?

很简单。罚你再重读 ssh(1)

SSH(1) - General Commands Manual
1
2
3
4
5
6
7
8
9
ENVIRONMENT
ssh will normally set the following environment variables:

...

SSH_TTY This is set to the name of the tty (path to
the device) associated with the current shell
or command. If the current session has no
tty, this variable is not set.

那么答案就呼之欲出了。

~/.ssh/rc
1
2
3
4
5
#!/bin/sh

if [ -n "$SSH_TTY" ]; then
fastfetch
fi

完成!现在你的炫酷上号广播也不会影响到 rsync 或其他一众基于 ssh 的工具(例如 git)了。

如果 fastfetch 就是你唯一要调用的东西,你甚至可以把它写进一行。

~/.ssh/rc
1
2
3
#!/bin/sh

[ -z "$SSH_TTY" ] || fastfetch

什么,你问我为什么不直接写成 [ -n "$SSH_TTY" ] && fastfetch 而要改用 -z?前者也可以,不过我能给出的理由是,使用 -n 会让这行命令在 SSH_TTY 没有设置的时候返回 1(思考一下这是为什么?),一般来说这不太好。改用 -z 就没有这个问题了,不论何种情况下这条命令都返回 0。


给你的 SSH 登录加上 fastfetch
https://heap.45gfg9.net/t/7a305569871e/
作者
45gfg9
发布于
2024-08-11
许可协议