寒流掉的狼毛

如果以后再也见不到您,祝您早安,午安,还有晚安。

0%

【Software tools】第三周习题

  第三周tools的练习

 

Shell脚本

文件权限

创建用户和组

  1. sudo adduser NAME
    创建用户。 NAME指用户名,最好全小写(good name)

  2. 观看用户和组文件。新创建的用户组应该出现在两种命令里

    • tail /etc/passwd & tail /etc/group
    • 显示最后N行(大写N)命令: tail -n N FILE
  3. 把两个用户全部添加到users用户组里

    • sudo usermod -aG GROUPNAME USERNAME
  4. 创建了两个用户,名字分别是bell和cat,现在他们都在users用户组里。

拓展文件权限

  1. 把主目录变成user使用的命令:

    • chgrp -R GROUPNAME DIRECTORY
    • GROUPNAME 是放到用户组的那个组名
    • DIRECTORY 是用户目录 /home/cat or /home/bell 在我创建的用户组里
  2. 练习的歪门邪道1

    • sudo chmod 755 /home/cat
      这可以设置cat主目录权限,让bell可以读取,但是不可写入

    缺点: 这样同时会导致下一题,在cat主目录里设置private私密文件夹的时候,bell依旧可以读取此私密文件夹。

  3. 练习的歪门邪道2:
    为了解决上面的问题,使用sudo chmod 700 /home/cat/private在超级用户“vagrant”里先给予cat用户读写权限,与此同时让用户bell无权限(在bell用户里)chmod 0 /home/cat/private
    user用户里使用chmod命令的时候不需要用sudo

Setuid

  1. 任务: 创建一个文件,使得bell用户可以给cat用户传送信息(并保存到cat的主目录中)
    chmod 指令可以修改权限

-rwxr-xr-x 1 cat cat 16184 Feb 16 17:45 message-cat
在使用chmod u+s message-cat之后,权限会变成
-rwsr-xr-x 1 cat cat 16184 Feb 16 17:45 message-cat
概率遇到错误:Error open file: 原因是没有修改他给的C文件里的用户名称。需要修改成自己创建的。我是bell和cat。
成功之后,bell用户可以以此在cat用户里创建messages.txt来传输messages。

注意事项:setuid危险,有概率使别人接管你的用户账户

Q: Why mount 和 umount指令是setuid的?
A: The mount command is used to attach a filesystem to the system’s hierarchy at a specified mount point. The umount command, on the other hand, is used to detach a mounted filesystem. Both mount and umount commands typically require root privileges because manipulating the filesystem can have system-wide consequences, and only privileged users should have the ability to make such changes.(ChatGPT)

Q: Why passwd 需要 setuid?
A: Regarding the passwd program, it is typically setuid because it needs to modify the system’s password files, such as /etc/passwd and /etc/shadow. These files contain sensitive information such as user passwords and other authentication-related data. For security reasons, only privileged users (such as root) should be allowed to modify these files. (ChatGPT)

中文版本:
mount 命令用于将文件系统附加到系统的层次结构中的指定挂载点。umount 命令用于卸载已挂载的文件系统。通常情况下,mount 和 umount 命令需要 root 权限,因为操作文件系统可能会对整个系统产生影响,只有特权用户才应该具有执行此类更改的能力。

至于 passwd 程序,它通常被设置为 setuid,因为它需要修改系统的密码文件,如 /etc/passwd 和 /etc/shadow。这些文件包含敏感信息,如用户密码和其他与身份验证相关的数据。出于安全原因,只有特权用户(如 root)才能修改这些文件。

Sudo

在vagrant用户里可以使用sudo的原因: Everything is commented out except root ALL=(ALL) ALL and the last line #includedir /etc/sudoers.d (this is not a comment!) which contains a single file vagrant with the line vagrant ALL=(ALL) NOPASSWD: ALL which is why vagrant can use sudo in the first place.

警告:需要使用visudo文本编辑器来编辑 /etc/sudoers, 较大概率保证不出错。

任务: 使用sudo su进入root,之后务必要使用visudo来编辑/etc/sudoers文件。(在root里只输入visudo它会自动打开文件)。随后添加一行指令%users ALL=(ALL) /sbin/reboot 来使得users里面的用户也可以使用sudo reboot这个命令来重启虚拟机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vagrant@debian12:~$ sudo su
root@debian12:/home/vagrant# visudo
root@debian12:/home/vagrant#
root@debian12:/home/vagrant# su cat
cat@debian12:/home/vagrant$ sudo reboot
[sudo] password for cat:

Broadcast message from root@debian12.localdomain on pts/2 (Fri 2024-02-16 19:09:44 UTC):

The system will reboot now!


Broadcast message from root@debian12.localdomain on pts/2 (Fri 2024-02-16 19:09:44 UTC):

The system will reboot now!

cat@debian12:/home/vagrant$ Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.

Shell 脚本

Compiler helper exercise

根据题目要求写出的脚本

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/sh

# Function to compile a C file
compile() {
src_file="$1"
if [ ! -f "$src_file" ]; then
src_file="${src_file%.c}.c" # Append .c if not provided
if [ ! -f "$src_file" ]; then
echo "Error: Source file '$1' not found." >&2
return 1
fi
fi

if gcc -Wall -std=c11 -g "$src_file" -o "${src_file%.c}"; then
echo "Compilation successful."
return 0
else
echo "Error: Compilation failed." >&2
return 1
fi
}

# Function to run a compiled program
run() {
program="$1"
if [ ! -x "$program" ]; then
echo "Error: Program '$program' not found or not executable." >&2
return 1
fi

./"$program"
}

# Main script logic
if [ $# -eq 0 ]; then
echo "Usage: $0 [compile|run|build] [filename]" >&2
exit 1
fi

case "$1" in
compile)
shift
if [ $# -eq 0 ]; then
echo "Error: Missing filename." >&2
exit 1
fi
compile "$1"
;;
run)
shift
if [ $# -eq 0 ]; then
echo "Error: Missing program name." >&2
exit 1
fi
run "${1%.c}"
;;
build)
shift
if [ $# -eq 0 ]; then
echo "Error: Missing filename." >&2
exit 1
fi
if compile "$1"; then
run "${1%.c}"
fi
;;
*)
echo "Usage: $0 [compile|run|build] [filename]" >&2
exit 1
;;
esac

exit 0

本代码完全由chatgpt生成。

随后,对于写好的 b/b.sh 文件,使用vagrant@debian12:~$ chmod +x b给予脚本权限,可以达到效果

对于b.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vagrant@debian12:~$ chmod +x b.sh
vagrant@debian12:~$ ls
arguments arguments.c b.sh ex231 hello.c readme.txt week2 week3
vagrant@debian12:~$ ./b.sh compile hello.c
Compilation successful.
vagrant@debian12:~$ ls
arguments arguments.c b.sh ex231 hello hello.c readme.txt week2 week3
vagrant@debian12:~$ rm hello
vagrant@debian12:~$ ls
arguments arguments.c b.sh ex231 hello.c readme.txt week2 week3
vagrant@debian12:~$ ./b.sh compile hello
Compilation successful.
vagrant@debian12:~$ ./b.sh run hello
Hello from Amy!

对于b

试了一下,给文件单独起名b也行,也能做到上述一系列事情。 但是应该不是这个意思吧?

1
2
3
4
5
vagrant@debian12:~$ chmod +x b
vagrant@debian12:~$ ./b compile hello
Compilation successful.
vagrant@debian12:~$ ./b run hello
Hello from Amy!

不确定的答案: 建立软链接?

Strict Mode

  • 将所有的warning视作error!
    使用set命令来启用严格模式,减少脚本中的错误。下面是每个选项的作用:

set -e:使整个脚本在任何命令失败时立即退出。这样,如果要运行一系列命令,只需将它们放在脚本的顶部,并设置 set -e,只要所有命令都成功(返回 0),Shell 就会继续执行;如果任何命令返回非零值,Shell 将停止运行任何后续命令。类似于在每个命令的结尾加上 || exit $?。

set -u:引用未定义变量将被视为错误。这是良好的实践,有很多理由支持。

set -o pipefail:改变管道的工作方式。通常情况下,管道的返回值是管道中最后一个命令的返回值。但是使用了 pipefail选项后,如果管道中的任何命令失败(返回非零值),则整个管道的返回值将是该命令的退出代码。

关于set -u,值得注意的是,如果你写了类似 rm -rf $FOLDER/ 的命令,而 $FOLDER 没有设置,那么你不会意外地删除整个系统!当然,大多数 rm 实现都会拒绝删除 /,除非使用了--no-preserve-root 选项,而且你不应该在命令中使用结尾的斜杠。最后一个斜杠是在一个 Steam for Linux 的测试版本中的一个 bug 中引起的。在某些情况下,该变量设置为空字符串,而 -u 选项无法防止这种情况发生。由于这是一个安装脚本,所以以 root用户身份运行,这使得情况变得更糟。

Exercise – 还没做暂时

构建工具(下载、安装工具)

C

一系列安装操作

1
2
3
4
vagrant@debian12:~$ wget  https://sqlite.org/2021/sqlite-autoconf-3340100.tar.gz
vagrant@debian12:~$ tar -zxvf sqlite-autoconf-3340100.tar.gz
vagrant@debian12:~$ cd sqlite-autoconf-3340100/
vagrant@debian12:~/sqlite-autoconf-3340100$ ./configure; make; make install

最后一个指令可以配置、创建和安装这个包。

Configure

  1. #! /bin/sh开始配置脚本 -> 该路径在几乎任何与 posix 兼容的系统上都应该有效
  2. 这里的Configure脚本是一系列上报错误的总和test

Make

键入commandmake之后,一个sqlite就被安装好了?

1
2
3
4
5
6
vagrant@debian12:~/sqlite-autoconf-3340100$ ./sqlite3
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

Python

  1. Python的包管理使用commandpip

    • 虚拟机没python,先安装python
1
2
3
4
5
vagrant@debian12:~$ wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz
vagrant@debian12:~$ tar -zxvf Python-3.12.2.tgz
vagrant@debian12:~$ cd Python-3.12.2
vagrant@debian12:~/Python-3.12.2$ ./configure --prefix=/user/local/python3
vagrant@debian12:~/Python-3.12.2$ make && make install

部分参考链接: https://blog.csdn.net/qq_42571592/article/details/122902266

  1. 安装好之后,开始import mistletoe模块的安装
    • 显示找不到模块,使用sudo pip3 install mistletoe显示找不到pip3
    • 安装pip3: sudo apt install python3-pip
      (遇到错误)
    • 另一种方法: vagrant@debian12:~$ sudo su之后root@debian12:/home/vagrant# apt install python3-mistletoe
      EMMM 卡住了 先跳过
  • sudo apt install python 即可
    界面:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vagrant@debian12:~$ python
    Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import mistletoe
    >>> with open('hello.md','r') as file:
    ... mistletoe.markdown(file)
    ...
    '<h1>Markdown Example</h1>\n<p>Markdown is a <em>markup</em> language.</p>\n'
    >>> exit()

scipy

Java

为了week5的sql,先把java安装好在虚拟机上。

  • 安装jdk和maven
  • jdk
    sudo apt install default-jre之后sudo apt install default-jdk
  • 如果遇到Error,使用apt upadate更新一下安装包
  • sudo apt inatall maven即可

maven 相关

  • mvn -v 查看版本(能查看就说明已经安装好了)

  • 修改一个叫pom.xml的文件来达成特定目的

  • mvn compile编译文件,mvn clean清除编译文件

  • mvn compile test运行test之后运行程序

  • mvn package创建jar文件在project文件里的target\文件夹里

Spring