ls -l 文件/目录

/** @file      my_ls.c 
 *  @brief     实现ls -l []这个功能
 *  @note      通过这个函数能够获取文件的信息并在终端显示
 *  @author    
 *  @date      
 *  @version   v1.0
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>

#define FILELENGTH 50   // 文件长度
#define N_BITS     3    // 用于打印文件权限时使用

/** @Fn     int isDir(const char *name)
 *  @brief  判断该文件是否是目录
 *  @param  const char *name  文件名
 *  @return 0 - true -1 - false
 */
int isDir(const char *name)
{
    struct stat buf;
    if ( stat(name, &buf) != 0 )
    {
        printf("stat %s error! \n", name);
        exit (-1);
    }
    switch ( buf.st_mode & S_IFMT)
    {
        case S_IFDIR:
            return 0;
            break;
        default:
            return -1;
            break;
    }
}

/** @Fn     void print_perm(mode_t st_mode)
 *  @brief  打印文件类型和文件的读写权限 rwxrwx...
 *  @note   由于st_mode是总共由9位组成,先必须循环3次分别对应自己的权限,
    本组权限,再之后是其他人权限,因此必须循环三次,每次循环之后
    mask右移三位进入下一组的权限打印
    通过配对这三位的值,将数组perm[]对应的值打印出来
 *  @param  mode_t st_mode  传入的文件权限值
 *  @return none
 */

void print_perm(mode_t st_mode)
{
    int i, tmp;
    unsigned int mask = 0700;       
    static char *perm[]={"---", "--x", "-w-", "-wx",
                         "r--", "r-x", "rw-", "rwx"};

    if ( (st_mode & S_IFMT) == S_IFSOCK )    // socket文件
    {
        printf("s");
    }
    else if ( (st_mode & S_IFMT) == S_IFLNK )     // 链接文件
    {
        printf("I");
    }
    else if ( (st_mode & S_IFMT) == S_IFREG )     // 普通文件
    {
        printf("-");
    }
    else if ( (st_mode & S_IFMT) == S_IFBLK )     // 块文件
    {
        printf("b");
    }
    else if ( (st_mode & S_IFMT) == S_IFCHR )     // 字符文件
    {
        printf("c");
    }
    else if ( (st_mode & S_IFMT) == S_IFIFO )     // FIFO
    {
        printf("p");
    }
    else
    {
        printf("d");
    }
    
    
    for ( i=3; i>0 ; --i )
    {
        tmp = (st_mode & mask) >> (i - 1)*N_BITS;
        printf("%3s", perm[tmp]);
        mask >>= N_BITS;
    }

}

/*
void print_perm(mode_t st_mode)
{
    printf("Now here!\n");
    char str[11];    strcpy( str, "----------" );    
    //if ( S_ISDIR(mode) )  str[0] = 'd';    
    //if ( S_ISCHR(mode) )  str[0] = 'c';    
    //if ( S_ISBLK(mode) )  str[0] = 'b';    
    if ( st_mode & S_IRUSR ) str[1] = 'r';    
    if ( st_mode & S_IWUSR ) str[2] = 'w';    
    if ( st_mode & S_IXUSR ) str[3] = 'x';    
    if ( st_mode & S_IRGRP ) str[4] = 'r';    
    if ( st_mode & S_IWGRP ) str[5] = 'w';    
    if ( st_mode & S_IXGRP ) str[6] = 'x';    
    if ( st_mode & S_IROTH ) str[7] = 'r';    
    if ( st_mode & S_IWOTH ) str[8] = 'w';    
    if ( st_mode & S_IXOTH ) str[9] = 'x';    
    printf("%s ",str);
}
*/

/** @Fn     void file_info(const char *file)
 *  @brief  通过stat函数打印file的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void file_info(const char *file)
{
    struct stat buf;
    if ( stat(file, &buf) != 0 )
    {
        printf("stat %s error! \n", file);
        exit (-1);
    }

    struct passwd *p_passwd;
    struct group *p_group;
    int i;
    char *p_time;

    p_time = ctime(&(buf.st_mtime));    // 获取文件时间
    p_passwd = getpwuid(buf.st_uid);    // get password file entry
    p_group = getgrgid(buf.st_gid);     // get grop file entry
    
    print_perm(buf.st_mode);
    printf(" %6d %s %s %12d ", buf.st_ino, p_passwd->pw_name, p_group->gr_name, buf.st_size);
    
    for ( i=0; (p_time[i] != 0) && (p_time[i] != '\n'); i++ )  // 打印时间
    {
        putchar(p_time[i]);
    }
    printf(" %s\n", file);

}


/** @Fn     void dir_info(const char *file)
 *  @brief  通过dir相关函数打印目录下面的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void dir_info(const char *file)
{
    DIR *dirp;
    struct dirent *dp;
    struct stat buf;

    dirp = opendir(file);
    if ( NULL == dirp )
    {
        printf("open dir %s error!\n", file);
        exit (-1);
    }
    chdir(file);

    while ( (dp = readdir(dirp)) != NULL )
    {
        if ( (0 == strcmp(dp->d_name, "."))|| (0 == strcmp(dp->d_name, "..")))
        {
            continue;
        }
        file_info(dp->d_name);
    }
    
}



/** @Fn     void show_file(const char *file)
 *  @brief  通过stat函数打印file的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void show_file(const char *file) 
{
    struct stat buf;
    
    if ( 0 == isDir(file) )             // 如果该文件是目录
    {
        printf("%s is a dir!\n", file); 
        dir_info(file);                 // 调用dir_info()显示信息
    }
    else
    {
        file_info(file);                // 调用file_info()显示信息
    }                       
}


/** @Fn     int main(int argc, char *argv[]) 
 *  @brief  函数入口
 *  @param  none
 *  @return 0 - true   1 - false
 */
int main(int argc, char *argv[])
{
    if ( argc != 3 )
    {
        printf("Input format error!\n");
        printf("<Usage> : ls -l file\n");
        exit (1);
    }
    
    if ( strcmp(argv[1], "-l") != 0 )
    {
        printf("Input format error!\n");
        printf("param is: -l\n");
        exit (1);
    }

    if ( access(argv[2], F_OK) != 0 )       // 判断文件是否存在
    {
        printf("file not exitst!\n");
        exit(-1);
    }

    show_file(argv[2]);

    return 0;
}






这些命令用于查看和检查系统的配置和日志文件。以下是每个命令的简要说明: 1. `cat /etc/pam.d/system-auth`: 显示 `/etc/pam.d/system-auth` 文件的内容,该文件用于管理系统级身份验证和授权。 2. `cat /etc/pam.d/sshd`: 显示 `/etc/pam.d/sshd` 文件的内容,该文件用于管理 SSH 服务的身份验证和授权。 3. `cat /etc/profile`: 显示 `/etc/profile` 文件的内容,该文件是一个全局配置文件,用于设置用户环境变量和执行系统级别的脚本。 4. `cat /etc/passwd`: 显示 `/etc/passwd` 文件的内容,该文件包含了系统中所有用户的基本信息,但不包含密码。 5. `cat /etc/shadow`: 显示 `/etc/shadow` 文件的内容,该文件包含了系统中用户的加密密码。 6. `cat /etc/group`: 显示 `/etc/group` 文件的内容,该文件包含了系统中用户组的信息。 7. `cat /etc/hosts.equiv`: 显示 `/etc/hosts.equiv` 文件的内容,该文件用于定义可信任主机列表,允许这些主机使用 rsh 或 rlogin 进行远程登录。 8. `cat /etc/hosts.rhosts`: 显示 `/etc/hosts.rhosts` 文件的内容,该文件用于定义远程主机和用户之间的信任关系。 9. `ps aux | grep telnet`: 列出所有正在运行的进程,并过滤出包含 "telnet" 关键字的进程。 10. `ps aux | grep rlogin`: 列出所有正在运行的进程,并过滤出包含 "rlogin" 关键字的进程。 11. `ps aux | grep ftp`: 列出所有正在运行的进程,并过滤出包含 "ftp" 关键字的进程。 12. `cat /etc/ssh/sshd_config`: 显示 `/etc/ssh/sshd_config` 文件的内容,该文件包含了 SSH 服务器的配置选项。 13. `umask`: 显示当前用户的默认文件权限掩码。 14. `ls -l /etc/passwd`: 显示 `/etc/passwd` 文件的详细信息,包括权限、所有者和修改时间等。 15. `ls -l /etc/group`: 显示 `/etc/group` 文件的详细信息,包括权限、所有者和修改时间等。 16. `ls -l /etc/shadow`: 显示 `/etc/shadow` 文件的详细信息,包括权限、所有者和修改时间等。 17. `ls -l /etc/xinetd.conf`: 显示 `/etc/xinetd.conf` 文件的详细信息,该文件是 xinetd 服务的配置文件。 18. `ls -l /etc/sudoers`: 显示 `/etc/sudoers` 文件的详细信息,该文件用于配置 sudo 命令的权限。 19. `ls -l /etc/httpd.conf`: 显示 `/etc/httpd.conf` 或 `/etc/apache2/apache2.conf` 文件的详细信息,这些文件是 Apache HTTP 服务器的配置文件。 20. `ls -l /etc/httpd-mpm.conf`: 显示 `/etc/httpd-mpm.conf` 文件的详细信息,该文件定义了 Apache MPM(多处理模块)的配置选项。 21. `ls -l /etc/conf/tomcat-users.xml`: 显示 `/etc/conf/tomcat-users.xml` 文件的详细信息,该文件包含了 Tomcat 服务器的用户配置。 22. `ls -l /etc/conf/web.xml`: 显示 `/etc/conf/web.xml` 文件的详细信息,该文件是 Java Web 应用程序的配置文件。 23. `ls -l /etc/conf/server.xml`: 显示 `/etc/conf/server.xml` 文件的详细信息,该文件是 Tomcat 服务器的主配置文件。 24. `ls -l /etc/my.cnf`: 显示 `/etc/my.cnf` 或 `/etc/mysql/my.cnf` 文件的详细信息,这些文件是 MySQL 数据库服务器的配置文件。 25. `ls -l /var/mysqllog/logbin.log`: 显示 `/var/mysqllog/logbin.log` 文件的详细信息,该文件是 MySQL 数据库二进制日志的位置。 26. `ps aux | grep syslogd`: 列出所有正在运行的进程,并过滤出包含 "syslogd" 关键字的进程。 27. `ps aux | grep rsyslogd`: 列出所有正在运行的进程,并过滤出包含 "rsyslogd" 关键字的进程。 28. `service syslog status`: 显示 syslog 服务的状态。 29. `service rsyslog status`: 显示 rsyslog 服务的状态。 30. `ps aux | grep audit`: 列出所有正在运行的进程,并过滤出包含 "audit" 关键字的进程。 31. `service auditd status`: 显示 auditd 服务的状态。 32. `ps aux | grep ssh`: 列出所有正在运行的进程,并过滤出包含 "ssh" 关键字的进程。 33. `ls -l /var/log/messages`: 显示 `/var/log/messages` 文件的详细信息,该文件包含了系统的一般日志消息。 34. `ls -l /var/log/secure`: 显示 `/var/log/secure` 文件的详细信息,该文件包含了安全相关的日志消息。 35. `ls -l /var/log/audit/audit.log`: 显示 `/var/log/audit/audit.log` 文件的详细信息,该文件包含了审计日志。 36. `tail -20 /var/log/messages`: 显示 `/var/log/messages` 文件的尾部 20 行内容。 37. `tail -20 /var/log/audit/audit.log`: 显示 `/var/log/audit/audit.log` 文件的尾部 20 行内容。 38. `tail -n 20 /var/log/messages`: 显示 `/var/log/messages` 文件的尾部 20 行内容。 39. `tail -n 20 /var/log/audit/audit.log`: 显示 `/var/log/audit/audit.log` 文件的尾部 20 行内容。 40. `cat /etc/logrotate.conf`: 显示 `/etc/logrotate.conf` 文件的内容,该文件用于配置日志文件的轮转。 41. `cat /etc/rsyslog.conf`: 显示 `/etc/rsyslog.conf` 文件的内容,该文件是 rsyslog 服务的配置文件。 42. `auditctl -s`: 显示当前系统上启用的审计规则。 43. `auditctl -l`: 列出当前系统上的所有审计规则。 44. `lsof -i:21`: 列出所有正在使用端口 21(FTP)的进程和文件。 45. `lsof -i:22`: 列出所有正在使用端口 22(SSH)的进程和文件。 46. `lsof -i:23`: 列出所有正在使用端口 23(Telnet)的进程和文件。 请注意,某些命令可能需要管理员权限才能运行,且需要小心处理敏感信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值