fanotify是linux平台上新出現的一種檔案監控技術,常被用作防毒軟體或者病毒程式惡意訪問控制。之前有聽過或使用過inotify的,都知道inotify是相比於fanotify更早的檔案操作事件監控技術,fanotify是新出來的,實現的功能不比inotify多,但是他提供的對於監控檔案的事件比較重要的功能許可權檢查和訪問控制而inotify沒有提供,所以這一點優勢是其能存在的原因。
fanitify的使用思路也比較清晰。下面結合**我們來分析:
下面是設定核心引數的程式,主要用的幾個系統呼叫在裡面宣告了:
fanotify-syscalllib.h
#ifndef __fanotify_syscall_lib
#define __fanotify_syscall_lib
#include
#include
#if defined(__x86_64__)
# define __nr_fanotify_init 300
# define __nr_fanotify_mark 301
#elif defined(__i386__)
# define __nr_fanotify_init 338
# define __nr_fanotify_mark 339
#else
# error "system call numbers not defined for this architecture"
#endif
static
inline
intfanotify_init
(unsigned
int flags,
unsigned
int event_f_flags)
static
inline
intfanotify_mark
(int fanotify_fd,
unsigned
int flags, __u64 mask,
int dfd,
const
char
*pathname)
#endif
主要功能程式**:
fanotify.h
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
"fanotify-syscalllib.h"
const
int open =1;
const
int modify =2;
const
int close_modify =3;
const
int close =4;
class fanotify
;
fanotify.cpp
#include
"fanotify.h"
fanotify :
:fanotify()
fanotify ::~
fanotify()
void fanotify:
:detectopenclose()
}//設定監控物件為目錄下的子檔案
void fanotify:
:setnotifyobject
(std:
:string path)
std:
:cout <<
"初始化完成"
<< std:
:endl ;
uint64_t fanmask =0;
//設定在檔案open的時候,會通知本程式,同意訪問的話,本程式需要給核心發允許訪問標誌,然後其他程式才能繼續訪問,否則不能訪問
fanmask |
= fan_open_perm ;
fanmask |
= fan_all_perm_events ;
//fan_event_on_child 作用於當前操作目錄的所有子檔案
//fan_mark_add 新增監聽事件標誌的標誌
int ret =
fanotify_mark
(fanfd, fan_mark_add, fanmask|fan_event_on_child,
at_fdcwd, path.
c_str()
);if(ret <0)
std:
:cout <<
"物件處理完成"
<< std:
:endl ;
}int fanotify :
:getnotifyfd()
void fanotify:
:startlisten()
path[pathlen]
='\0'
;getevent
(metadata, len)
; std:
:cout <<
"檢測完成"
<< std:
:endl ;
}selectevent
(&rfd);}
std:
:cout <<
strerror
(errno)
<< std :
: endl ;
}int fanotify:
:selectevent
(fd_set* rfd)
}return1;
}int fanotify:
:getevent
(const
struct fanotify_event_metadata* metadata,
int len)
if(metadata->mask&fan_close)
if(metadata->mask&fan_close_nowrite)}if
(metadata->mask&fan_modify)
if(metadata->mask&fan_open_perm)
if(metadata->mask&fan_all_perm_events)
metadata =
fan_event_next
(metadata, len);}
return1;
}void fanotify:
:operationfile
(int fd)
close
(fd);}
int fanotify:
:handleperm
(const
struct fanotify_event_metadata *metadata)
main.cpp
#include
#include
"fanotify.h"
intmain
(int argc,
char
** ar**)
fanotify notify ;
notify.
setnotifyobject
(ar**[1]
);notify.
startlisten()
;return0;
}
執行
g++ fanotify.cpp main.cpp -o main
sudo ./main test
Redis 鎖機制與監控
redis沒有原子性,所以當前事務在操作時,其他事務可以修改,造成錯誤 redis還沒有隔離性 悲觀鎖 樂觀鎖 模擬轉賬業務 set money 100 set out 0 watch money 監控 money muti decrby money 20 incrby out 20 如果在事務提交...
Linux檔案監控
如果要讓伺服器保持最佳效能,你應該將 linux 伺服器的執行級別 runlevel 設定為 3 就是控制台模式,當你需要圖形化桌面的時候使用 startx 命令來啟動它。修改配置 etc inittab 找到 initdefault 一樣,將id 5 initdefault修改為 id 3 ini...
監控日誌檔案
環境 名稱主機名 ip服務端 wangyitong 192.168.232.128 客戶端wyt3 192.168.232.132 root wyt3 ls root wyt3 unzip pyscripts master.zip 解壓安裝包 root wyt3 cd pyscripts maste...