デフォルトのログファイルで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.
11907571
「Started Session of user」文字列を一致させてftpuser1
これを把握する必要があります。
セッション番号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
ユーザー名が含まれると'
どうなりますか?