一、课程概览与shell
1.ubuntu系统
2.在 /tmp
下新建一个名为 missing
的文件夹。
weasel@weasel-GNU:~$ cd /tmp
weasel@weasel-GNU:/tmp$ ls
在没有missing的文件夹,于是创建一个。
weasel@weasel-GNU:/tmp$ mkdir missing
weasel@weasel-GNU:/tmp$ ls
创建成功。
3.用 man
查看程序 touch
的使用手册。
touch - 改变文件时间戳,对于改变这个有什么具体作用我不是很理解,因为在windows系统下,对文件进行操作后,会出现最后一次的修改时间,大概是这样理解。
weasel@weasel-GNU:/tmp$ man touch
4.用 touch
在 missing
文件夹中新建一个叫 semester
的文件。
weasel@weasel-GNU:/tmp/missing$ touch semester
weasel@weasel-GNU:/tmp/missing$ ls
semester
5.将以下内容一行一行地写入 semester
文件:
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
weasel@weasel-GNU:/tmp/missing$ vim semester
weasel@weasel-GNU:/tmp/missing$ vi semester
这里发现vi和vim都能编辑文件,搜索得到vim是vi的升级版本,所以一般用vim就行。
6.尝试执行这个文件。例如,将该脚本的路径(./semester
)输入到您的shell中并回车。如果程序无法执行,请使用 ls
命令来获取信息并理解其不能执行的原因。
这里还不不明白为什么不能执行,ls也不太会用。
weasel@weasel-GNU:/tmp/missing$ ./semester
bash: ./semester: Permission denied
weasel@weasel-GNU:/tmp/missing$ ls
semester
weasel@weasel-GNU:/tmp/missing$ ls ./semester
./semester
weasel@weasel-GNU:/tmp/missing$ ls
semester
weasel@weasel-GNU:/tmp/missing$ man ls
weasel@weasel-GNU:/tmp/missing$ man ls
weasel@weasel-GNU:/tmp/missing$ cd semester
bash: cd: semester: Not a directory
weasel@weasel-GNU:/tmp/missing$ man ls
weasel@weasel-GNU:/tmp/missing$ ls semester
semester
weasel@weasel-GNU:/tmp/missing$ ls -a semester
semester
搜所到了ls -l是查看文件权限的
weasel@weasel-GNU:/tmp/missing$ ls -l semester
-rw-rw-r-- 1 weasel weasel 61 10月 19 16:10 semester
这里发现只有读写权限,没有执行权限。
weasel@weasel-GNU:/tmp/missing$ sudo ./semester
[sudo] password for weasel:
Sorry, try again.
[sudo] password for weasel:
sudo: ./semester: command not found
抖机灵sudo也没有用。
7.查看 chmod
的手册(例如,使用 man chmod
命令)
weasel@weasel-GNU:/tmp/missing$ man chmod
8.使用 chmod
命令改变权限,使 ./semester
能够成功执行,不要使用 sh semester
来执行该程序。您的 shell 是如何知晓这个文件需要使用 sh
来解析呢?更多信息请参考:shebang
777是111,111,111,获得可读可写可执行的权限(STFW得到)
weasel@weasel-GNU:/tmp/missing$ chmod 777 semester
9.使用 |
和 >
,将 semester
文件输出的最后更改日期信息,写入主目录下的 last-modified.txt
的文件中
卡了一小段时间的bug,主要是对|的用法不熟悉,多看了几个例子就好多了。
chmod 777 /home/weasel/last-modified.txt | stat -c '%y' ./semester > /home/weasel/last-modified.txt
weasel@weasel-GNU:/tmp/missing$ vim /home/weasel/last-modified.txt
weasel@weasel-GNU:/home$ cd weasel
weasel@weasel-GNU:~$ ls
brightness Documents hello2.txt last-modified.txt Pictures snap Videos
Desktop Downloads hello.txt Music Public Templates ysyx-workbench
weasel@weasel-GNU:~$ vim last-modified.txt
10.写一段命令来从 /sys
中获取笔记本的电量信息,或者台式机 CPU 的温度。注意:macOS 并没有 sysfs,所以 Mac 用户可以跳过这一题。
weasel@weasel-GNU:/sys/class/power_supply/BAT1$ cd /sys/class/power_supply/BAT1
weasel@weasel-GNU:/sys/class/power_supply/BAT1$ ls
alarm charge_now manufacturer status voltage_min_design
capacity current_now model_name subsystem voltage_now
capacity_level cycle_count power technology
charge_full device present type
charge_full_design hwmon2 serial_number uevent
weasel@weasel-GNU:/sys/class/power_supply/BAT1$ cd capacity
bash: cd: capacity: Not a directory
weasel@weasel-GNU:/sys/class/power_supply/BAT1$ vim capacity
二、Shell 工具和脚本
-
阅读 man ls ,然后使用
ls
命令进行如下操作:- 所有文件(包括隐藏文件)
weasel@weasel-GNU:~$ ls -a
- 文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954)
weasel@weasel-GNU:~$ ls -k
- 文件以最近访问顺序排序
- 以彩色文本显示输出结果
对于这个,我本来就有颜色,也不知道为啥。
典型输出如下:
-rw-r--r-- 1 user group 1.1M Jan 14 09:53 baz drwxr-xr-x 5 user group 160 Jan 14 09:53 . -rw-r--r-- 1 user group 514 Jan 14 06:42 bar -rw-r--r-- 1 user group 106M Jan 13 12:12 foo drwx------+ 47 user group 1.5K Jan 12 18:08 ..
- 所有文件(包括隐藏文件)
-
编写两个bash函数
marco
和polo
执行下面的操作。 每当你执行marco
时,当前的工作目录应当以某种形式保存,当执行polo
时,无论现在处在什么目录下,都应当cd
回到当时执行marco
的目录。 为了方便debug,你可以把代码写在单独的文件marco.sh
中,并通过source marco.sh
命令,(重新)加载函数。
这题不会做,对于shell还是非常不熟悉啊。STFW发现其实很简单的东西。
1 marco () { 2 export p=$(pwd); 3 echo "save . now: $(pwd)" 4 } 5 6 polo () { 7 cd $p; 8 } ~
-
假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。
#!/usr/bin/env bash n=$(( RANDOM % 100 )) if [[ n -eq 42 ]]; then echo "Something went wrong" >&2 echo "The error was using magic numbers" exit 1 fi echo "Everything went according to plan"
还是不会,还是看的答案做出来的,没做过这一类的文件调用类的,任重道远
脚本内代码1 count=1 2 3 while true 4 do 5 ./fault.sh 2>out.log 6 if [[ $? -ne 0 ]]; then 7 echo "failed after $count times" 8 cat out.log 9 break 10 fi 11 ((count++)) 12 13 done
调用代码,记得改读写权限!
weasel@weasel-GNU:~$ vim debug.sh weasel@weasel-GNU:~$ chmod 777 debug.sh weasel@weasel-GNU:~$ chmod 777 fault.sh weasel@weasel-GNU:~$ debug.sh debug.sh: command not found weasel@weasel-GNU:~$ ./debug.sh
-
本节课我们讲解的
find
命令中的-exec
参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar
则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如ls | xargs rm
会删除当前目录中的所有文件。您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看
xargs
的参数-d
,译注:MacOS 上的xargs
没有-d
,查看这个issue)如果您使用的是 MacOS,请注意默认的 BSD
find
与 GNU coreutils 中的是不一样的。你可以为find
添加-print0
选项,并为xargs
添加-0
选项。作为 Mac 用户,您需要注意 mac 系统自带的命令行工具和 GNU 中对应的工具是有区别的;如果你想使用 GNU 版本的工具,也可以使用 brew 来安装。
weasel@weasel-GNU:~$ mkdir html_root weasel@weasel-GNU:~$ ls bar Documents foo marco.sh Pictures snap Videos debug.sh Downloads html_root Music polo.sh Templates ysyx-workbench Desktop fault.sh last-modified.txt out.log Public test.sh weasel@weasel-GNU:~$ cd html_root weasel@weasel-GNU:~/html_root$ touch {1..10}.html weasel@weasel-GNU:~/html_root$ mkdir html weasel@weasel-GNU:~/html_root$ ls 10.html 1.html 2.html 3.html 4.html 5.html 6.html 7.html 8.html 9.html html weasel@weasel-GNU:~/html_root$ cd html weasel@weasel-GNU:~/html_root/html$ touch xxxx.html weasel@weasel-GNU:~/html_root/html$ cd .. weasel@weasel-GNU:~/html_root$ cd .. weasel@weasel-GNU:~$ ls bar Documents foo marco.sh Pictures snap Videos debug.sh Downloads html_root Music polo.sh Templates ysyx-workbench Desktop fault.sh last-modified.txt out.log Public test.sh weasel@weasel-GNU:~$ cd html_root weasel@weasel-GNU:~/html_root$ find . -type f -name "*.html" | xargs -d '\n' tar -cvzf ./1.html ./html/xxxx.html ./9.html ./3.html ./10.html ./4.html ./5.html ./7.html ./6.html ./8.html weasel@weasel-GNU:~/html_root$ ls 10.html 2.html 4.html 6.html 8.html html 1.html 3.html 5.html 7.html 9.html target.tar.gz
到这里就更不会了,但是看语法是能看懂的,主要是没有什么实操,导致无法理解这个题目的意思,他甚至要我自己做出工作环境,我只是个小镇做题家啊!
-
(进阶)编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
find . -type f -mmin -60 -print0 | xarges -0 ls -lt | head -10 -rw------- 1 weasel weasel 8182 10月 20 16:23 ./snap/firefox/common/.cache/mozilla/firefox/lonhgefi.default/cache2/entries/9DC2DEF2795EAB9E761E5C027FC0F413A2B958D7 -rw-r--r-- 1 weasel weasel 524288 10月 20 16:23 ./snap/firefox/common/.mozilla/firefox/lonhgefi.default/cookies.sqlite -rw-r--r-- 1 weasel weasel 557496 10月 20 16:23 ./snap/firefox/common/.mozilla/firefox/lonhgefi.default/cookies.sqlite-wal -rw------- 1 weasel weasel 11552 10月 20 16:23 ./snap/firefox/common/.cache/mozilla/firefox/lonhgefi.default/cache2/entries/A5DB932303D19F2AE3AF1F99935644BFC72C5E77 -rw------- 1 weasel weasel 10416 10月 20 16:23 ./snap/firefox/common/.cache/mozilla/firefox/lonhgefi.default/cache2/entries/BE6B4D87027F2649F914BAEC58624F21D0A7D6DC -rw------- 1 weasel weasel 11497 10月 20 16:23 ./snap/firefox/common/.cache/mozilla/firefox/lonhgefi.default/cache2/entries/5E7D595D221EB8623714FB2CEF2C2A3475EC3A7A -rw-r--r-- 1 weasel weasel 0 10月 20 16:23 ./snap/firefox/common/.mozilla/firefox/lonhgefi.default/storage/permanent/chrome/idb/2918063365piupsah.sqlite-wal -rw------- 1 weasel weasel 11458 10月 20 16:23 ./snap/firefox/common/.cache/mozilla/firefox/lonhgefi.default/cache2/entries/F558016D662B2B4703963EEB7E3CB748C233273A xargs: ls: terminated by signal 13
到这里还是只能借用别人的代码了,我对于shell还是非常不熟悉啊!加油!
三、编辑器(vim)
- 完成
vimtutor
。备注:它在一个 80x24(80 列,24 行) 终端窗口看起来效果最好。
vimtutor在暑假是已经完成了,现在对vim有一个基本的了解,但是使用的时候还是只会insert模式,并且还习惯上了用上下左右进行移动光标,这是非常不好的习惯,至少先熟悉用hjkl来移动光标。
- 下载我们提供的 vimrc,然后把它保存到
~/.vimrc
。 通读这个注释详细的文件 (用 Vim!), 然后观察 Vim 在这个新的设置下看起来和使用起来有哪些细微的区别。
对于这一点,暑假已经配置过了,前几天重装后也进行了配置,再换的话太浪费精力。 - 安装和配置一个插件: ctrlp.vim.
- 用
mkdir -p ~/.vim/pack/vendor/start
创建插件文件夹 - 下载这个插件:
cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
- 阅读这个插件的 文档。 尝试用 CtrlP 来在一个工程文件夹里定位一个文件,打开 Vim, 然后用 Vim 命令控制行开始
:CtrlP
. - 自定义 CtrlP:添加 configuration 到你的
~/.vimrc
来用按 Ctrl-P 打开 CtrlP
- 用
- 练习使用 Vim, 在你自己的机器上重做 演示。
- 下个月用 Vim 完成所有的文件编辑。每当不够高效的时候,或者你感觉 “一定有一个更好的方式”时, 尝试求助搜索引擎,很有可能有一个更好的方式。如果你遇到难题,可以来我们的答疑时间或者给我们发邮件。
- 在其他工具中设置 Vim 快捷键 (见上面的操作指南)。
- 进一步自定义你的
~/.vimrc
和安装更多插件。 - (高阶)用 Vim 宏将 XML 转换到 JSON (例子文件)。 尝试着先完全自己做,但是在你卡住的时候可以查看上面宏 章节。
这一节的习题先这样水过去,主要是vim的熟练使用。
四、数据清洗
- 学习一下这篇简短的 交互式正则表达式教程.
已学完,发现貌似有一些论坛的搜索也是符合正则表达式的,而百度大概是模糊匹配,有字对上就行。正则表达式还是很有用的。
正则表达式要匹配小括号时需要用[]圈起来,比如这样:“[(]”
也可以这样:"\("
- 统计words文件 (
/usr/share/dict/words
) 且不以's
结尾的单词个数。这些单词中,出现频率前三的末尾两个字母是什么?sed
的y
命令,或者tr
程序也许可以帮你解决大小写的问题。共存在多少种词尾两字母组合?还有一个很 有挑战性的问题:哪个组合从未出现过?
Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
我的正则表达十出来只有456个,标准答案是854个,优化后也没区别,其实有些看不大懂答案上的正则表达式。#我的 weasel@weasel-GNU:/usr/share/dict$ cat words | tr "[:upper:]" "[:lower:]" | grep -E "[b-z]+a[b-z]+a[b-z]+a[b-z]+" | grep -v "'s$" | wc -l 456 #答案 weasel@weasel-GNU:/usr/share/dict$ cat /usr/share/dict/words | tr "[:upper:]" "[:lower:]" | grep -E "^([^a]*a){3}.*$" | grep -v "'s$" | wc -l 854 #优化后 weasel@weasel-GNU:/usr/share/dict$ cat words | tr "[:upper:]" "[:lower:]" | grep -E "[b-z|B-Z]+[aA][b-z|B-Z]+[aA][b-z|B-Z]+[aA][b-z]+" | grep -v "'s$" | wc -l 456
-
进行原地替换听上去很有诱惑力,例如:
sed s/REGEX/SUBSTITUTION/ input.txt > input.txt
。但是这并不是一个明智的做法,为什么呢?还是说只有sed
是这样的? 查看man sed
来完成这个问题
显然,直接在原文件上进行替换会把原本的txt直接清楚,大概类似于先删除再创建一个同名文件的形式,这样本来的input.txt内的数据会消失,所以应该先备份文件。
而通过sed的直接修改文件内容能够在处理大文本时非常的便捷,比如100万行的文件需要在某一行加一些内容,使用sed会很方便。 - 找出您最近十次开机的开机时间平均数、中位数和最长时间。在Linux上需要用到
journalctl
,而在 macOS 上使用log show
。找到每次起到开始和结束时的时间戳。在Linux上类似这样操作:Logs begin at ...
和
systemd[577]: Startup finished in ...
在 macOS 上, 查找:
=== system boot:
和
Previous shutdown cause: 5
weasel@weasel-GNU:~$ cat starttime.txt | grep "systemd\[1\]" | sed -E "s/.*=\ (.*)s\.$/\1/"| sort | tail -n1 45.003 weasel@weasel-GNU:~$ cat starttime.txt | grep "systemd\[1\]" | sed -E "s/.*=\ (.*)s\.$/\1/"| sort -r | tail -n1 31.933 weasel@weasel-GNU:~$ cat starttime.txt | grep "systemd\[1\]" | sed -E "s/.*=\ (.*)s\.$/\1/"| paste -sd+ | bc -l | awk '{print $1/10}' 35.0499 weasel@weasel-GNU:~$ cat starttime.txt | grep "systemd\[1\]" | sed -E "s/.*=\ (.*)s\.$/\1/"| sort |paste -sd\ | awk '{print ($5+$6)/2}' 33.131
目前这里我只想跟着解答做了,我实在下不了手了,后面有需要再多学学相关的内容吧!
weasel@weasel-GNU:~$ cat starttime.txt | grep "systemd\[1\]" | sed -E "s/.*=\ (.*)s\.$/\1/"| sort | R -e 'd<-scan("stdin",quiet=TRUE);min(d);max(d);mean(d);median(d);' > d<-scan("stdin",quiet=TRUE);min(d);max(d);mean(d);median(d); [1] 31.933 [1] 45.003 [1] 35.0499 [1] 33.131
- 查看之前三次重启启动信息中不同的部分(参见
journalctl
的-b
选项)。将这一任务分为几个步骤,首先获取之前三次启动的启动日志,也许获取启动日志的命令就有合适的选项可以帮助您提取前三次启动的日志,亦或者您可以使用sed '0,/STRING/d'
来删除STRING
匹配到的字符串前面的全部内容。然后,过滤掉每次都不相同的部分,例如时间戳。下一步,重复记录输入行并对其计数(可以使用uniq
)。最后,删除所有出现过3次的内容(因为这些内容是三次启动日志中的重复部分)。
- 在网上找一个类似 这个 或者这个的数据集。或者从这里找一些。使用
curl
获取数据集并提取其中两列数据,如果您想要获取的是HTML数据,那么pup可能会更有帮助。对于JSON类型的数据,可以试试jq。请使用一条指令来找出其中一列的最大值和最小值,用另外一条指令计算两列之间差的总和。
五、命令行环境
任务控制
-
我们可以使用类似
ps aux | grep
这样的命令来获取任务的 pid ,然后您可以基于pid 来结束这些进程。但我们其实有更好的方法来做这件事。在终端中执行sleep 10000
这个任务。然后用Ctrl-Z
将其切换到后台并使用bg
来继续允许它。现在,使用 pgrep 来查找 pid 并使用 pkill 结束进程而不需要手动输入pid。(提示:: 使用-af
标记)。
weasel@weasel-GNU:~$ sleep 10000 ^Z [1]+ Stopped sleep 10000 weasel@weasel-GNU:~$ jobs [1]+ Stopped sleep 10000 weasel@weasel-GNU:~$ bg [1]+ sleep 10000 & weasel@weasel-GNU:~$ pgrep sleep 20606 weasel@weasel-GNU:~$ pkill -f sleep [1]+ Terminated sleep 10000
-
如果您希望某个进程结束后再开始另外一个进程, 应该如何实现呢?在这个练习中,我们使用
sleep 60 &
作为先执行的程序。一种方法是使用 wait 命令。尝试启动这个休眠命令,然后待其结束后再执行ls
命令。但是,如果我们在不同的 bash 会话中进行操作,则上述方法就不起作用了。因为
wait
只能对子进程起作用。之前我们没有提过的一个特性是,kill
命令成功退出时其状态码为 0 ,其他状态则是非0。kill -0
则不会发送信号,但是会在进程不存在时返回一个不为0的状态码。请编写一个 bash 函数pidwait
,它接受一个 pid 作为输入参数,然后一直等待直到该进程结束。您需要使用sleep
来避免浪费 CPU 性能。
weasel@weasel-GNU:~$ sleep 60 & [1] 20681 weasel@weasel-GNU:~$ jobs [1]+ Running sleep 60 & weasel@weasel-GNU:~$ man wait [1]+ Done sleep 60 weasel@weasel-GNU:~$ wait 20681 weasel@weasel-GNU:~$ jobs weasel@weasel-GNU:~$ ls bar Documents Music Public starttime.txt Videos data Downloads nohup.out sensors systemd.svg ysyx-workbench Desktop last3start.txt Pictures snap Templates weasel@weasel-GNU:~$ wait ls bash: wait: `ls': not a pid or valid job spec weasel@weasel-GNU:~$ pkill -f sleep weasel@weasel-GNU:~$ sleep 60 & [1] 20757 weasel@weasel-GNU:~$ pgrep sleep | wait; ls bar Documents Music Public starttime.txt Videos data Downloads nohup.out sensors systemd.svg ysyx-workbench Desktop last3start.txt Pictures snap Templates weasel@weasel-GNU:~$ sleep 60 & pidwait $(pgrep sleep 60) [2] 20770 pgrep: only one pattern can be provided Try `pgrep --help' for more information. pidwait: no matching criteria specified Try `pidwait --help' for more information. weasel@weasel-GNU:~$ kill 20770 [1]- Done sleep 60
终端多路复用
别名
- 创建一个
dc
别名,它的功能是当我们错误的将cd
输入为dc
时也能正确执行。weasel@weasel-GNU:~$ alias dc=cd weasel@weasel-GNU:~$ dc weasel@weasel-GNU:~$ dc ..
- 执行
history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10
来获取您最常用的十条命令,尝试为它们创建别名。注意:这个命令只在 Bash 中生效,如果您使用 ZSH,使用history 1
替换history
。weasel@weasel-GNU:/home$ history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10 6 source debug.sh 6 vim marco.sh 7 cd weasel 7 make menuconfig 9 man ls 11 jobs 13 cd ~ 33 cd .. 33 pwd 95 ls weasel@weasel-GNU:/home$ alias sl=ls weasel@weasel-GNU:/home$ sl weasel weasel@weasel-GNU:/home$ cd weasel weasel@weasel-GNU:~$ sl bar data Desktop Documents Downloads last3start.txt Music nohup.out Pictures Public sensors snap starttime.txt systemd.svg Templates Videos ysyx-workbench
配置文件
让我们帮助您进一步学习配置文件:
- 为您的配置文件新建一个文件夹,并设置好版本控制
- 在其中添加至少一个配置文件,比如说您的 shell,在其中包含一些自定义设置(可以从设置
$PS1
开始)。 - 建立一种在新设备进行快速安装配置的方法(无需手动操作)。最简单的方法是写一个 shell 脚本对每个文件使用
ln -s
,也可以使用专用工具 - 在新的虚拟机上测试该安装脚本。
- 将您现有的所有配置文件移动到项目仓库里。
- 将项目发布到GitHub。
远端设备
进行下面的练习需要您先安装一个 Linux 虚拟机(如果已经安装过则可以直接使用),如果您对虚拟机尚不熟悉,可以参考这篇教程 来进行安装。
- 前往
~/.ssh/
并查看是否已经存在 SSH 密钥对。如果不存在,请使用ssh-keygen -o -a 100 -t ed25519
来创建一个。建议为密钥设置密码然后使用ssh-agent
,更多信息可以参考 这里; - 在
.ssh/config
加入下面内容:
Host vm
User username_goes_here
HostName ip_goes_here
IdentityFile ~/.ssh/id_ed25519
LocalForward 9999 localhost:8888
- 使用
ssh-copy-id vm
将您的 ssh 密钥拷贝到服务器。 - 使用
python -m http.server 8888
在您的虚拟机中启动一个 Web 服务器并通过本机的http://localhost:9999
访问虚拟机上的 Web 服务器 - 使用
sudo vim /etc/ssh/sshd_config
编辑 SSH 服务器配置,通过修改PasswordAuthentication
的值来禁用密码验证。通过修改PermitRootLogin
的值来禁用 root 登录。然后使用sudo service sshd restart
重启ssh
服务器,然后重新尝试。 - (附加题) 在虚拟机中安装 mosh 并启动连接。然后断开服务器/虚拟机的网络适配器。mosh可以恢复连接吗?
- (附加题) 查看
ssh
的-N
和-f
选项的作用,找出在后台进行端口转发的命令是什么?
六、版本控制
- 如果您之前从来没有用过 Git,推荐您阅读 Pro Git 的前几章,或者完成像 Learn Git Branching这样的教程。重点关注 Git 命令和数据模型相关内容;
- Fork 本课程网站的仓库
- 将版本历史可视化并进行探索
weasel@weasel-GNU:~/MitLearnGit/missing-semester-cn.github.io$ git log --all --graph --decorate
- 是谁最后修改了
README.md
文件?(提示:使用git log
命令并添加合适的参数)weasel@weasel-GNU:~/MitLearnGit/missing-semester-cn.github.io$ git log -1 README.md commit b41a57ef4b35fbe98aba75253c64a82eb821124a Author: justin <2090741942@qq.com> Date: Fri Aug 18 20:52:21 2023 +0800 修改了一个换行
- 最后一次修改
_config.yml
文件中collections:
行时的提交信息是什么?(提示:使用git blame
和git show
)weasel@weasel-GNU:~/MitLearnGit/missing-semester-cn.github.io$ git blame _config.yml | grep collections a88b4eac (Anish Athalye 2020-01-17 15:26:30 -0500 18) collections: weasel@weasel-GNU:~/MitLearnGit/missing-semester-cn.github.io$ git show --pretty=format:"%s" a88b4eac | head -1 Redo lectures as a collection
- 将版本历史可视化并进行探索
- 使用 Git 时的一个常见错误是提交本不应该由 Git 管理的大文件,或是将含有敏感信息的文件提交给 Git 。尝试向仓库中添加一个文件并添加提交信息,然后将其从历史中删除 ( 这篇文章也许会有帮助);
git stash
会发生什么?当您执行git log --all --oneline
时会显示什么?通过git stash pop
命令来撤销git
从 GitHub 上克隆某个仓库,修改一些文件。当您使用stash
操作,什么时候会用到这一技巧?- 与其他的命令行工具一样,Git 也提供了一个名为
~/.gitconfig
配置文件 (或 dotfile)。请在~/.gitconfig
中创建一个别名,使您在运行git graph
时,您可以得到git log --all --graph --decorate --oneline
的输出结果; - 您可以通过执行
git config --global core.excludesfile ~/.gitignore_global
在~/.gitignore_global
中创建全局忽略规则。配置您的全局 gitignore 文件来自动忽略系统或编辑器的临时文件,例如.DS_Store
; - 克隆 本课程网站的仓库,找找有没有错别字或其他可以改进的地方,在 GitHub 上发起拉取请求(Pull Request);
总结
最后说说这两周学这个的一些体会吧。
首先,对这个一开始还能够上手进行一些操作,比如看man进行一些简单的操作,但是后面开始需要越来越多的前置的知识,我只能STFW,并对照着习题解答完成所有的内容,并且越来越拖延,因为这实在是有些痛苦的。再加上我还需要学习一些导师布置下来的任务,因此我上周可以说完全没有在认真学习的了。
其次,里面的从命令行环境开始,就有许多题目空置着了,贷个款吧,等后续有机会再来完成,先进行后面的C语言的复习了,得加快进度了,看着别人一批批的通过入学答辩,而我还停留在这里,觉得自己有些虚度光阴。
最后,研究生的生活基本上已经适应,能够抗压还是非常重要的,后面还是不能熬夜学习,接下来每天十二点半之前闭眼吧!加油!