Linux和AIX主机获取主机帐号创建时间和最后一次登录时间

最近在获取Linux和Aix主机帐号创建时间和最后一次登录时间方法,跟大家分享下,如有不对多多指教:
首先说一下对于Linux而言没有创建时间这么一说,只能说是更新时间,
lastlog -u test 最后一次登录 Linux ,推荐
awk -F: ‘3==0 {print1}’ /etc/passwd 查看是否存在特权用户 Linux
ls -ll /home 显示用户创建时间 这种不准确,因为有些实例和用户名存在不一样的情况
awk -F “:” ‘2==!! {print1, $3}’ /etc/shadow | grep admin 查看帐号 对应1970年隔了多少天 ,在主机的密码文件中有距离1970相隔的天数,就是创建帐号的时间
date -d “1970-01-01 16972 days” “+%Y/%m/%d %H:%M:%S” 格式化到当前日期 得到的就是你帐号创建的天数
last |grep root | awk ‘NR==1{print 1, 4, 5, 6}’ aix获取某个帐号最后一次登录时间 这里提一下如果你想得到固定行的话可以awk 的NR==?这个命令来得到固定行的信息
cat /etc/security/passwd 获取帐号的更新时间,这个是针对AIX主机的,获取的密码文件有
(export LANG=en_US; lastlog |sed -n “2p” | awk ‘{print 9"" 5”-“ 6"" 7}’|sed ‘s/May/05/g’|sed ‘s/Jan/01/g’|sed ‘s/Feb/02/g’|sed ‘s/Mar/03/g’|sed ‘s/Apr/04/g’|sed ‘s/Jun/06/g’|sed ‘s/Jul/07/g’|sed ‘s/Aug/08/g’|sed ‘s/Sep/09/g’|sed ‘s/Oct/10/g’|sed ‘s/Nov/11/g’|sed ‘s/Dec/12/g’|sed ‘s/1月/01/g’|sed ‘s/2月/02/g’|sed ‘s/3月/03/g’|sed ‘s/4月/04/g’|sed ‘s/5月/05/g’|sed ‘s/6月/06/g’|sed ‘s/7月/07/g’|sed ‘s/8月/08/g’|sed ‘s/9月/09/g’|sed ‘s/10月/10/g’|sed ‘s/11 月/11/g’|sed ‘s/12月/12/g’)
针对Linux 时间格不一样的处理,sed和awk命令你可以理解成一个管道符起到一个过滤的作用,上面的sed -n “2p”代表取第二行跟awk NR==?类似。
对了,重要的一点是在取时间进行格式化的时候会遇到如下:
每行时间显示位置不是固定的情况

我用的比较笨的办法就是取第二列和第三列进行判断,因为你在用$取列元素的时候固定时间位置是不确定的,下面附上代码:

/*shadow是保存密码的,每一行分为8个字段(用冒号分隔),第一个字段是用户名(用户包括系统用户和普通用户),
     *第二个字段是密码(加密格式),系统用户是不能登录的,密码字段为星号(*);两个感叹号(!!)表示这个用户被锁定了,
     * awk -F ":" '{if($2!="!!")print $1,$2, $3}'  /etc/shadow 获取除了锁定帐号之外的帐号进行判断
     * 无法登录;美元符号($)出现在加密格式的密码里,起到分隔作用*/
    public String Str2Inputstr(String inStr,JSchCommand schCommand) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();//使用默认时区和语言环境获得一个日历。
        QueryRunner runner = DBUtil.getInstanceQueryRunner();
        String timeParam = null;
        try {
            timeParam = runner.query("SELECT param from t_sys_platform_param where name = 'ZOMBIE_ACCOUNT_DATE'", new ScalarHandler<String>(1));
        } catch (SQLException e) {
            loger.error("查询定义僵尸帐号的时间失败:" + e);
            e.printStackTrace();
        }
        cal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(timeParam));
        Date expireTime  = cal.getTime();//判断有没有在这个过期时间之前的登录时间,都可以定义成僵尸帐号,数据库查询出来,灵活配置
        String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
        Pattern pattern = Pattern.compile(ip);
        String result = "";
        String accType = "2";//帐号类型
        String createTime = "";//创建时间
        String lastLoginTime = "";//=最后一次login时间
        String cmdLastLoginTime = "";//=最后一次时间
        try {
            BufferedReader in = new BufferedReader(new StringReader(inStr));
            while ((result = in.readLine()) != null) {
                String[] account = result.split(" ");
                if (!("*".equals(account[1]) || "!!".equals(account[1]))) {//账号对应密码用8个:隔开第二个代表他们的是否有密码
                    schCommand.connect(1000 * 30);
                    createTime = schCommand.execCmd("date -d \"1970-01-01 "+ account[2] +"days\" \"+%Y/%m/%d %H:%M:%S\"");
                    schCommand.connect(1000 * 30);
                    ****lastLoginTime = schCommand.execCmd("(export LANG=en_US; lastlog -u "+account[0]+"|sed -n \"2p\" | awk '{print $2,$3'}) ");//这里就是取的第二列和第三列进行判断以便取相应位置的时间
                    if(lastLoginTime.contains("**")){//包含两个**代表从未登录过,可以认为是僵尸帐号
                        accType="3";
                    }else{//普通帐号或者管理帐号,还需判断是否为僵尸帐号
                        //如果不包含*,那么如果$3是ip地址话说明Username Port From  Latest每一列都有值那么
                        // 可以用(export LANG=en_US; lastlog -u root|sed -n "2p" | awk '{print $9"-"$5"-"$6" "$7}'|sed 's/May/05/g'|sed 's/Jan/01/g')去取值并且直接格式化时间,因为是一个标准能格式化的时间格式
                        String isIp = lastLoginTime.split(" ")[1];
                        Matcher matcher = pattern.matcher(isIp);
                        if(matcher.matches()){//验证如果是IP地址,格式化时间
                            cmdLastLoginTime = "(export LANG=en_US; lastlog -u"+ account[0]+" |sed -n \"2p\" | awk '{print $9\"-\"$5\"-\"$6\" \"$7}'|sed 's/May/05/g'|sed 's/Jan/01/g'|sed 's/Feb/02/g'|sed 's/Mar/03/g'|sed 's/Apr/04/g'|sed 's/Jun/06/g'|sed 's/Jul/07/g'|sed 's/Aug/08/g'|sed 's/Sep/09/g'|sed 's/Oct/10/g'|sed 's/Nov/11/g'|sed 's/Dec/12/g'|sed 's/1月/01/g'|se**d 's/2月/02/g'|sed 's/3月/03/g'|sed 's/4月/04/g'|sed 's/5月/05/g'|sed 's/6月/06/g'|sed 's/7月/07/g'|sed 's/8月/08/g'|sed 's/9月/09/g'|sed 's/10月/10/g'|sed 's/11 月/11/g'|sed 's/12月/12/g')";
                        }else{//如果不是IP地址也不包含*,读取位置需要变化(export LANG=en_US; lastlog -u root|sed -n "2p" | awk '{print $8"-"$4"-"$5" "$6}'|sed 's/May/05/g'),才能格式化时间
                            cmdLastLoginTime = "(export LANG=en_US; lastlog -u"+ account[0]+" |sed -n \"2p\" | awk '{print $8\"-\"$4\"-\"$5\" \"$6}'|sed 's/May/05/g'|sed 's/Jan/01/g'|sed 's/Feb/02/g'|sed 's/Mar/03/g'|sed 's/Apr/04/g'|sed 's/Jun/06/g'|sed 's/Jul/07/g'|sed 's/Aug/08/g'|sed 's/Sep/09/g'|sed 's/Oct/10/g'|sed 's/Nov/11/g'|sed 's/Dec/12/g'|sed 's/1月/01/g'|sed 's/2月/02/g'|sed 's/3月/03/g'|sed 's/4月/04/g'|sed 's/5月/05/g'|sed 's/6月/06/g'|sed 's/7月/07/g'|sed 's/8月/08/g'|sed 's/9月/09/g'|sed 's/10月/10/g'|sed 's/11 月/11/g'|sed 's/12月/12/g')";
                        }
                        schCommand.connect(1000 * 30);
                        lastLoginTime = schCommand.execCmd(cmdLastLoginTime);
                        Date lastLoginDate = dateFormat.parse(lastLoginTime);
                        int border = lastLoginDate.compareTo(expireTime);//判断是否在定义僵尸帐号时间的之前,如果是的话就是僵尸帐号不是就是普通帐号或者特权帐号**
                    }
//                  CorpseResult += account[0] + "\n";
                }else if ("*".equals(account[1])){//包含*说明是内置帐号
                accType = "4";
                }
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

猜你喜欢

转载自blog.csdn.net/yanghaibobo110/article/details/71745225