Linux登录提示(静态/动态MOTD)
在用户输入密码或使用密钥成功登录后,让服务器自动为我们执行几个简单的 *** 作,如打印提示信息、打印异常信息、执行脚本或发送邮件等。能够提前向登录提示信息,可以让我们在登录采取任何行动之前,快速了解机器的重要信息。看起来是不是很有趣?我们可能认为这对服务器的安全性没有直接影响,而且每次刚登录就执行一系列命令和脚本(比如收集服务器资源使用情况的信息)似乎有点多余。所以如果是生产环境下的Linux服务器,需要配置登录提示,比如登录执行命令、脚本等。,我们不必为此编写复杂庞大的脚本,脚本的执行时间很关键。如果您不想在正确输入登录密码后等待几秒钟或更长时间,那么请尝试将脚本的执行时间优化到毫秒级甚至更低。(登录后的提示或 *** 作最好尽量简单有益。如果你想这样做)
在大多数Linux发行版中,您可以直接修改/etc/motd文件,通过将要打印的提示消息文件粘贴到文件中来定制任何所需的提示信息(一些可执行命令或脚本在文件中仅被视为普通字符/文本)。除非我们手动修改,否则/etc/motd中的文本消息是固定的。因此,/etc/MOTD中的定制消息是一个静态MOTD。
如果你用过Debian/Ubuntu发行版,你可能会发现Ubuntu已经默认有了动态MOTD消息提示(通过SSH或者本地登录时会显示系统的一些当前信息)。在RHEL/CentOS中不可能实现像Debian/Ubuntu中那样的功能,因为RHEL/CentOS没有提供任何与之相关的脚本。我们可以通过环境变量文件,如/etc/profile、/etc/bashrc等,将需要执行的命令或脚本添加到这些文件的末尾。,这样每次用户登录时,系统都会读取这些文件,并执行文件中定义的脚本。此外,还可以使用crontab进行任务规划,定期执行预先准备好的脚本,比如通过crontab在后台进行系统监控和异常信息收集,并将收集到的信息重定向到/etc/motd文件。当用户登录系统时,可以显示系统监控和异常处理信息。
在Ubuntu中,目录/etc/update-motd.d/中提供了一组脚本。用户登录时,按照以脚本名为前缀的数字序列(00-99)执行,这些脚本的输出保存在/run/motd.dynamic文件中,最终用户登录成功后,打印在登录屏幕界面中。输出结果如下图所示。
/etc/update-motd.d/script列表:
00-标题
10-帮助-文本
50-风景-sysinfo
90-更新-可用
91-发布-升级
98-fsck-重启时
98-需要重新启动
以上是Ubuntu14.04LTS中提供动态MOTD消息的默认脚本。这些脚本可以修改或添加自己的脚本。例如,用您自己定制的脚本替换它。
以下是在RHEL/CentOS自定义MOTD的一些简单示例:
打印提示信息、执行脚本或发送电子邮件。
l任何远程或本地登录的用户都会打印一条提示消息(如果提示用户这是一个重要的服务器,用户要小心)
>;>启动SSH服务以打印MOTD消息,并配置文件/etc/ssh/sshd_config,并确认它是否配置如下(默认为yes)
PrintMotd yes>;>修改/etc/motd文件并将提示消息粘贴到其中。
[root@localhost ~]# cat /etc/motd *************************************************** * 注意: 这是一台重要的生产服务器,请谨慎 *** 作!! * * 如需要重启/关闭服务器,请先将NFS卸载 * ***************************************************>;>保存后,使用SSH登录服务器。输入正确的账户密码后,提示如下
当然,像这样简单的提示是不够的。我们可以根据这台服务器的特点、正在运行的服务、文件系统信息以及重要细节打印出来,以便其他IT人员在登录这台服务器时,在采取任何行动之前,快速掌握这台服务器的重要信息。也能起到警醒的作用。可以根据自己的情况定制。
以升/厘沲为单位打印动态MOTD提示
>;>任何通过SSH远程登录的用户都会得到如下提示
>;>创建系统信息收集脚本
[root@HMing ~]# vim /usr/src/scripts/system_info.sh #!/bin/bash date=`date "+%F %T"` head="System information as of: $date" kernel=`uname -r` hostname=`echo $HOSTNAME` #Cpu load load1=`cat /proc/loadavg | awk '{print $1}'` load5=`cat /proc/loadavg | awk '{print $2}'` load15=`cat /proc/loadavg | awk '{print $3}'` #System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) up_lastime=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` #Memory Usage mem_usage=`free -m | awk '/Mem:/{total=$2} /buffers\/cache/ {used=$3} END {printf("%3.2f%%",used/total*100)}'` swap_usage=`free -m | awk '/Swap/{printf "%.2f%",$3/$2*100}'` #Processes processes=`ps aux | wc -l` #User users=`users | wc -w` USER=`whoami` #System fs usage Filesystem=$(df -h | awk '/^\/dev/{print $6}') #Interfaces INTERFACES=$(ip -4 ad | grep 'state ' | awk -F":" '!/^[0-9]*: ?lo/ {print $2}') echo echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" echo "$head" echo "----------------------------------------------" printf "Kernel Version:\t%s\n" $kernel printf "HostName:\t%s\n" $hostname printf "System Load:\t%s %s %s\n" $load1, $load5, $load15 printf "System Uptime:\t%s "days" %s "hours" %s "min" %s "sec"\n" $upDays $upHours $upMins $upSecs printf "Memory Usage:\t%s\t\t\tSwap Usage:\t%s\n" $mem_usage $swap_usage printf "Login Users:\t%s\t\t\tWhoami:\t\t%s\n" $users $USER printf "Processes:\t%s\n" $processes printf "\n" printf "Filesystem\tUsage\n" for f in $Filesystem do Usage=$(df -h | awk '{if($NF=="'''$f'''") print $5}') echo -e "$f\t\t$Usage" done printf "\n" printf "Interface\tMAC Address\t\tIP Address\n" for i in $INTERFACES do MAC=$(ip ad show dev $i | grep "link/ether" | awk '{print $2}') IP=$(ip ad show dev $i | awk '/inet / {print $2}') printf $i"\t\t"$MAC"\t$IP\n" done echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" echo>;>向脚本添加执行权限。
[root@HMing ~]# chmod +x /usr/src/scripts/system_info.sh>;>将脚本的路径名添加到/etc/profile文件的末尾。
[root@HMing ~]# tail -1 /etc/profile /usr/src/scripts/system_info.shl任何用户在远程或本地登录后发送电子邮件信息
>;>演示如下
>;>发送以下电子邮件
>;>创建一个脚本/usr/src/scripts/my-server-login-mail来发送邮件,如下所示
#!/bin/bash smtp=smtp.163.com smtp_auth_user=xxxxxx smtp_auth_password=xxxxxxxxxx from=xxxxxxxx@163.com function HEAD { Kernel_version=`uname -r` Login_user=`last -a | grep "logged in" | wc -l` Up_lastime=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` Up_runtime=`cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second =$1 % 60;printf("%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'` Last_user=`last | awk '(/pts/) && (/-/){print "User: "$1" - ""OlineTime: "$NF" - ""IP: "$3" - ""LoginTime: "$4" "$5" "$6" " $7}'| head -1 | sed -e 's/(//g' -e 's/)//g'` echo -e "" echo -e "\ 邮件提示: 未知身份来源使用${USER}用户登录系统 ------------------------------------------------------------- System information 主机名: $HOSTNAME 内核版本: $Kernel_version 系统已运行时间: $Up_runtime 上一次重启时间: $Up_lastime 当前登入用户数: $Login_user 上一次登入用户: $Last_user ------------------------------------------------------------- " };HEAD >/tmp/.loginmail title="主机:`echo $HOSTNAME`登录提示 (`date "+%F %T"`)" body=`cat /tmp/.loginmail` to=741616710@qq.com sendEmail -s "$smtp" -xu "${smtp_auth_user}" -xp "${smtp_auth_password}" -f "$from" -t "$to" -u "$title" -m "$body" &>/dev/null && rm -rf /tmp/.loginmailLinux中有许多电子邮件程序。这里我用sendEmail,你也可以用其他邮件程序。
>;>将脚本绝对路径名添加到/etc/profile文件的末尾。
[root@HMing ~]# tail -1 /etc/profile /usr/src/scripts/my-server-login-mail标签
动态MOTD在Ubuntu中是开箱即用的,因为它已经集成到了系统的一个模块中,这个模块是通过pam_motd调用的,但是,我们可以随时修改系统上预先配置好的脚本,放在/etc/update-motd.d/目录下。比如用户登录,会第一时间反馈给用户,或者可以实时监控系统登录记录。通过给用户发送邮件,用户可以很快知道服务器是否被***。对于RHEL/CentOS分布,我也给出了几个简单的演示例子来实现动态MOTD。有兴趣的同学可以作为参考。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)