Linux和AIX主机获取主机帐号创建时间和最后一次登录时间
来源:互联网 发布:网络文员兼职 编辑:程序博客网 时间:2024/06/01 10:25
最近在获取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
cat /etc/security/passwd 获取帐号的更新时间,这个是针对AIX主机的,获取的密码文件有
(export LANG=en_US; lastlog |sed -n “2p” | awk ‘{print
针对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; }
- Linux和AIX主机获取主机帐号创建时间和最后一次登录时间
- 虚拟机linux和主机时间同步
- 虚拟机linux和主机时间同步
- Linux主机间同步时间
- AIX和LINUX主机 CPU 内存 磁盘使用率监控
- AIX和Linux系统时间修改
- 获取AIX文件最后修改时间,类似Linux的time-style显示的时间格式
- 获取UNIX主机当前时间的函数
- Oracle VM VirtualBox 虚拟机和主机时间同步问题
- 取得每个用户登录次数和最后登录的时间
- Java读取文件创建时间和最后修改时间
- Java读取文件创建时间和最后修改时间
- java查看主机指定文件最后修改时间
- C++ win环境修改文件创建时间、最后的修改时间和最后的访问时间
- 修改LINUX主机时间,永久有效!
- linux主机时间同步总结(ntpdate)
- 虚拟机linux与主机时间同步
- Linux修改时间,云主机情况下
- 《Android群英传》笔记3——Android控件架构
- 用java读取properites文件值,并且将值存入类变量(static )以方便获取
- 在ubuntu上安装Cmake、opencv2.4.9、PCL1.8、g2o
- Android 动画
- 误删手机联系人怎么恢复
- Linux和AIX主机获取主机帐号创建时间和最后一次登录时间
- alias编写自己的linux命令
- 设计模式
- 76. Minimum Window Substring
- 适配器模式
- HDU5944
- 使用Word写测试用例遇到页码从第三页开始问题
- LeetCode OJ-392.Is Subsequence
- 奔跑的人生