Skip to content

Commit

Permalink
fix wrong index
Browse files Browse the repository at this point in the history
  • Loading branch information
pspdada committed Aug 14, 2024
1 parent ef9a2f7 commit f5df7de
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 39 deletions.
10 changes: 5 additions & 5 deletions _2020/command-line.md
Original file line number Diff line number Diff line change
Expand Up @@ -463,8 +463,8 @@ Host vm
LocalForward 9999 localhost:8888
```
1. 使用 `ssh-copy-id vm` 将您的 ssh 密钥拷贝到服务器。
2. 使用 `python -m http.server 8888` 在您的虚拟机中启动一个 Web 服务器并通过本机的 `http://localhost:9999` 访问虚拟机上的 Web 服务器
3. 使用 `sudo vim /etc/ssh/sshd_config` 编辑 SSH 服务器配置,通过修改 `PasswordAuthentication` 的值来禁用密码验证。通过修改 `PermitRootLogin` 的值来禁用 root 登录。然后使用 `sudo service sshd restart` 重启 `ssh` 服务器,然后重新尝试。
4. (附加题) 在虚拟机中安装 [`mosh`](https://mosh.org/) 并启动连接。然后断开服务器/虚拟机的网络适配器。mosh 可以恢复连接吗?
5. (附加题) 查看 `ssh``-N``-f` 选项的作用,找出在后台进行端口转发的命令是什么?
3. 使用 `ssh-copy-id vm` 将您的 ssh 密钥拷贝到服务器。
4. 使用 `python -m http.server 8888` 在您的虚拟机中启动一个 Web 服务器并通过本机的 `http://localhost:9999` 访问虚拟机上的 Web 服务器
5. 使用 `sudo vim /etc/ssh/sshd_config` 编辑 SSH 服务器配置,通过修改 `PasswordAuthentication` 的值来禁用密码验证。通过修改 `PermitRootLogin` 的值来禁用 root 登录。然后使用 `sudo service sshd restart` 重启 `ssh` 服务器,然后重新尝试。
6. (附加题) 在虚拟机中安装 [`mosh`](https://mosh.org/) 并启动连接。然后断开服务器/虚拟机的网络适配器。mosh 可以恢复连接吗?
7. (附加题) 查看 `ssh``-N``-f` 选项的作用,找出在后台进行端口转发的命令是什么?
20 changes: 10 additions & 10 deletions _2020/course-shell.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,24 +249,24 @@ $ echo 1 | sudo tee /sys/class/leds/input6::scrolllock/brightness
此外,我们没有为这些练习题提供答案。如果有任何困难,您可以发送邮件给我们并描述你已经做出的尝试,我们会设法帮您解答。


0. 本课程需要使用类 Unix shell,例如 Bash 或 ZSH。如果您在 Linux 或者 MacOS 上面完成本课程的练习,则不需要做任何特殊的操作。如果您使用的是 Windows,则您不应该使用 cmd 或是 Powershell;您可以使用 [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/) 或者是 Linux 虚拟机。使用 `echo $SHELL` 命令可以查看您的 shell 是否满足要求。如果打印结果为 `/bin/bash``/usr/bin/zsh` 则是可以的。
1.`/tmp` 下新建一个名为 `missing` 的文件夹。
2.`man` 查看程序 `touch` 的使用手册。
3.`touch``missing` 文件夹中新建一个叫 `semester` 的文件。
4. 将以下内容一行一行地写入 `semester` 文件:
1. 本课程需要使用类 Unix shell,例如 Bash 或 ZSH。如果您在 Linux 或者 MacOS 上面完成本课程的练习,则不需要做任何特殊的操作。如果您使用的是 Windows,则您不应该使用 cmd 或是 Powershell;您可以使用 [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/) 或者是 Linux 虚拟机。使用 `echo $SHELL` 命令可以查看您的 shell 是否满足要求。如果打印结果为 `/bin/bash``/usr/bin/zsh` 则是可以的。
2.`/tmp` 下新建一个名为 `missing` 的文件夹。
3.`man` 查看程序 `touch` 的使用手册。
4.`touch``missing` 文件夹中新建一个叫 `semester` 的文件。
5. 将以下内容一行一行地写入 `semester` 文件:
```
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
```
第一行可能有点棘手, `#` 在 Bash 中表示注释,而 `!` 即使被双引号(`"`)包裹也具有特殊的含义。
单引号(`'`)则不一样,此处利用这一点解决输入问题。更多信息请参考 [Bash quoting 手册](https://www.gnu.org/software/bash/manual/html_node/Quoting.html)
1. 尝试执行这个文件。例如,将该脚本的路径(`./semester`)输入到您的 shell 中并回车。如果程序无法执行,请使用 `ls` 命令来获取信息并理解其不能执行的原因。
2. 查看 `chmod` 的手册(例如,使用 `man chmod` 命令)
6. 尝试执行这个文件。例如,将该脚本的路径(`./semester`)输入到您的 shell 中并回车。如果程序无法执行,请使用 `ls` 命令来获取信息并理解其不能执行的原因。
7. 查看 `chmod` 的手册(例如,使用 `man chmod` 命令)
3. 使用 `chmod` 命令改变权限,使 `./semester` 能够成功执行,不要使用 `sh semester` 来执行该程序。您的 shell 是如何知晓这个文件需要使用 `sh` 来解析呢?更多信息请参考:[shebang](https://en.wikipedia.org/wiki/Shebang_(Unix))
8. 使用 `chmod` 命令改变权限,使 `./semester` 能够成功执行,不要使用 `sh semester` 来执行该程序。您的 shell 是如何知晓这个文件需要使用 `sh` 来解析呢?更多信息请参考:[shebang](https://en.wikipedia.org/wiki/Shebang_(Unix))
4. 使用 `|` 和 `>` ,将 `semester` 文件输出的最后更改日期信息,写入主目录下的 `last-modified.txt` 的文件中
9. 使用 `|` 和 `>` ,将 `semester` 文件输出的最后更改日期信息,写入主目录下的 `last-modified.txt` 的文件中
5. 写一段命令来从 `/sys` 中获取笔记本的电量信息,或者台式机 CPU 的温度。注意:macOS 并没有 sysfs,所以 Mac 用户可以跳过这一题。
10. 写一段命令来从 `/sys` 中获取笔记本的电量信息,或者台式机 CPU 的温度。注意:macOS 并没有 sysfs,所以 Mac 用户可以跳过这一题。
20 changes: 10 additions & 10 deletions _2020/editors.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,24 +378,24 @@ notebooks](https://github.com/lambdalisue/jupyter-vim-binding) 中用 Vim 快捷
1. 完成 `vimtutor`。备注:它在一个
[80x24](https://en.wikipedia.org/wiki/VT100)(80 列,24 行)
终端窗口看起来效果最好。
1. 下载我们提供的 [vimrc](/2020/files/vimrc),然后把它保存到 `~/.vimrc`。 通读这个注释详细的文件
2. 下载我们提供的 [vimrc](/2020/files/vimrc),然后把它保存到 `~/.vimrc`。 通读这个注释详细的文件
(用 Vim!), 然后观察 Vim 在这个新的设置下看起来和使用起来有哪些细微的区别。
1. 安装和配置一个插件:
3. 安装和配置一个插件:
[ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim).
1.`mkdir -p ~/.vim/pack/vendor/start` 创建插件文件夹
1. 下载这个插件: `cd ~/.vim/pack/vendor/start; git clone
2. 下载这个插件: `cd ~/.vim/pack/vendor/start; git clone
https://github.com/ctrlpvim/ctrlp.vim`
1. 阅读这个插件的
3. 阅读这个插件的
[文档](https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md)
尝试用 CtrlP 来在一个工程文件夹里定位一个文件,打开 Vim, 然后用 Vim 命令控制行开始
`:CtrlP`.
1. 自定义 CtrlP:添加
4. 自定义 CtrlP:添加
[configuration](https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md#basic-options)
到你的 `~/.vimrc` 来用按 Ctrl-P 打开 CtrlP
1. 练习使用 Vim, 在你自己的机器上重做 [演示](#demo)
1. 下个月用 Vim 完成 *所有的* 文件编辑。每当不够高效的时候,或者你感觉 “一定有一个更好的方式”时,
4. 练习使用 Vim, 在你自己的机器上重做 [演示](#demo)
5. 下个月用 Vim 完成 *所有的* 文件编辑。每当不够高效的时候,或者你感觉 “一定有一个更好的方式”时,
尝试求助搜索引擎,很有可能有一个更好的方式。如果你遇到难题,可以来我们的答疑时间或者给我们发邮件。
1. 在其他工具中设置 Vim 快捷键 (见上面的操作指南)。
1. 进一步自定义你的 `~/.vimrc` 和安装更多插件。
1. (高阶)用 Vim 宏将 XML 转换到 JSON ([例子文件](/2020/files/example-data.xml))。
6. 在其他工具中设置 Vim 快捷键 (见上面的操作指南)。
7. 进一步自定义你的 `~/.vimrc` 和安装更多插件。
8. (高阶)用 Vim 宏将 XML 转换到 JSON ([例子文件](/2020/files/example-data.xml))。
尝试着先完全自己做,但是在你卡住的时候可以查看上面 [](#macros) 章节。
12 changes: 7 additions & 5 deletions _2020/metaprogramming.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,12 @@ pdflatex paper.tex

# 课后练习
[习题解答]({{site.url}}/{{site.solution_url}}/{{page.solution.url}})
1. 大多数的 makefiles 都提供了 一个名为 `clean` 的构建目标,这并不是说我们会生成一个名为 `clean` 的文件,而是我们可以使用它清理文件,让 make 重新构建。您可以理解为它的作用是“撤销”所有构建步骤。在上面的 makefile 中为 `paper.pdf` 实现一个 `clean` 目标。您需要将构建目标设置为 [phony](https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)。您也许会发现 [`git ls-files`](https://git-scm.com/docs/git-ls-files) 子命令很有用。其他一些有用的 make 构建目标可以在 [这里](https://www.gnu.org/software/make/manual/html_node/Standard-Targets.html#Standard-Targets) 找到;
1. 大多数的 makefiles 都提供了 一个名为 `clean` 的构建目标,这并不是说我们会生成一个名为 `clean` 的文件,而是我们可以使用它清理文件,让 make 重新构建。您可以理解为它的作用是“撤销”所有构建步骤。在上面的 makefile 中为 `paper.pdf` 实现一个 `clean` 目标。您需要将构建目标设置为 [phony](https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)。您也许会发现 [`git ls-files`](https://git-scm.com/docs/git-ls-files) 子命令很有用。其他一些有用的 make 构建目标可以在 [这里](https://www.gnu.org/software/make/manual/html_node/Standard-Targets.html#Standard-Targets) 找到;

2. 指定版本要求的方法很多,让我们学习一下 [Rust 的构建系统](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html) 的依赖管理。大多数的包管理仓库都支持类似的语法。对于每种语法(尖号、波浪号、通配符、比较、多个版本要求),构建一种场景使其具有实际意义;
2. 指定版本要求的方法很多,让我们学习一下 [Rust 的构建系统](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html) 的依赖管理。大多数的包管理仓库都支持类似的语法。对于每种语法(尖号、波浪号、通配符、比较、多个版本要求),构建一种场景使其具有实际意义;

3. Git 可以作为一个简单的 CI 系统来使用,在任何 git 仓库中的 `.git/hooks` 目录中,您可以找到一些文件(当前处于未激活状态),它们的作用和脚本一样,当某些事件发生时便可以自动执行。请编写一个 [`pre-commit`](https://git-scm.com/docs/githooks#_pre_commit) 钩子,它会在提交前执行 `make paper.pdf` 并在出现构建失败的情况拒绝您的提交。这样做可以避免产生包含不可构建版本的提交信息;
4. 基于 [GitHub Pages](https://pages.github.com/) 创建任意一个可以自动发布的页面。添加一个 [GitHub Action](https://github.com/features/actions) 到该仓库,对仓库中的所有 shell 文件执行 `shellcheck`([方法之一](https://github.com/marketplace/actions/shellcheck));
5. [构建属于您的](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/building-actions) GitHub action,对仓库中所有的 `.md` 文件执行 [`proselint`](http://proselint.com/)[`write-good`](https://github.com/btford/write-good),在您的仓库中开启这一功能,提交一个包含错误的文件看看该功能是否生效。
3. Git 可以作为一个简单的 CI 系统来使用,在任何 git 仓库中的 `.git/hooks` 目录中,您可以找到一些文件(当前处于未激活状态),它们的作用和脚本一样,当某些事件发生时便可以自动执行。请编写一个 [`pre-commit`](https://git-scm.com/docs/githooks#_pre_commit) 钩子,它会在提交前执行 `make paper.pdf` 并在出现构建失败的情况拒绝您的提交。这样做可以避免产生包含不可构建版本的提交信息;

4. 基于 [GitHub Pages](https://pages.github.com/) 创建任意一个可以自动发布的页面。添加一个 [GitHub Action](https://github.com/features/actions) 到该仓库,对仓库中的所有 shell 文件执行 `shellcheck`([方法之一](https://github.com/marketplace/actions/shellcheck));

5. [构建属于您的](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/building-actions) GitHub action,对仓库中所有的 `.md` 文件执行 [`proselint`](http://proselint.com/)[`write-good`](https://github.com/btford/write-good),在您的仓库中开启这一功能,提交一个包含错误的文件看看该功能是否生效。
18 changes: 9 additions & 9 deletions _2020/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,17 +241,17 @@ security concepts, tips
1. ****
1. 假设一个密码是由四个小写的单词拼接组成,每个单词都是从一个含有 10 万单词的字典中随机选择,且每个单词选中的概率相同。
一个符合这样构造的例子是 `correcthorsebatterystaple`。这个密码有多少比特的熵?
1. 假设另一个密码是用八个随机的大小写字母或数字组成。一个符合这样构造的例子是 `rg8Ql34g`。这个密码又有多少比特的熵?
1. 哪一个密码更强?
1. 假设一个攻击者每秒可以尝试 1 万个密码,这个攻击者需要多久可以分别破解上述两个密码?
1. **密码散列函数**[Debian 镜像站](https://www.debian.org/CD/http-ftp/) 下载一个光盘映像(比如这个来自阿根廷镜像站的 [映像](http://debian.xfree.com.ar/debian-cd/10.2.0/amd64/iso-cd/debian-10.2.0-amd64-netinst.iso))。使用 `sha256sum` 命令对比下载映像的哈希值和官方 Debian 站公布的哈希值。如果你下载了上面的映像,官方公布的哈希值可以参考 [这个文件](https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA256SUMS)
1. **对称加密** 使用
2. 假设另一个密码是用八个随机的大小写字母或数字组成。一个符合这样构造的例子是 `rg8Ql34g`。这个密码又有多少比特的熵?
3. 哪一个密码更强?
4. 假设一个攻击者每秒可以尝试 1 万个密码,这个攻击者需要多久可以分别破解上述两个密码?
2. **密码散列函数**[Debian 镜像站](https://www.debian.org/CD/http-ftp/) 下载一个光盘映像(比如这个来自阿根廷镜像站的 [映像](http://debian.xfree.com.ar/debian-cd/10.2.0/amd64/iso-cd/debian-10.2.0-amd64-netinst.iso))。使用 `sha256sum` 命令对比下载映像的哈希值和官方 Debian 站公布的哈希值。如果你下载了上面的映像,官方公布的哈希值可以参考 [这个文件](https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA256SUMS)
3. **对称加密** 使用
[OpenSSL](https://www.openssl.org/) 的 AES 模式加密一个文件: `openssl aes-256-cbc -salt -in {源文件名} -out {加密文件名}`
使用 `cat` 或者 `hexdump` 对比源文件和加密的文件,再用 `openssl aes-256-cbc -d -in {加密文件名} -out
{解密文件名}` 命令解密刚刚加密的文件。最后使用` cmp`命令确认源文件和解密后的文件内容相同。
1. **非对称加密**
4. **非对称加密**
1. 在你自己的电脑上使用更安全的 [ED25519 算法](https://wiki.archlinux.org/index.php/SSH_keys#Ed25519) 生成一组[SSH
密钥对](https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2)。为了确保私钥不使用时的安全,一定使用密码加密你的私钥。
1. [配置 GPG](https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages)
1. 给 Anish 发送一封加密的电子邮件([Anish 的公钥](https://keybase.io/anish))。
1. 使用 `git commit -S` 命令签名一个 Git 提交,并使用 `git show --show-signature` 命令验证这个提交的签名。或者,使用 `git tag -s` 命令签名一个 Git 标签,并使用 `git tag -v` 命令验证标签的签名。
2. [配置 GPG](https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages)
3. 给 Anish 发送一封加密的电子邮件([Anish 的公钥](https://keybase.io/anish))。
4. 使用 `git commit -S` 命令签名一个 Git 提交,并使用 `git show --show-signature` 命令验证这个提交的签名。或者,使用 `git tag -s` 命令签名一个 Git 标签,并使用 `git tag -v` 命令验证标签的签名。

0 comments on commit f5df7de

Please sign in to comment.