|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令。
$llwget
total544
drwxr-xr-x3orisunorisun40962011-12-1509:48./
drwxr-xr-x65orisunorisun40962011-12-2019:45../
drwxr-xr-x11orisunorisun40962011-08-0921:55wget-1.13/
-rw-r--r--1orisunorisun5407562011-12-1509:47wget.pdf
目次老是不为空,它最少包括两项:.代表以后路径,..代表父路径。
ll命令用于列出一个目次下的文件的具体信息:
- 文件形式
这是个16位的2进制。最高4位暗示文件范例,接上去3位顺次是suid、sgid、sticky,前面的9位顺次是user、group、other的读写实行标记。
文件范例:
1000 - 一般文件
0100 d 目次
0110 b 块设备
0010 c 字符设备
0001 p 定名管道
1010 l 标记链接
1100 s 套接字
文件可读意味着能够用cat命令检察,可写能够用vi翻开。文件夹可实行则可使用cd命令。
suid代表set-user-id,设置用户ID,即实行该文件的用户就像本文件的一切者一样。好比任何用户都能够经由过程password命令来修正本人的暗码,可是存储暗码的文件/etc/passwd的具有者是root,其他用户是没有写权限的。而可实行文件/usr/bin/passwd的具有者也是root,同时它的suid位上是1。则一般用户在运转/usr/bin/passwd的时分就成了root身份,既然是root身份天然对/etc/passwd具有了写权限。那末passwd命令能不克不及修正其他用户的暗码呢?不克不及!由于passwd命令会经由过程体系挪用getuid来取得以后用户的ID,它只能修正这个ID用户的暗码。假如文件具有者原本具有写权限,同时suid位上是1,则相就位上的x会酿成s;假如文件原本不是可实行文件,则响应位上会酿成S。
sgid与suid类同。
sticky对文件和文件夹有分歧的服从。sticky文件告知体系要把文件放在swap地区。从互换空间加载程序比从一般磁盘地区加载要快,由于程序在硬盘上大概被分为好几块寄存在很多分歧的中央,而在互换空间上文件是不分块的。以是经常使用的程序如编纂器、编译器会放在互换空间。不外如今互换手艺已没那末主要了,取而代之的是假造内存,由于假造内存能够以更小的单元(如页page)举行互换。sticky使得一个目次里的文件只能被创立者删除,在/tmp目次里,谁都能够举行创立/删除文件。其他用户的x被交换这t,代表sticky被设置。
- 第二列显现链接数(硬链接),即指向该文件的援用次数。
- 第三列是文件一切者。/etc/passwd文件中包括用户列表,但它并没有包括一切的用户,由于在收集体系中,一台呆板能够被良多用户登录,此时一切的用户信息都存储在一台叫作NIS的服务器上,一切的主机经由过程NIS举行身份考证。固然当地的/etc/passwd也存储了部分用户列表(这是NIS上用户列表的一个子集),以备离线操纵。每一个用户都有一个ID,该用户创立的文件有一个属性值就是此ID,这里就有一个成绩,当用户被删除后,他创立的文件还在,假如厥后又到了一个新用户,他恰好又被付与了被删除的谁人用户的ID,那末本来用户创立的文件回新用户一切。
- 第四列是文件具有者地点的主组。不错,一个用户能够属于多个组。/etc/group里存储组列表。
- 第五列是文件巨细。令我们猎奇的是为何下面三个文件夹的巨细都是4096?这是由于目次所占的空间是以块为分派单元的,每块为512B。关于一样平常文件,则列出实践字节数。
- 第六列是文件的最初修正工夫。
- 第七列是文件名。
上面会商怎样来编程完成ll命令。
文件的良多基础信息都能够经由过程体系挪用lstat来猎取,它前往一个布局体:- structstat{dev_tst_dev;/*IDofdevicecontainingfile*/ino_tst_ino;/*inodenumber*/mode_tst_mode;/*protection*/nlink_tst_nlink;/*numberofhardlinks*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/dev_tst_rdev;/*deviceID(ifspecialfile)*/off_tst_size;/*totalsize,inbytes*/blksize_tst_blksize;/*blocksizeforfilesystemI/O*/blkcnt_tst_blocks;/*numberof512Bblocksallocated*/time_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeoflaststatuschange*/};
复制代码 一个structstat内里仿佛包括了我们编写ll命令所需的一切文件信息,但有些体现情势上还不合错误。
- 文件形式我们但愿以“-rw-rw-r--"的情势显现,但st_mode是个十进制数。这里可使用掩码来猎取响应的位标识。
- 用户和组供应的是ID,而不是称号。经由过程UID来猎取用户名能够用getpwuid(uid)->p_name,依据GID来猎取组名能够用getgrgid(gid)->gr_name。getpwuid()先从当地/etc/passwd上查找用户,假如没有,再从NIS中猎取。
- st_mtime是time_t范例的,我们能够经由过程体系挪用localtime把它转换成structtm范例:
- structtm{inttm_sec;/*seconds*/inttm_min;/*minutes*/inttm_hour;/*hours*/inttm_mday;/*dayofthemonth*/inttm_mon;/*month*/inttm_year;/*year*/inttm_wday;/*dayoftheweek*/inttm_yday;/*dayintheyear*/inttm_isdst;/*daylightsavingtime*/};
复制代码 必要注重的是,这里的tm_year是减往了1990的,tm_mon是从0入手下手盘算的。
上面给出完全代码。- #include<stdio.h>#include<time.h>#include<sys/types.h>#include<dirent.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>voiddo_ls(char[]);voiddostat(char*);voidshow_file_info(char*,structstat*);voidmode_to_letters(int,char[]);char*uid_to_name(uid_t);char*gid_to_name(gid_t);voidmain(intargc,char*argv[]){if(argc==1)do_ls(".");elseprintf("输出命令./ls便可,不要带任何参数。
- ");}voiddo_ls(chardirname[]){DIR*dir_ptr;//路径变量structdirent*direntp;//存储路径下一个子项信息的布局体if((dir_ptr=opendir(dirname))==0)fprintf(stderr,"ls:cannotopen%s
- ",dirname);else{while((direntp=readdir(dir_ptr))!=0)dostat(direntp->d_name);closedir(dir_ptr);}}voiddostat(char*filename){structstatinfo;if(lstat(filename,&info)==-1)perror("lstat");elseshow_file_info(filename,&info);}voidshow_file_info(char*filename,structstat*info_p){charmodestr[11];mode_to_letters(info_p->st_mode,modestr);printf("%-12s",modestr);printf("%-4d",(int)info_p->st_nlink);printf("%-8s",uid_to_name(info_p->st_uid));printf("%-8s",gid_to_name(info_p->st_gid));printf("%-8ld",(long)info_p->st_size);time_ttimelong=info_p->st_mtime;structtm*htime=localtime(&timelong);printf("%-4d-%02d-%02d%02d:%02d",htime->tm_year+1990,htime->tm_mon+1,htime->tm_mday,htime->tm_hour,htime->tm_min);printf("%s
- ",filename);}/*这个函数写得不敷周全,起首文件范例不全,其次没有思索suid,sgid,sticky*/voidmode_to_letters(intmode,charstr[]){strcpy(str,"----------");if(S_ISDIR(mode))str[0]=d;if(S_ISCHR(mode))str[0]=c;if(S_ISBLK(mode))str[0]=b;if(mode&S_IRUSR)str[1]=r;if(mode&S_IWUSR)str[2]=w;if(mode&S_IXUSR)str[3]=x;if(mode&S_IRGRP)str[4]=r;if(mode&S_IWGRP)str[5]=w;if(mode&S_IXGRP)str[6]=x;if(mode&S_IROTH)str[7]=r;if(mode&S_IWOTH)str[8]=w;if(mode&S_IXOTH)str[9]=x;}#include<pwd.h>//#include能够呈现在代码中的任何地位char*uid_to_name(uid_tuid){structpasswd*pw_str;staticcharnumstr[10];if((pw_str=getpwuid(uid))==NULL){sprintf(numstr,"%d",uid);//假如没有取得用户名,则间接把uid看成用户名returnnumstr;}elsereturnpw_str->pw_name;}#include<grp.h>char*gid_to_name(gid_tgid){structgroup*grp_ptr;staticcharnumstr[10];if((grp_ptr=getgrgid(gid))==NULL){sprintf(numstr,"%d",gid);returnnumstr;}elsereturngrp_ptr->gr_name;}
复制代码
<br>
常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基的。 |
|