跳转至

Welcome to MkDocs

Linux 系统编程手册笔记-(1)

第二章 基本概念

2.1 操作系的核心-内核

​ 操作系统有两层含义一种是指完整的软件包,用来管理计算机的核心层软件,以及附带的所有标准工具软件,包含命令解释器,图形用户界面,文件操作工具和文本编辑器等

​ 另一种更狭义的含义则是指管理分配计算机资源(CPU,RAM和设备)的核心层软件。术语内核通常就是指这一种含义。

​ 虽然在没有内核的情况下计算机也能运行程序。但是有了内核会极大的简化其他程序的编写和使用。主要归功与内核所提供的用于管理有限资源的核心软件层。

​ 操作系统,内核,shell之间的关系

​ 操作系统包括操作系统内核,驱动,运行库,引导程序等

​ 内核,操作系统最核心的内容,一般来说内核特指一个或者几个文件

​ shell,一般是指跟用户直接交互的界面,可以是命令行也可以是窗口,用户通过shell 访问并控制计算机

内核提供的功能

进程调度

内存管理

提供文件系统

创建和终止程序

对设备的访问

联网

提供系统调用应用编程接口(API)

Golang 学习

go提供了sync包channel机制来解决协程间的同步与通信。channel的用法非常灵活,使用的方式多种多样,而且官网的Effective Go中给出了channel的一种并发以外的方式。我们先来介绍sync包提供的调度支持吧。

安装Systemtap

$ sudo apt remove systemtap
$ sudo apt install g++ make git libelf-dev libdw-dev

$ git clone git://sourceware.org/git/systemtap.git
$ cd systemtap/
$ ./configure && make         // no errors
$ sudo make install

$ sudo stap -e 'probe begin { printf("Hello, World!\n"); exit() }'
[sudo] password for knudfl: 
Hello, World!

安装完成后执行下列命令检验是否完成安装

sudo stap -ve 'probe begin { log("hello systemtap!") exit() }'

如果安装成功显示下列内容

Pass 1: parsed user script and 476 library scripts using 119196virt/87952res/5764shr/82508data kb, in 80usr/100sys/189real ms.
Pass 2: analyzed script: 1 probe, 2 functions, 0 embeds, 0 globals using 120780virt/89660res/5900shr/84092data kb, in 0usr/0sys/6real ms.
Pass 3: translated to C into "/tmp/stapTYYmwZ/stap_455006ea742bbf1a3302e2dbfd0820a7_1159_src.c" using 120780virt/89660res/5900shr/84092data kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_455006ea742bbf1a3302e2dbfd0820a7_1159.ko" in 8380usr/1750sys/6001real ms.
Pass 5: starting run.
hello systemtap!
Pass 5: run completed in 0usr/20sys/436real ms.

[转载]Git 是怎样生成 diff 的:Myers 算法

原文链接:https://cjting.me/2017/05/13/how-git-generate-diff/

diff 是我们每天都要使用的一个功能,每次提交时,我都习惯先用 git diff --cached 看看这次提交更改了些什么,确定没问题,然后再 git commit。git 生成的 diff 非常直观,直观到我从来都没有去思考过 diff 是怎么生成的,觉得这应该是很简单的一件事,两个文件做个对比,不就行了。

Pytest使用

1.什么是Pytest

pytest是一个强大的Python测试工具,它可以用于所有类型和级别的软件测试。 Pytest可以被开发团队,QA团队,独立测试小组,实践TDD的个人和开放源代码项目。实际上,整个互联网上的项目都是从unittest或者nose转向pytest,包括Mozilla和Dropbox。为什么?因为pytest提供 强大的功能,如'断言'重写,第三方插件模型,强大但简单的fixture模型。

pytest是软件测试框架,这意味着pytest是命令行工具。它会自动找到你写的测试,运行测试并报告结果。可编写插件或安装第三方来扩展插件。它可以用来测试Python发行版。它很容易与其他工具对接,如持续集成和网页自动化

linux 命令使用

1.查看journal 日志所占用的空间

journalctl --disk-usage

2.清理不必要的journal 日志

journalctl --vacuum-size=10M

3.查看ubuntu 下载的软件包

du  –h  /var/cache/apt/archives

4.产看inodes消耗情况

df -i 

5.删除用户后遗留下的垃圾文件

find ./ -nouser  |xargs rm –rf

6.清除不必要的core文件(慎用)

find / -name core -print -exec rm -rf {} \;

Python logging 模块的几个问题

1.logger 对象
2.logger对象的handler?
3.Formatter?

0.basicConfig

使用logging.basicConfig(**kwargs) 会对对root logger进行一次性配置,比如如果只有logger对象而没有handler时会调用basicConfig(**kwargs)中的参数,如果没有basicConfig(**kwargs)则这个logger中记录的日志信息不会被输出。

logging.basicConfig()函数是一个一次性的简单配置工具使,也就是说只有在第一次调用该函数时会起作用,后续再次调用该函数时完全不会产生任何操作的,多次调用的设置并不是累加操作。

使用logging_tree来查看log hander分布情况

1.问题

  • logging 直接输出日志,如 logging.info() 与 log = logging.getLogger('name') log.info() 有什么不同?
  • “No handlers could be found for logger”是怎么回事?
  • root logger 有什么用,如何获得?
  • 形如 "a.b.c" 的 logger 名有什么用?
  • 如果一个 logger 执行多次 addHandler,那么每个 handler 都会被执行吗?
  • logger 的传播(propagate)是怎么回事?如何阻止它?

Postgresql 学习笔记


1.添加腾讯postgresql 镜像源

/etc/apt/source.list.d/下创建pgdg.list并添加如下内容:

deb https://mirrors.cloud.tencent.com/postgresql/repos/apt/ bionic-pgdg main
#deb https://mirrors.tencentyun.com/postgresql/repos/apt/ bionic-pgdg main
#deb-src http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

执行更新apt 源

sudo apt upgrade

2.执行安装命令

sudo apt install postgresql-12

3.启动pg

pg_ctlcluster 12 main start
等效于如下命令:
/usr/lib/postgresql/12/bin/postgres "-D" "/var/lib/postgresql/12/main" "-c" "config_file=/etc/postgresql/12/main/postgresql.conf"

或者使用systemd 启动postgresql 12

postgresql 12 在ubuntu的服务名为postgresql@12.service

systemctl start postgresql@12-main.service
这里的main指的是数据集簇名

pg_ctl路径位于/usr/lib/postgresql/12/bin/pg_ctl

参考资料:

[1].https://github.com/digoal/blog/blob/master/201901/20190105_01.md (PostgreSQL 培训视频(含PG知识图谱、Oracle迁移到PG知识点))

[2].https://github.com/digoal/blog/blob/master/201812/20181203_01.md (PostgreSQL 11 参数模板 - 珍藏级)

[3].https://github.com/digoal/blog/blob/master/202001/20200118_02.md (PostgreSQL+MySQL 联合解决方案课程 - 汇总视频、课件)

[4].https://github.com/digoal/blog/blob/master/201805/20180524_02.md (PostgreSQL 多应用场景实践 - 沙箱实验)

[5].https://github.com/digoal/blog (完整资料)

git 常用命令

1.git log控制输出宽度

%<(N, trunc) 下一个单元的输出宽度限制为N列, 左对齐

%<|(N, trunc) 下一个单元输出至全局第N列, 左对齐

%>, %>|, %>>, %>< 类似, 分别为 右对齐, 右对齐, 右对齐(如果左边有多余空格则复用), 居中对齐

[转载]为什么字典中的Key不能是列表

1 Python的字典是如何工作的

​ 在Python中,字典就是一个个的映射,为了实现这个功能,Python必须能够做到,给出一个Key,找到哪一个Value与这个Key对应。如果我们将Key-value键值对存放到一个List中,每当需要的时候,就去遍历这个List,用Key和键值对对应的Key去进行对比。但是这样实现方法,如果数据量很大的时候就变得很低效。他的算法复杂度是O(n),n是存放键值对的数量。

​ 为此Python使用了Hash(哈希)的方法来实现,要求每一个存放到字典中的对象都要实现Hash函数,这个函数可以产生一个唯一的int值,叫做Hash Value(哈希值),通过这个int值,就可以快速的确定对象在字典中的位置。然而,由于Hash碰撞的存在,可能存在两个对象的Hash值是相同的,所以在查找字典的时候,要比较Hash的值,还要比较Value的值。

Redis未授权问题获取Linux系统root权限的攻击方法

今天我自己的一台服务器就这样被挂上了挖矿脚本....

今天就了解一下我的服务器是如何被利用的。

1.在默认情况下,redis会绑定在0.0.0.0:6379,因为自己图方便就把防火墙给关了。这样就导致了redis服务器被暴露在公网上。同时我也了解到,如果没有开启授权的情况下,任意一个用户如果可以访问Redis服务器,那么就会在未授权的情况下访问Redis服务器,同时访问服务器。攻击者在未授权的情况下访问Redis,可以通过Redis的方法将自己的公钥写入到目标服务器的authotrized_keys文件中,进而可以直接登录目标服务器;而且如果Redis是以root用户登录的话,那么可以用此方法直接获取root用户权限。

img