Linux基本使用必做题

一、课程概览与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.用 touchmissing 文件夹中新建一个叫 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 工具和脚本

  1. 阅读 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 ..
    
  2. 编写两个bash函数 marcopolo 执行下面的操作。 每当你执行 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 }
    ~           

  3. 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段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
    
  4. 本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar 则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。

    您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 xargs的参数-d,译注:MacOS 上的 xargs没有-d查看这个issue

    如果您使用的是 MacOS,请注意默认的 BSD findGNU 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
    
    

    到这里就更不会了,但是看语法是能看懂的,主要是没有什么实操,导致无法理解这个题目的意思,他甚至要我自己做出工作环境,我只是个小镇做题家啊!
     

  5. (进阶)编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?

    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)

  1. 完成 vimtutor。备注:它在一个 80x24(80 列,24 行) 终端窗口看起来效果最好。

    vimtutor在暑假是已经完成了,现在对vim有一个基本的了解,但是使用的时候还是只会insert模式,并且还习惯上了用上下左右进行移动光标,这是非常不好的习惯,至少先熟悉用hjkl来移动光标。
     
  2. 下载我们提供的 vimrc,然后把它保存到 ~/.vimrc。 通读这个注释详细的文件 (用 Vim!), 然后观察 Vim 在这个新的设置下看起来和使用起来有哪些细微的区别。

    对于这一点,暑假已经配置过了,前几天重装后也进行了配置,再换的话太浪费精力。
  3. 安装和配置一个插件: ctrlp.vim.
    1. mkdir -p ~/.vim/pack/vendor/start 创建插件文件夹
    2. 下载这个插件: cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim
    3. 阅读这个插件的 文档。 尝试用 CtrlP 来在一个工程文件夹里定位一个文件,打开 Vim, 然后用 Vim 命令控制行开始 :CtrlP.
    4. 自定义 CtrlP:添加 configuration 到你的 ~/.vimrc 来用按 Ctrl-P 打开 CtrlP
  4. 练习使用 Vim, 在你自己的机器上重做 演示
  5. 下个月用 Vim 完成所有的文件编辑。每当不够高效的时候,或者你感觉 “一定有一个更好的方式”时, 尝试求助搜索引擎,很有可能有一个更好的方式。如果你遇到难题,可以来我们的答疑时间或者给我们发邮件。
  6. 在其他工具中设置 Vim 快捷键 (见上面的操作指南)。
  7. 进一步自定义你的 ~/.vimrc 和安装更多插件。
  8. (高阶)用 Vim 宏将 XML 转换到 JSON (例子文件)。 尝试着先完全自己做,但是在你卡住的时候可以查看上面 章节。


    这一节的习题先这样水过去,主要是vim的熟练使用。
     

四、数据清洗

  1. 学习一下这篇简短的 交互式正则表达式教程.


    已学完,发现貌似有一些论坛的搜索也是符合正则表达式的,而百度大概是模糊匹配,有字对上就行。正则表达式还是很有用的。
    正则表达式要匹配小括号时需要用[]圈起来,比如这样:“[(]”
    也可以这样:"\("



     
  2. 统计words文件 (/usr/share/dict/words) 且不以's 结尾的单词个数。这些单词中,出现频率前三的末尾两个字母是什么? sedy命令,或者 tr 程序也许可以帮你解决大小写的问题。共存在多少种词尾两字母组合?还有一个很 有挑战性的问题:哪个组合从未出现过?
     

    Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

    grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

    #我的
    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
    
    我的正则表达十出来只有456个,标准答案是854个,优化后也没区别,其实有些看不大懂答案上的正则表达式。

     
  3. 进行原地替换听上去很有诱惑力,例如: sed s/REGEX/SUBSTITUTION/ input.txt > input.txt。但是这并不是一个明智的做法,为什么呢?还是说只有 sed是这样的? 查看 man sed 来完成这个问题

    显然,直接在原文件上进行替换会把原本的txt直接清楚,大概类似于先删除再创建一个同名文件的形式,这样本来的input.txt内的数据会消失,所以应该先备份文件。
    而通过sed的直接修改文件内容能够在处理大文本时非常的便捷,比如100万行的文件需要在某一行加一些内容,使用sed会很方便。

  4. 找出您最近十次开机的开机时间平均数、中位数和最长时间。在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
    
  5. 查看之前三次重启启动信息中不同的部分(参见 journalctl-b 选项)。将这一任务分为几个步骤,首先获取之前三次启动的启动日志,也许获取启动日志的命令就有合适的选项可以帮助您提取前三次启动的日志,亦或者您可以使用sed '0,/STRING/d' 来删除STRING匹配到的字符串前面的全部内容。然后,过滤掉每次都不相同的部分,例如时间戳。下一步,重复记录输入行并对其计数(可以使用uniq )。最后,删除所有出现过3次的内容(因为这些内容是三次启动日志中的重复部分)。

     
  6. 在网上找一个类似 这个 或者这个的数据集。或者从这里找一些。使用 curl 获取数据集并提取其中两列数据,如果您想要获取的是HTML数据,那么pup可能会更有帮助。对于JSON类型的数据,可以试试jq。请使用一条指令来找出其中一列的最大值和最小值,用另外一条指令计算两列之间差的总和。

五、命令行环境

任务控制

  1. 我们可以使用类似 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
    
  2. 如果您希望某个进程结束后再开始另外一个进程, 应该如何实现呢?在这个练习中,我们使用 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
    

终端多路复用

  1. 请完成这个 tmux 教程 参考这些步骤来学习如何自定义 tmux

别名

  1. 创建一个 dc 别名,它的功能是当我们错误的将 cd 输入为 dc 时也能正确执行。
    weasel@weasel-GNU:~$ alias dc=cd
    weasel@weasel-GNU:~$ dc
    weasel@weasel-GNU:~$ dc ..
    

  2. 执行 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
    

配置文件

让我们帮助您进一步学习配置文件:

  1. 为您的配置文件新建一个文件夹,并设置好版本控制
  2. 在其中添加至少一个配置文件,比如说您的 shell,在其中包含一些自定义设置(可以从设置 $PS1 开始)。
  3. 建立一种在新设备进行快速安装配置的方法(无需手动操作)。最简单的方法是写一个 shell 脚本对每个文件使用 ln -s,也可以使用专用工具
  4. 在新的虚拟机上测试该安装脚本。
  5. 将您现有的所有配置文件移动到项目仓库里。
  6. 将项目发布到GitHub。

远端设备

进行下面的练习需要您先安装一个 Linux 虚拟机(如果已经安装过则可以直接使用),如果您对虚拟机尚不熟悉,可以参考这篇教程 来进行安装。

  1. 前往 ~/.ssh/ 并查看是否已经存在 SSH 密钥对。如果不存在,请使用ssh-keygen -o -a 100 -t ed25519来创建一个。建议为密钥设置密码然后使用ssh-agent,更多信息可以参考 这里
  2. .ssh/config加入下面内容:
Host vm
    User username_goes_here
    HostName ip_goes_here
    IdentityFile ~/.ssh/id_ed25519
    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 并启动连接。然后断开服务器/虚拟机的网络适配器。mosh可以恢复连接吗?
  5. (附加题) 查看ssh-N-f 选项的作用,找出在后台进行端口转发的命令是什么?

六、版本控制

  1. 如果您之前从来没有用过 Git,推荐您阅读 Pro Git 的前几章,或者完成像 Learn Git Branching这样的教程。重点关注 Git 命令和数据模型相关内容;
  2. Fork 本课程网站的仓库
    1. 将版本历史可视化并进行探索
      weasel@weasel-GNU:~/MitLearnGit/missing-semester-cn.github.io$  git log --all --graph --decorate
      
    2. 是谁最后修改了 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
      
          修改了一个换行
      
    3. 最后一次修改_config.yml 文件中 collections: 行时的提交信息是什么?(提示:使用 git blamegit 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
      

  3. 使用 Git 时的一个常见错误是提交本不应该由 Git 管理的大文件,或是将含有敏感信息的文件提交给 Git 。尝试向仓库中添加一个文件并添加提交信息,然后将其从历史中删除 ( 这篇文章也许会有帮助);
  4. git stash 会发生什么?当您执行 git log --all --oneline 时会显示什么?通过 git stash pop 命令来撤销 git 从 GitHub 上克隆某个仓库,修改一些文件。当您使用 stash 操作,什么时候会用到这一技巧?
  5. 与其他的命令行工具一样,Git 也提供了一个名为 ~/.gitconfig 配置文件 (或 dotfile)。请在 ~/.gitconfig 中创建一个别名,使您在运行 git graph 时,您可以得到 git log --all --graph --decorate --oneline 的输出结果;
  6. 您可以通过执行 git config --global core.excludesfile ~/.gitignore_global~/.gitignore_global 中创建全局忽略规则。配置您的全局 gitignore 文件来自动忽略系统或编辑器的临时文件,例如 .DS_Store
  7. 克隆 本课程网站的仓库,找找有没有错别字或其他可以改进的地方,在 GitHub 上发起拉取请求(Pull Request);

总结

最后说说这两周学这个的一些体会吧。

首先,对这个一开始还能够上手进行一些操作,比如看man进行一些简单的操作,但是后面开始需要越来越多的前置的知识,我只能STFW,并对照着习题解答完成所有的内容,并且越来越拖延,因为这实在是有些痛苦的。再加上我还需要学习一些导师布置下来的任务,因此我上周可以说完全没有在认真学习的了。

其次,里面的从命令行环境开始,就有许多题目空置着了,贷个款吧,等后续有机会再来完成,先进行后面的C语言的复习了,得加快进度了,看着别人一批批的通过入学答辩,而我还停留在这里,觉得自己有些虚度光阴。

最后,研究生的生活基本上已经适应,能够抗压还是非常重要的,后面还是不能熬夜学习,接下来每天十二点半之前闭眼吧!加油!








  1.  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值