我已启用SFTP登录日志到默认日志文件中/var/log/syslog
,并尝试过滤每个用户的登录时间并插入数据库。
但过滤并没有按照我的预期进行。
示例日志文件:
Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Reached target Shutdown.
Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Starting Exit the Session..c.
Jun 23 15:47:03 ip-172-16-0-62 systemd[24938]: Received SIGRTMIN+24 from PID 24980 (kill).
Jun 23 15:47:03 ip-172-16-0-62 systemd[1]: Stopped User Manager for UID 1051.
Jun 23 15:47:03 ip-172-16-0-62 systemd[1]: Removed slice User Slice of nidasu.
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Created slice User Slice of ftpuser1.
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Starting User Manager for UID 1069...
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Started Session 11907571 of user ftpuser1.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Listening on REST API socket for snapd user session agent.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Paths.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Timers.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Sockets.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Basic System.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Reached target Default.
Jun 23 15:47:13 ip-172-16-0-62 systemd[24987]: Startup finished in 15ms.
需要过滤用户登录消息,例如:
Jun 23 15:47:13 ip-172-16-0-62 systemd[1]: Started Session 11907571 of user ftpuser1.
我需要通过匹配字符串“Started Session 11907571
of user ftpuser1
”来 grep 出来
会话号11907571
是一个随机数,用户名也不同,因此 grep 可以忽略数字和用户名,只需要检查如下字符串:**“Started Session *** of user ***”
并需要解析该行和grep
用户date + time
名,然后将其插入 MySQL 数据库。
如果有任何选项可以创建一个守护进程来运行并将详细信息插入数据库,它将帮助我完成该任务。
答案1
解决方案草图TXR 口齿不清。
(defvarl db-user "user")
(defvarl db-pw "password")
(defun mysql-insert (db-name table-name . values)
(let* ((alist (plist-to-alist values))
(columns [mapcar car alist])
(values [mapcar cdr alist]))
;; fix as necessary, remove echo
(sh `echo mysql -u @{db-user} -p@{db-pw} -e \ \
"INSERT INTO @{db-name}.${table-name} (@{columns ", "}) \ \
VALUES ('@{values "', '"}')"`)))
;; (daemon nil nil) ;; uncomment to daemonize
(let ((log (open-tail "syslog")))
(whilet ((line (get-line log)))
(if-match `@mon @day @hh:@mm:@ss @nil systemd[@pid]: Started Session @num of user @user.` line
(mysql-insert "log-db" "sftp-table"
'date `@mon @day @hh:@mm:@ss`
'user user))))
当我对数据运行此命令时,它会扫描日志并打印 MySQL 命令:
$ txr daemon.tl
mysql -u user -ppassword -e INSERT INTO log-db.name (date, user) VALUES ('Jun 23 15:47:13', 'ftpuser1')
然后,它等待更多数据添加到日志中。打开的流的open-tail
工作方式类似于tail -f
日志文件。它会自动检测文件何时被旋转,甚至在通过重命名旋转文件时也能工作。如果syslog
重命名为并开始写入syslog.1
新文件,它将随之而来。syslog
说到syslog
,显然这还需要指向真实的文件,除了其他编辑才能使其工作,例如将日期调整为所需的格式,使用真实的数据库、表和列名称等。
数据库密码可以通过环境变量或命令行参数输入。但如果这是作为守护进程运行,则必须将其记录下来某处。
插入values
数据库命令必须正确转义;如果用户名'
出于某种原因包含怎么办?