Windows命令-域内信息收集

判断是否存在域

ipconfig

查看网关 IP 地址、DNS 的 IP 地址、域名、本机是否和 DNS 服务器处于同一网段。

1
2
3
4
5
6
7
8
9
10
11
12
ipconfig /all
C:\Users\daniel10> ipconfig /all

Windows IP 配置
主 DNS 后缀 . . . . . . . . . . : teamssix.com
DNS 后缀搜索列表 . . . . . . . . : teamssix.com

以太网适配器 Ethernet0:
IPv4 地址 . . . . . . . . . . .. : 192.168.7.110
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.7.1
DNS 服务器 . . . . . . . . . . . : 192.168.7.7

接着使用 nslookup 解析域名的 IP 地址,查看是否与 DNS 服务器为同一 IP

1
2
3
4
5
6
nslookup teamssix.com
C:\Users\daniel10> nslookup teamssix.com
服务器: UnKnown
Address: 192.168.7.7
名称: teamssix.com
Address: 192.168.7.7

系统详细信息

1
2
3
systeminfo
C:\Users\daniel10> systeminfo | findstr 域
域: teamssix.com

当前登录域与域用户

1
2
3
4
5
net config workstation
C:\Users\daniel10> net config workstation | findstr 域
工作站域 TEAMSSIX
工作站域 DNS 名称 teamssix.com
登录域 TEAMSSIX

判断主域

1
2
3
4
net time /domain
C:\Users\daniel10> net time /domain
\\dc.teamssix.com 的当前时间是 2021/2/13 20:49:56
命令成功完成。

一次Docker应用排查过程

背景

重新发布了一个应用,发现无法访问,把排查过程记录一下。

检查docker程序和开放端口

运行下面语句:

1
sudo docker ps

发现docker都在运行。

运行下面语句:

1
sudo netstat -tunpl

检查开放端口,端口开放正常。

检查frp的状态

运行下面语句:

1
sudo systemctl status frp

由于是通过frp穿透内网的,要看一下是否是frp问题,查看日志,没有报错。

检查内网网页状态

访问内网ip,报错:502 Bad Gateway

运行一下语句,查看docker日志:

1
sudo docker logs ee86b3ee2451

其中 ee86b3ee2451 为容器ID

运行下面语句,查看实时docker日志:

1
sudo docker logs -f ee86b3ee2451

进入Docker查看

如果还是有问题,运行下面语句,查看docker内部情况

1
sudo docker exec -it ee86b3ee2451 bash

总结

经过一番折腾,发现还是docker本身的问题,restart一下就好了,运行以下语句:

1
sudo systemctl restart docker

Django 的日志机制-4

进阶

其实,如果只是为了排错方便,记录一些日志,自定义类基本可以满足要求。但如果要记录访问系统的所有请求日志,那就无能为力了,因为不可能手动在每个接口代码加日志,也没必要。

这个时候,很自然就能想到 Django 中间件了。

Django 中间件

定义中间件类,包括 Filters 代码和 middleware 代码,在本地app文件夹中创建目录:middlewares,目录下创建文件 LogMiddleware.py :

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
from django.utils.deprecation import MiddlewareMixin
import threading
import logging
import json
import socket

local = threading.local()

class RequestLogFilter(logging.Filter):
"""
日志过滤器
"""

def filter(self, record):
record.sip = getattr(local, 'sip', 'none')
record.dip = getattr(local, 'dip', 'none')
record.body = getattr(local, 'body', 'none')
record.path = getattr(local, 'path', 'none')
record.method = getattr(local, 'method', 'none')
record.username = getattr(local, 'username', 'none')
record.status_code = getattr(local, 'status_code', 'none')
record.reason_phrase = getattr(local, 'reason_phrase', 'none')

return True

class RequestLogMiddleware(MiddlewareMixin):
"""
将request的信息记录在当前的请求线程上。
"""

def __init__(self, get_response=None):
self.get_response = get_response
self.apiLogger = logging.getLogger('web.log')

def __call__(self, request):

try:
body = json.loads(request.body)
except Exception:
body = dict()

if request.method == 'GET':
body.update(dict(request.GET))
else:
body.update(dict(request.POST))

local.body = body
local.path = request.path
local.method = request.method
local.username = request.user
local.sip = request.META.get('REMOTE_ADDR', '')
local.dip = socket.gethostbyname(socket.gethostname())

response = self.get_response(request)
local.status_code = response.status_code
local.reason_phrase = response.reason_phrase
self.apiLogger.info('system-auto')

return response
More...

算法练习:BM1 反转链表

题目内容

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0 ≤ n ≤1000

要求:空间复杂度 O(1) ,时间复杂度 O(n) 。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

我的思路

在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。借用网上一个图解:

More...

牛客网 面试必刷TOP101 算法题

介绍

发现一个除了Leecode以外比较好的刷算法的网站:

牛客网在线编程_算法篇_面试必刷TOP101 (nowcoder.com)

据说是收集了很多面试题精选的题目

题目例子

BM83 字符串变形

描述

对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: 1≤n≤1061≤n≤106 , 字符串中包括大写英文字母、小写英文字母、空格。

进阶:空间复杂度 O(n) , 时间复杂度 O(n)

输入描述:

给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)

返回值描述:

请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。

示例1

输入:
"This is a sample",16

返回值:
"SAMPLE A IS tHIS"

Python实现

参考了答案,我的代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def trans(self, s: str, n: int) -> str:
word_list = list(s.split(" "))[::-1]
new_str = " ".join(word_list)
res = ""
for i in range(n):
if new_str[i] <= "Z" and new_str[i] >= "A":
res += chr(ord(new_str[i]) - ord("A") + ord("a"))
elif new_str[i] <= "z" and new_str[i] >= "a":
res += chr(ord(new_str[i]) - ord("a") + ord("A"))
else:
res += new_str[i]
print(res)
return res

其中以下写法值得借鉴:

  1. 倒序的实现为 list(s.split(" "))[::-1]
  2. 字母变为小写:chr(ord(new_str[i]) - ord(“A”) + ord(“a”))
  3. 另外 用 swapcase() 函数更简洁

界面和操作

界面如下:

操作还比较方便,有语法提示,有调试界面。

mermaid 插件语法错误解决

问题

之前安装的mermaid插件,用下来一直很好,但最近出了问题,脚本无法运行,报错:
Syntax error in graph mermaid version 8.14.0
error

解决方法

比较头疼的是,这个error没有具体错误信息,一开始解决起来无从下手。只好祭出替换大法,从少到多逐步替换,终于发现问题。
可能是由于这个插件为老外开发的,内容中出现全角的标点符号就会出错,包括“,”,“:” 等,把这些标点符号都换成半角的,就不会报错了。比较奇怪的是,汉字显示是没有问题的,可能是标点符号和正常的汉字不在一个编码范围。

Django 的日志机制-3

实现方式

其实最简单的方式就是直接在文件开头 import,然后程序中调用,像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# import the logging library
import logging
# Get an instance of a logger
logging.basicConfig(
format='%(asctime)s - %(pathname)s[%(lineno)d] - %(levelname)s: %(message)s',
level=logging.INFO)

logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')

但这种方式并不好,如果在每个文件开头都这样写一遍,第一是麻烦,第二是如果哪天要改变输出日志格式,那每个文件都要改一遍,还不累死。

很显然,如果能封装成一个类,用的时候调用这个类,修改的时候也只需要修改这一个地方:

More...

Django 的日志机制-2

logging 结构

在 Django 中使用 Python 的标准库 logging 模块来记录日志,关于 logging 的配置,我这里不做过多介绍,只写其中最重要的四个部分:LoggersHandlersFilters 和 Formatters

Loggers

Logger 即记录器,是日志系统的入口。它有三个重要的工作:

  • 向应用程序(也就是你的项目)公开几种方法,以便运行时记录消息
  • 根据传递给 Logger 的消息的严重性,确定消息是否需要处理
  • 将需要处理的消息传递给所有感兴趣的处理器 Handler

每一条写入 Logger 的消息都是一条日志记录,每一条日志记录都包含级别,代表对应消息的严重程度。常用的级别如下:

  • DEBUG:排查故障时使用的低级别系统信息,通常开发时使用
  • INFO:一般的系统信息,并不算问题
  • WARNING:描述系统发生小问题的信息,但通常不影响功能
  • ERROR:描述系统发生大问题的信息,可能会导致功能不正常
  • CRITICAL:描述系统发生严重问题的信息,应用程序有崩溃的风险

当 Logger 处理一条消息时,会将自己的日志级别和这条消息配置的级别做对比。如果消息的级别匹配或者高于 Logger 的日志级别,它就会被进一步处理,否则这条消息就会被忽略掉。

当 Logger 确定了一条消息需要处理之后,会把它传给 Handler

More...

远程开发的VS Code方法

背景

远程开发并非仅仅是直接在服务器上编辑代码,远程开发侧重的不应该是是“远程”,而是“开发”,至于“远程”对用户而言应该是无感的,除了代码是在远程服务器上存储和运行,其他体验应该和本地开发一致,撰写代码时能享受到 IDE 带来的便利,运行代码时不必额外去上传下载——这似乎看起来很容易,但在VS Code Remote 出现之前,没有工具能做到。

使用 VS Code Remote,你可以无缝的从一台设备切换到另一台设备,开会前在台式机上写代码,开会时拿起笔记本连上远程服务器就能继续,下班可以直接关掉公司的电脑,回到家打开家里的电脑就可以继续,设备切换从来没有如此方便,你不必关心这一切是如何实现的,只要使用就好,因为大部分时间你并不会觉得这和以前的本地开发有什么区别。

安装及配置流程

远程开发必备扩展安装

在扩展中搜索 remote ,找到 Remote Development,安装即可,会为你安装包括 Remote-SSH 等全部远程开发使用的扩展。

安装完成后,你会发现左下角多了一个小图标,点击就可以看到用来连接远程开发的菜单了。

More...

请我喝杯咖啡吧~

支付宝
微信