# 集群注册登录说明
集群登录账户通过[NASP Registry](https://git.nasp.fit/NASP/registry)仓库管理。

## 使用方法

集群的跳板机（`jump.nasp.fit:36022`）、实验机（g系列、c系列），均强制使用秘钥对的方法登录，不能通过密码登录。如果你没有现成的秘钥对，需要先创建一个。

你需要把**公钥**上传到仓库的`/authorized_keys/<your_user_name>/`目录下。路径中的用户名将成为你在实验机上的用户名，需要满足unix用户名标准，即：以小写字母开头，只能包含小写字母、数字、连字符和下划线。你可以用下面的命令测试你的用户名：

```bash
check_username() {
    if ( echo $1 | grep -qxE "^[a-z][-a-z0-9_]*\$" ); then
        echo "GOOD"
	else
        echo "BAD"
    fi
}
check_username "111"
# BAD
check_username "a111"
# GOOD
```

**注意：使用非法的用户名可能导致集群配置崩溃！**

`/authorized_keys/<your_user_name>/`目录下可以包含一个或多个文件，每个文件中可以包含一个或多个（由换行符分隔开的）公钥，可以按照你的喜好安置文件。

[NASP Registry](https://git.nasp.fit/NASP/registry)仓库的主分支（main）受到保护，用户无法直接向其推送更新。所以你需要：
- 如果你是新用户，先注册账号；
- 联系管理员，将用户名告诉管理员，激活你的账户，并把你加入NASP组织；
- 克隆仓库到本地，创建一个新的分支：`git clone https://git.nasp.fit/NASP/registry && cd registry && git checkout -b <your_branch_name> `
- 根据上面的指导，添加你的公钥；
- 在修改完成之后，提交修改，推送新分支到远端：`git add -A && git commit -m "add my key" && git push -u origin <your_branch_name>`
- 在网站上创建[合并请求（mr）](https://git.nasp.fit/NASP/registry/compare/main...main)，拉取从你的分支合并到主分支；可参考：[#41](https://git.nasp.fit/NASP/registry/pulls/41)
- 找到另一位在NASP组织内的同学，让其批准你的合并请求，如图：![](attachments/6386bc2c5a9d3dc7dc0c9ee5a4b67ed.png)
- 随后，你可以进行合并操作（创建压缩提交），并删除你的分支。

至多五分钟后，你就可以登录跳板机。跳板机的地址是`jump.nasp.fit`，用户名固定为`ssh`，端口号`36022`：

```bash
ssh -p 36022 ssh@jump.nasp.fit
```

随后，在跳板机上，你可以用你的用户名登录实验机（端口号`12022`）：

> 如果你没有使用SSH Agent，下面这条命令可能会认证失败，提示输入密码。原因是，实验机要求使用公私钥认证，但私钥存在你本地电脑上而不在跳板机上。使用SSH Agent，可以让你本机的私钥在跳板机上工作；否则，请跳过下面这条命令，直接使用`ProxyJump`选项。

```bash
ssh -p 12022 <your_user_name>@c1
```

通过配置ssh的`ProxyJump`选项，你可以将上两步操作合二为一，做到跳板机对用户透明：

```bash
# the same for scp/sftp
ssh -p 12022 -o ProxyJump=ssh@jump.nasp.fit:36022 <your_user_name>@c1
```

或者在`~/.ssh/config`里面配置：

```
Host c1
  HostName c1
  User <your_user_name>
  Port 12022
  ProxyJump ssh@jump.nasp.fit:36022
```

从而能够在vscode中远程连接。

### 疑难解答

如果遇到任何连接不上的问题，请加入`-v`选项查看日志：

```
# 检查到跳板机的连接性
ssh -v -i path/to/your/private_key -p 36022 ssh@jump.nasp.fit
# 检查到实验机的连接性
ssh -v -i path/to/your/private_key -p 12022 -o ProxyJump=ssh@jump.nasp.fit:36022 <your_user_name>@c1
```

如果你无法解决连接问题，请联系集群管理员协助。

## 目录结构

- `authorized_keys` 用户公钥
	- 若干以用户名命名的文件夹
		- 若干用户公钥文件
	- `authorized_keys` 历史遗留的公钥（将被移除）
- `scripts` 若干配置脚本
	- `jumpserver_cron.sh` 跳板机上的定时任务脚本
	- `jumpserver_deploy.sh` 跳板机部署脚本
	- `testbed_cron.sh` 实验机上的定时任务脚本
	- `testbed_deploy.sh` 实验机部署脚本
	- `nasp` nasp用户组的sudo配置
