首页 > 其他分享 >《信息安全系统设计与实现》第四周学习笔记

《信息安全系统设计与实现》第四周学习笔记

时间:2023-09-26 19:35:58浏览次数:35  
标签:文件 name int 信息安全 笔记 char read 四周 buf

第七章

文件操作级别

硬件级别

  • fdisk
  • mkfs
  • fsck
  • 碎片整理

操作系统内核中的文件系统函数

系统调用

I/O库函数

用户命令

sh脚本

文件I/O操作

image

低级别文件操作

分区

  • Command (m for help): m ---输出帮助信息

  • Command action

  • a toggle a bootable flag ---设置启动分区

  • b edit bsd disklabel ---编辑分区标签

  • c toggle the dos compatibility flag

  • d delete a partition --删除一个分区

  • l list known partition types --列出分区类型

  • m print this menu --帮助

  • n add a new partition --建立一个新的分区

  • o create a new empty DOS partition table --创建一个新的空白DOS分区表

  • p print the partition table ---打印分区表

  • q quit without saving changes ---退出不保存设置

  • s create a new empty Sun disklabel ---

  • t change a partition's system id ---改变分区的ID

  • u change display/entry units ---改变显示的单位

  • v verify the partition table ---检查验证分区表

  • w write table to disk and exit ---保存分区表

  • x extra functionality (experts only)

格式划分区

挂载分区

dd if=/dev/zero of =vdisk bs=1024 count=32768
losetup -o $(expr 2048 \* 512) --sizelimit $(expr 65535\* 512) /dev/loop1 vdisk

第八章

系统调用

系统调用手册页

man 2 stat
man 2 open
man 2 read

image

使用系统调用进行文件操作

#include<stdio.h>
#include<errno.h>
int main()
{
	char buf[256],*s;
	int r;
	r = mkdir("newdir",0766);	//mkdir syscall
	if(r<0)
		printf("error=%d : %s\n",errno,strerror(errno));
	r = chdir("newdir");	//cd into newdir
	s = getcwd(buf,256);	//get CWD string int buf[]
	printf("CWD = %s\n",s);
}

常用的系统调用

  • open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
  • close:关闭打开的文件描述符
int close(int fd);
  • read:读取打开的文件描述符
int read(int fd, char buf[], int count);
  • write:写入打开的文件描述符
int write(int fd, char buf[], int count);
  • dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldfd);
  • dup2:将oldfd复制到newfd中,如果文件链接数为0,则删除文件
int dup2(int oldfd, int newfd);
  • link:将新文件硬链接到旧文件
int link(char *oldPath, char *newPath);
  • unlink:取消某个文件的链接;如果文件链接数为0,则删除文件
int unlink(char *pathname);
  • symlink:创建一个符号链接
int symlink(char *target, char *newpath);
  • readlink:读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize);
  • umask:设置文件创建掩码;文件权限为(mask & ~umask)
int umask(int umask);
  • mknod:创建特殊文件
int mknod(char *path,int mode,int device)

链接文件

硬链接文件

ln oldpath newpath

对应系统调用:link(char *oldpath,char *newpath)
减少文件链接数:unlink(char *pathname)

符号链接文件

ln -s oldpath newpath

创建符号链接或软链接

symlink(char *oldpath,char *newpath)
  • 问题:软链接和硬链接到底有什么区别?
  • ChatGPT
    image
    image

stat系统调用

stat文件状态

stat结构体

stat与文件索引节点

每个索引节点在存储设备上都有唯一的索引节点编号(ino)。每个设备都由一对设备号标识,例如0x0302表示/dev/hda2等

文件类型和权限

st_mode:第一个字母表示文件类型,后面9个字符基于权限位,如果位是1,每个字符打印为r|w|x;如果位是0,则打印-。x位表示是否允许访问目录。

opendir-readdir函数

头文件:#include<dirent.h>
具体实现:

struct dirent
{
  long d_ino; /* inode number 索引节点号 */  
  off_t d_off; /* offset to this dirent 在目录文件中的偏移 */  
  unsigned short d_reclen; /* length of this d_name 文件名长 */  
  unsigned char d_type; /* the type of d_name 文件类型 */  
  char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

readlink函数

int readlink(char *pathname,char buf[],int bufsize);
将符号链接文件的内容复制到bufsize的buf[]中,并将实际复制的字节数返回。

ls程序

部分代码:

void printDir(const char* d_name)
{
	struct stat statBuf;
	char mode[11];
	char uidName[10];
	char gidName[10];
	char lastChgStatTime[30];

	memset(mode, 0, 11);
	memset(uidName, 0, 10);
	memset(gidName, 0, 10);
	memset(lastChgStatTime, 0, 30);

	if(printall != 1){
		if((strcmp(d_name, ".") == 0) || (strcmp(d_name, "..") == 0)){
			return;
		}
	
		if(d_name[0] == '.'){
			return;
		}
	}


	if(0 == lstat(d_name, &statBuf)){		

		if(printdetail != 1){
			printf("%-s\n", d_name);					
		}else{
			/*获取rwxrwxrwx形式的访问权限表示*/
			mode2string(statBuf.st_mode, mode);

			/*获取uid,gid对应的名称*/
			strncpy(uidName, uid2name(statBuf.st_uid), strlen(uid2name(statBuf.st_uid)));
			strncpy(gidName, gid2name(statBuf.st_gid), strlen(gid2name(statBuf.st_gid)));

			/*time_t转为可读字符串*/
			strncpy(lastChgStatTime, time2string(statBuf.st_ctime), strlen(time2string(statBuf.st_ctime)));
			
			/*文件信息打印,没有把struct stat中的信息全部打印*/
			printf("%-10s ", mode);						
			printf("%3d ", statBuf.st_nlink);			
			printf("%s ", uidName);					
			printf("%s ", gidName);						
			printf("%10dB ", statBuf.st_size);			
			printf("%s ", lastChgStatTime);				
			printf("%-s\n", d_name);					
}

	}else{
		err_sys("cant't get attribute");
	}
}

open-close-lseek系统调用

上面涉及过,在此不做详细叙述

read()系统调用

将n个字节从打开的文件描述符读入用户空间中的buf[] 返回值是实际读取的字节数,read失败返回-1

write()系统调用

将n个字节从用户空间中的buf[]写入文件描述符,必须打开该文件描述符进行写,读写或追加

实践

int copy(char *read_dir_path, char *write_dir_path)  
{  
    DIR * p_dir;  
    struct dirent * p_dirent;  
  
      
    char read_buf[256];  
    char write_buf[256];  
  
    sprintf(read_buf,"%s/", read_dir_path);  
    sprintf(write_buf,"%s/",write_dir_path);  
  
    strcat(read_dir_path,"/");  
    if( Is_dir(read_buf) )  
    {  
        //mkdir   
        if(mkdir(write_buf, 0755) < 0)  
        {  
            printf("mkdir fall:%s\n", strerror(errno));  
            return -1;  
        }  
  
  
        //opendir and readdir   
  
        if((p_dir = opendir(read_buf)) == NULL )  
        {  
            printf("Usage:cp -r <src_dir> <dat_dir> error:%s\n",strerror(errno));  
            return -1;  
        }  
  
        while((p_dirent=readdir(p_dir)) != NULL)  
        {  
            char read_buffer[256];  
            char write_buffer[256];  
            sprintf(read_buffer,"%s%s", read_buf, p_dirent->d_name);  
            sprintf(write_buffer,"%s%s", write_buf, p_dirent->d_name);  
  
            printf("%s\n%s\n",read_buffer,write_buffer);  
  
            //it is a directory   
            if( Is_dir(read_buffer) && 0 != strcmp(p_dirent->d_name, ".") && 0 != strcmp(p_dirent->d_name, "..") )  
            {  
                  
                copy_r(read_buffer, write_buffer);  
            }  
  
            else if(0 != strcmp(p_dirent->d_name, ".") && 0 != strcmp(p_dirent->d_name, ".."))  
            {  
                //copy file   
                if( file_copy_line(read_buffer, write_buffer) < 0 )  
                    return 0;  
            }  
  
  
        }  
  
        closedir(p_dir);  
  
    }  

}

苏格拉底挑战

  • 软链接
    image
    image
    image
    image
    image
    image

  • write()系统调用
    image
    image
    image
    image
    image

标签:文件,name,int,信息安全,笔记,char,read,四周,buf
From: https://www.cnblogs.com/wangqi3206/p/17730863.html

相关文章

  • Binomial Sum 学习笔记
    这是EI写的一个神秘科技。我只能把它最简单的东西讲述出来。用于\(O(k+\logn)\)复杂度解决一类求和问题。使用条件:\(f(x)\)微分有限,话句话说,存在\(f\)的微分方程。如果我容易知道\(\displaystyle\sum_{i=0}^{n}a_i[x^i]G(x)^k,k\in[0,]\),那么我就可以\(O(n)\)求\(\displaystyl......
  • openGauss学习笔记-80 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT性能基
    openGauss学习笔记-80openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT性能基准本节介绍了openGauss内存优化表(Memory-OptimizedTable,MOT)的MOT性能基准。80MOT性能基准我们的性能测试是基于业界和学术界通用的TPC-C基准。测试使用了BenchmarkSQL(请参见MOT样例TPC-C基......
  • openGauss学习笔记-81 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用概
    openGauss学习笔记-81openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT使用概述MOT作为openGauss的一部分自动部署。有关如何计算和规划所需的内存和存储资源以维持工作负载的说明,请参阅MOT准备。参考MOT部署了解MOT中所有的配置,以及服务器优化的非必须选项。使用MOT的方......
  • NLP经典论文,自我回顾笔记
    (持续更新,目前找工作中)1. SequencetoSequenceLearningwithNeuralNetworks(2014GoogleResearch)However,thefirstfewwordsinthesourcelanguagearenowveryclosetothefirstfewwordsinthetargetlanguage,sotheproblem’sminimaltime......
  • 极光笔记 | 聊一聊推送系统中事件驱动架构的应用
    微服务间通信方式主要有2种:RPC和消息传递。通常来说在请求/响应的场景下使用RPC更加合适,具体实现通常是RESTAPI或者基于长链接的协议(例如gRPC/Thrift/ZeroICE等)。两个服务有比较强的依赖关系,调用者依赖被调用者的处理结果,调用者处理该请求被堵塞以等待响应结果,同时还要进行负载......
  • linux系统读书笔记 第二章
    读书笔记:学习Linux操作系统基础知识最近我开始学习Linux操作系统,并涉及了一些核心概念和工具,包括Linux系统文件目录与路径、目录与文件操作、Vim编辑器以及文件时间管理。通过学习这些内容,我对Linux的理解更加深入,也对如何在Linux环境下进行文件管理和编辑有了更多的掌握。首先,......
  • 质量高的代理IP是怎么实现网络信息安全的保护?它能够协助开展哪些应用?
    随着科技的发展,人们在访问站点的时候有可能会因为触发安全机制导致ip受限,一般可以使用代理ip来访问站点,灵活的切换也不至于受限。但是它还可以保护人们上网时的网络信息的安全,小编接下来就跟大家介绍介绍:1、距离上使用与目标站点想接近的代理ip,能快速的访问目标服务器,提升访问速度,......
  • 动态规划——数位DP 学习笔记
    动态规划——数位DP学习笔记定义引入数位DP往往都是这样的题型:给定一个区间\([l,r]\),求这个区间中满足某种条件的数的总数。简单的暴力代码如下:intans=0;for(inti=l;i<=r;++i)if(check(i))++ans;而当数据规模过大,暴力枚举就\(\mathbbT\)飞了,因此......
  • 学习笔记四
    学习笔记四一、作业要求自学教材第7、8章,提交学习笔记(10分),评分标准如下:知识点归纳以及自己最有收获的内容,选泽至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 《流畅的Python》 读书笔记 230926(第一章后半部分)
    1.2如何使用特殊方法特殊方法的存在是为了被Python解释器调用的,你自己并不需要调用它们就是说通常你都应该用len(obj)而不是obj.__len()__,无论是系统预置的,还是你自己定义的类,交给Python,解释器会去调用你实现的__len()__然而如果是Python内置的类型,比如列表(list)、字符......