第三周tools的练习
Shell脚本
文件权限
创建用户和组
sudo adduser NAME
创建用户。 NAME指用户名,最好全小写(good name)观看用户和组文件。新创建的用户组应该出现在两种命令里
tail /etc/passwd & tail /etc/group
- 显示最后N行(大写N)命令:
tail -n N FILE
把两个用户全部添加到users用户组里
sudo usermod -aG GROUPNAME USERNAME
创建了两个用户,名字分别是bell和cat,现在他们都在users用户组里。
拓展文件权限
把主目录变成user使用的命令:
chgrp -R GROUPNAME DIRECTORY
- GROUPNAME 是放到用户组的那个组名
- DIRECTORY 是用户目录 /home/cat or /home/bell 在我创建的用户组里
练习的歪门邪道1
sudo chmod 755 /home/cat
这可以设置cat主目录权限,让bell可以读取,但是不可写入
缺点: 这样同时会导致下一题,在cat主目录里设置private私密文件夹的时候,bell依旧可以读取此私密文件夹。
练习的歪门邪道2:
为了解决上面的问题,使用sudo chmod 700 /home/cat/private
在超级用户“vagrant”里先给予cat用户读写权限,与此同时让用户bell无权限(在bell用户里)chmod 0 /home/cat/private
user用户里使用chmod命令的时候不需要用sudo
Setuid
- 任务: 创建一个文件,使得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 | vagrant@debian12:~$ sudo su |
Shell 脚本
Compiler helper exercise
根据题目要求写出的脚本
1 |
|
本代码完全由chatgpt生成。
随后,对于写好的 b/b.sh 文件,使用vagrant@debian12:~$ chmod +x b
给予脚本权限,可以达到效果
对于b.sh
1 | vagrant@debian12:~$ chmod +x b.sh |
对于b
试了一下,给文件单独起名b也行,也能做到上述一系列事情。 但是应该不是这个意思吧?
1 | vagrant@debian12:~$ chmod +x b |
不确定的答案: 建立软链接?
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 | vagrant@debian12:~$ wget https://sqlite.org/2021/sqlite-autoconf-3340100.tar.gz |
最后一个指令可以配置、创建和安装这个包。
Configure
- 以
#! /bin/sh
开始配置脚本 -> 该路径在几乎任何与 posix 兼容的系统上都应该有效 - 这里的Configure脚本是一系列上报错误的总和test
Make
键入commandmake
之后,一个sqlite就被安装好了?
1 | vagrant@debian12:~/sqlite-autoconf-3340100$ ./sqlite3 |
Python
Python的包管理使用command
pip
- 虚拟机没python,先安装python
1 | vagrant@debian12:~$ wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz |
部分参考链接: https://blog.csdn.net/qq_42571592/article/details/122902266
- 安装好之后,开始
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
9vagrant@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\
文件夹里