SSH登录服务器自动发邮件

python小脚本,nohup后台运行

Posted by on March 9, 2017

python 读取登录信息,并发送邮件

效果就是,每当有人通过 ssh 登录到阿里云服务器的时候就会将登录者的ip和登录时间发送一封邮箱到指定的邮箱里面。

获取登录信息

CentOS/var/log/wtmp 记录每个用户的登录IP,登录次数,持续时间等信息。

使用 smtplib 发送邮件

  1. 注意 发送方邮箱的密码,不是账号的密码。而是开启 SMTP 后获取的授权码

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#-*- coding:utf-8 -*-


import poplib,email
from email.header import decode_header
import smtplib
import time
import os,sys
import re

# 发送方邮箱服务器
smtp_server = 'smtp.163.com'
# 发送方显示名称
sender_nikename = 'vincent'
# 发送方邮箱
sender = '****@163.com'
# 发送方邮箱授权码(不是密码)
sender_password = '********'
# 接收方
receiver = '*****@**.com'

def sshuserinfo():
    tmpfile = os.popen("who /var/log/wtmp")
    count = 0
    userlist = []
    for line in tmpfile:
        count = count + 1
        userlist.append(line)
    pat = re.compile(r"\((.*)\)")
    valuelist = []
    if count > 0:
        result = pat.search(userlist[count - 1])
        valuelist.append(count)
        ipaddress = result.group(1)
        valuelist.append(ipaddress)
        alist = re.split("\s+",userlist[len(userlist)-1])
        valuelist.append(alist[2])       #时间年月日

        valuelist.append(alist[3])       #时间时分

    return valuelist

def sendmail(val):
    mail_to = smtplib.SMTP(smtp_server, 25)
    mail_to.login(sender, sender_password)
    msg = "From: " + sender_nikename + "<" + sender + """>
To: <""" + receiver + ">" + """
Subject: [有人远程登录了服务器] - sshusers added

someone ssh your host ,the user info is:
""" + val[1] + " " + val[2] + " " + val[3]
    mail_to.sendmail(sender, receiver, msg)
    mail_to.close()

if __name__ == '__main__':
    old_count = 0
    while 1:
        time.sleep(5)
        val = sshuserinfo()
        if len(val) > 0:
            if val[0] > old_count:
                print "add users"
                sendmail(val)
                old_count = val[0]

使用 nohup 后台执行

Linux 后台进程运行的方法有好几种,比如nohupsupervisorscreen等。这里使用nohup来简单使用

使用 nohup 命令

1
2
3
[root@iZ949j21i58Z ssh]# nohup python ssh_monitor.py &
[1] 19852
[root@iZ949j21i58Z ssh]# nohup: 忽略输入并把输出追加到"nohup.out"
  1. & 表示将程序放到后台执行,但是如果启动该程序的logout,则该进程随记终止
  2. nohup 使用 nohup命令后,原程序的标准输出被自动改向到当前目录的nohup.out文件,起到了log的作用,实现完整的守护进程功能。

终止 nohup 执行

1
2
3
4
[root@iZ949j21i58Z ssh]# ps -ef | grep ssh_monitor
root     19852 19781  0 11:03 pts/2    00:00:00 python ssh_monitor.py
root     19856 19781  0 11:03 pts/2    00:00:00 grep --color=auto ssh_monitor
[root@iZ949j21i58Z ssh]# kill 19852

关于Linux Python执行的进程

当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入输如,输出进行输入和输出。即时将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前前端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登录进程相脱,那么系统就像所有与这个终端联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反应是进程结束。

因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用nohup这一类的来启动相应程序。

守护进程

nohup启动的程序在进程执行完毕就退出了,比如kill 掉相关进程。而一些常见的服务进程通常永久的运行在后台,不想屏幕输出结果。 在 Linux/Unix 中这些永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始执行,系统关闭时才停止。如果偶然某个守护进程消失了,那么它提供的服务将不再能被使用。

CentOS 常见的守护进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
硬件管理守护进程
apmd
apmd (Advanced Power Management)是高级电源管理。传统的电源管理标准,对于笔记本电脑比较有用,可以了解系统的电池电量信
息。并将相关信息通过 syslogd  写入日志。也可以用来在电源不足时关机。
acpid
acpid (Advanced Configuration and Power Interface )是为替代传统的 APM  电源管理标准而推出的新型电源管理标准。通常笔记本电
脑需要启动电源进行管理。
alsasound Alsa 声卡驱动守护程序。 Alsa 和  OSS/Free 及  OSS/Linux 兼容,但是有自己的接口,甚至比OSS优秀。
cups cups(Common UNIX Printing System) 是通用UNIX打印守护进程,为Linux 提供第三代打印功能。
cups-config-
daemons
cups  打印系统切换守护进程。
cups-lpd cups  行打印守护进程。
lpd lpd  是老式打印守护程序,负责将 lpr  等程序提交给打印作业。
gpm
gpm(General Purpose Mouse Daemon  )守护进程为文本模式下的 Linux  程序如 mc(Midnight Commander) 提供了鼠标的支持。它
也支持控制台下鼠标的拷贝,粘贴操作以及弹出式菜单。
irqbalance 对多个系统处理器环境下的系统中断请求进行负载平衡的守护程序。如果你只安装了一个CPU,就不需要加载这个守护程序。
kudzu
硬件自动检测程序,会自动检测硬件是否发生变动,并相应进行硬件的添加、删除工作。当系统启动时,kudzu会对当前的硬件进行检测,并
且和存储在 /etc/sysconfig/hwconf 中的硬件信息进行对照,如果某个硬件从系统中被添加或者删除时,那么 kudzu  就会察觉到,并且通知
用户是否进行相关配置,然后修改 /etc/sysconfig/hwconf ,使硬件资料与系统保持同步。如果 /etc/sysconfig/hwconf  这个文件不存在,
那么kudzu将会从 /etc/modprobe.conf 、/etc/sysconfig/network-scripts/ 和 /etc/X11/XF86Config  中探测已经存在的硬件。如果你
不打算增加新硬件,那么就可以关闭这个启动服务,以加快系统启动时间。
lm_seroems 检测主板工作情况守护进程。
mdmonitor RAID  相关设备的守护程序。
microcode_ctl 可编码以及发送新的微代码到内核以更新 Intel IA32  系列处理器守护进程。
pcmcia 主要用于支持笔记本电脑接口守护进程。
rawdevices 在使用集群文件系统时用于加载 raw  设备的守护进程。
smartd Self Monitor Analysis and Reporting Technology System,监控你的硬盘是否出现故障。

系统管理守护进程
atd at和batch 命令守护进程,用户用at命令调度的任务。batch 用于在系统负荷比较低时  运行批处理任务。
anacron
一个自动化运行任务守护进程。CentOS 随带四个自动化任务的工具:cron、 anacron 、at、和 batch。  当你的Linux 服务器并不是全天运
行,这个 anacron  就可以帮你执行在”crontab” 设定的时间内没有执行的工作。
crond cron  周期地运行用户  调度任务。
cpuspeed 监测系统空闲百分比,降低或加快CPU时钟速度和电压从而在系统空闲时将能源消耗降为最小,而在系统繁忙时最大化加快系统执行速度。
iiim 中文输入法服务器守护进程。

psacct 该守护进程包括几个工具用来监控进程活动的工具,包括ac,lastcomm, accton  和sa。
random 保存和恢复系统的高质量随机数生成器,这些随机数是系统一些随机行为提供的。
syslog 一个让系统引导时启动 syslog  和 klogd  系统日志守候进程的脚本。
xfs X Window 字型服务器守护进程,为本地和远程 X  服务器提供字型集。
yum-updatesd RPM 操作系统自动升级和软件包管理守护进程。
文件服务守护进程
amd 自动安装NFS守护进程。
atalk AppleTalk 网络守护进程。注意不要在后台运行该程序,该程序的数据结构必须在运行其他进程前先花一定时间初始化。
autofs 自动安装管理进程automount,与NFS相关,依赖于NIS服务器。
netdump 远程网络备份服务器守护进程。
diskdump 服务器磁盘备份守护进程。
portmap 该守护进程用来支持RPC连接,RPC 被用于 NFS  以及 NIS  等服务。
netfs Network Filesystem Mounter,该进程安装和卸载NFS、SAMBA和NCP网络文件系统。
nfs 网络文件系统守护进程。
nfslock NFS是一个流行的通过TCP/IP网络共享文件的协议,此守护进程提供了NFS文件锁定功能。
rsync remote sync  远程数据备份守护进程。

数据库管理守护进程
arptables_jf 为 arptables  网络的用户控制过滤的守护进程。
arpwatch 记录日志并构建一个在LAN 接口上看到的以太网地址和IP 地址对数据库。
bootparamd 引导参数服务器,为LAN 上的无盘工作站提供引导所需的相关信息。
ldap ldap(Lightweight Directory Access Protocol )目录访问协议服务器守护进程。
mysqld 一个快速高效可靠的轻型  SQL   数据库引擎守护进程。
postgresql PostgreSQL  关系数据库引擎。
ypbind 为NIS(网络信息系统)客户机激活 ypbind 服务进程。
yppasswdd NIS口令服务器守护进程。
ypserv NIS 主服务器守护进程。

网络设备守护进程
bluetooch 蓝牙服务器守护进程。
netplugd
netplugd(network cable hotplug management daemon )守护程序,用于监控一个或多个网络接口的状态,当某些事件触发时运行一个
外部脚本程序。
messagebus
D-BUS 是一个库,为两个或两个以上的应用程序提供一对一的通讯。 dbus-daemon-1  是一个应用程序,它使用这个库来实现 messagebus 守
护程序。多个应用程序通过连接 messagebus  守护程序可以实现与其他程序交换信息。
pppoe ADSL连接守护进程。
irda 红外端口守护进程。
isdn isdn启动和中止服务守护进程。
snmpd 本地简单网络管理守护进程。
network 激活/ 关闭启动时的各个网络接口守护进程。
iptables iptables 防火墙守护进程。

网络服务守护进程
chargen
使用 tcp 协议的 chargen server ,chargen(Character Generator Protocol)是一种网络服务,主要功能是提供类似远程打字
的功能。
chargen-udp 使用UDP协议的chargen server 。
dhcpd 动态主机控制协议(Dynamic Host Control Protocol)的服务守护进程。

daytime 使用TCP 协议的 Daytime 守护进程,该协议为客户机实现从远程服务器获取日期  和时间的功能。预设端口:13。
daytime-udp 使用 UDP  协议的 Daytime 守护进程。
time 该守护进程从远程主机获取时间和日期,采用TCP 协议。
time-udp 该守护进程从远程主机获取时间和日期,采用UDP协议。
dc_server 使用SSL 安全套接字的代理服务器守护进程。
dc_client 使用SSL 安全套接字的客户端守护进程。
echo 服务器回显客户数据服务守护进程。
echo-udp 使用UDP协议的服务器回显客户数据服务守护进程。
named DNS(BIND)服务器守护进程。
gated 网关路由守护进程。它支持各种路由协议,包括RIP版本1和2、DCN HELLO 协议、 OSPF 版本2以及EGP 版本2到4。
httpd Web服务器Apache 守护进程,可用来提供HTML文件以  及CGI 动态内容服务。
innd Usenet新闻服务器守护进程。
ntpd Network time Protocol daemon(网络时间校正协议)。ntpd是用来使系统和一个精确的时间源保持时间同步的协议守护进程。
proftpd proftpd  是Unix下的一个配置灵活的 ftp 服务器的守护程序。
readahead 、
readahead_early
readahead 和readahead_early 是在Fedora core 2中最新推出的两个后台运行的守护程序。其作用是在启动系统期间,将启动系
统所要用到的文件首先读取到内存中,然后在内存中进行执行,以加快系统的启动速度。
routed 该守护程序支持RIP协议的自动IP 路由表维护。RIP主要  使用在小型网络上,大一点的网络就需要复杂一点的协议。
rsh 远程主机上启动一个shell,并执行用户命令。
rwhod 允许远程用户获得运行rwho 守护程序的机器上所有已登录用户的列表。
rstatd 一个为LAN 上的其它机器收集和提供系统信息的守候进程。
ruserd 远程用户定位服务。  这是一个基于RPC的服务,它提供关于当前记录到 LAN  上一个机器日志中的用户信息
rwalld 远程用户消息发送服务。这是一项基于RPC的服务,允许用户给每个注册到 LAN  机器上的其他终端写消息。
rwhod rwhod  服务进程,它支持 LAN  的 rwho 和 ruptime  服务。
saslauthd 使用 SASL 的认证守护进程。
sendmail sendmail MTA 守护进程。
postfix postfix MTA 守护进程。
smb Samba  文件共享/ 打印服务守护进程。
squid 代理服务器squid 守护进程。
sshd OpenSSH  服务器守护进程。Secure Shell Protocol可以实现安全地远程管理主机。
tux 在Linux 内核中运行apache 服务器的守护进程。
vsftpd vsftpd 服务器的守护进程。
vncserver VNC (Virtual Network Computing ,虚拟网络计算),它提供了一种在本地系统上显示远程计算机整个” 桌面” 的轻量型协议。
inetd
因特网操作守护程序。监控网络对各种它管理的服务的需求,并在必要的时候启动相应的服务程序。在 Redhat  和 Mandrake  中被
xinetd 代替。Debian, Slackware, SuSE仍然使用。
xinetd 支持多种网络服务的超级服务器守护进程。
eklogin 使用 kerberos 5 加密的一种rlogin 会话鉴证守护进程。
gssftp 使用 kerberos 5 认证的 ftp 守护进程
krb5-telnet 使用 kerberos 5 认证的 telnet  守护进程。
klogin 使用 kerberos 5 认证远程登录守护进程。
kshell 使用 kerberos 5 认证的远程 Shell 守护进程。