一些学习中的随笔小记(三)

一些学习中的随笔小记(三)

每篇记录20个零碎的知识点。

查看windows激活信息

slmgr.vbs -xpr

不带参数显示如下:

grep过滤空白行和注释行

1、过滤空白行

cat filename | grep -v '^$'

2、过滤注释行

cat filename | grep -v '^#'

3、同时过滤空白行与注释行

cat filename | grep -v '^$' | grep -v '^#'

或者使用

cat filename | grep -Ev '^#|^$'

linux下kill tty

Linux下可以通过w命令或who命令查看当前登录的所有主机的pts信息,而非正常退出时,有时候pts并不会释放,这就会占用/dev/tty资源。如何将这种非正常退出的进程kill掉呢?当然,我们可以通过ps auxf指令进行查看,再获取相应的进程信息后,再kill掉进程。同样也可以也可以使用pkill直接进行查杀。

$ w
14:57:48 up 10 days, 4:03, 3 users, load average: 0.11, 0.11, 0.21
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user1 pts/0 1xx.1xx.xx.xx 14:57 1.00s 0.4s 0.02s w
user2 pts/1 1xx.1xx.xx.xx 09:22 1.00s 0.6s 0.02s -zsh
user3 pts/2 1xx.1xx.xx.xx 06:19 1.00s 0.13s 0.02s -zsh

直接pkill 指定的tty。

pkill -9 -t pts/0

使用yum提示Error: rpmdb open failed

在centos系统上,在使用yum命令安装软件包时候报错:

rpmdb: Thread/process 6539/140448388269824 failed: Thread died in Berkeley DB library
error: db3 error(-30974) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db3 – (-30974)
error: cannot open Packages database in /var/lib/rpm
原因是RPM数据库被破坏

重建数据库后恢复正常:

cd /var/lib/rpm/
for i in ls | grep 'db.';do mv $i $i.bak;done
rpm –rebuilddb

yum clean all

linux grep查看指定内容上下几行

linux系统中,可以利用grep查看指定的内容,
比如:grep “123” test.log //查看test.log中包含123字符的日志

如果想查看指定内容上下几行,可以用参考下面的用法:

$grep -10 ‘123’ test.log//打印匹配行的前后10行

$grep -C 10 ‘123’ test.log//打印匹配行的前后10行

$ grep -A 10 -B 10 ‘123’ test.log //打印匹配行的前后10行

$grep -A 10 ‘123’ test.log //打印匹配行的后10行

$grep -B 10 ‘123’ test.log//打印匹配行的前10行

其他例子:
//显示既匹配 ‘123’又匹配 ‘456’的行
grep ‘123’ test.log| grep ‘456’

//搜索test.log中满足123的内容的行号
grep -n ‘123’ test.log

//查看test.log指定行号后的内容,比如50行
tail -n +50 test.log

//查看test.log的第50行到100行
sed -n ‘50,100p’ test.log#记得p字母

linux下显示dd命令的进度

sudo dd if=/dev/zero of=/tmp/zero.img status=progress
linux下显示dd命令的进度:
dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000
想要查看上面的dd命令的执行进度,可以使用下面几种方法:
比如:每5秒输出dd的进度
方法一:
watch -n 5 pkill -USR1 ^dd$

方法二:
watch -n 5 killall -USR1 dd

方法三:
while killall -USR1 dd; do sleep 5; done

方法四:
while (ps auxww |grep ” dd ” |grep -v grep |awk ‘{print $2}’ |while read pid; do kill -USR1 $pid; done) ; do sleep 5; done

上述四种方法中使用三个命令:pkill、killall、kill向dd命令发送SIGUSR1信息,dd命令进程接收到信号之后就打印出自己当前的进度。

USR1信号 解释
USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

kill -HUP pid 或者 killall -HUP pName:
其中pid是进程标识,pName是进程的名称

如果想要更改配置而不需停止并重新启动服务,可以使用上面两个命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。
根据约定,当你发送一个挂起信号(信号1或HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。

linux非交互式修改密码

# chpasswd命令使用起来很简洁
[root@host_221-81 ~]# echo "qa:1234" | chpasswd
 
# 使用passwd命令,也可以实现非交互式修改密码
[root@host_221-81 ~]# echo "1234" | passwd --stdin "qa"
Changing password for user qa.
passwd: all authentication tokens updated successfully.

yum安装报错Error:Nothing to do

报错信息

No package nginx available
Error:Nothing to do

解决办法 :方法一、更换源,备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

获取对应版本的CentOS-Base.repo 到/etc/yum.repos.d/目录

各版本源配置列表

CentOS5

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos5_base.repo

CentOS6

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos6_base.repo

CentOS7

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo

CentOS8

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos8_base.repo

更新缓存

yum clean all
yum makecache

方法二、用EPEL方式安装nginx:

sudo yum install epel-release
yum update
yum install nginx

yum install 与 yum groupinstall 的区别

yum 提供二种安装软件的方式

1,yum install 它安装单个软件,以及这个软件的依赖关系

2,yum groupinstall 它安装一个安装包,这个安装包包涵了很多单个软件,以及单个软件的依赖关系。

举例说明一下。

我想装mysql

yum install mysql 或者 yum groupinstall “MySQL Database” 这二个都是可以安装mysql的

[root@tank ~]# yum groupinfo "MySQL Database"
Loading "security" plugin
Loading "rhnplugin" plugin
Setting up Group Process
rhel-x86_64-server-5      100% |=========================| 1.4 kB    00:00

Group: MySQL Database
 Description: This package group contains packages useful for use with MySQL.
 Mandatory Packages:
 mysql
 Default Packages:
 unixODBC
 mysql-server
 MySQL-python
 mysql-connector-odbc
 libdbi-dbd-mysql
 perl-DBD-MySQL
 Optional Packages:
 mod_auth_mysql
 mysql-devel
 qt-MySQL
 mysql-bench
 php-mysql

如果想查看单个软件的安装,yum info 软件名,在这里yum info mysql

MySQL Database这个安装包里面包括了mysql,mysql-server,mysql-bench等等,安装这个包,不光安装了mysql,还安装了mysql的一些工具。如果是用yum install mysql来安装mysql的话,只是安装了MySQL Database这个包里面的mysql部分。

使用低版本DockerFile构建镜像时报错“Error parsing reference: “xxx AS base” is not a valid repository/tag: invalid reference format”

运行dockerfile时报出的错误

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
Error parsing reference: "microsoft/dotnet:2.2-aspnetcore-runtime AS base" is not a valid repository/tag: invalid reference format

这个问题一般是由docker的版本错误导致的
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base,使用docker的新特性multi-stage build,该特性要求docker 17.05或更高版本。

我使用的服务器版本是centos 7.5 ,默认安装docker安装的docker 1.13.1版本

下面将docker更新到最新版本,删除已安装的docker版本 。

yum -y remove docker* (不删除 /var/lib/docker 目录 就不会删除已安装的镜像及容器)

安装国内阿里云镜像
yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装最新版本的docker
yum install docker-ce

如果重启容器时发生错误 Unknown runtime specified docker-runc

运行如下指令解决

grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
systemctl restart docker

gnutls_handshake() failed: Error in the push function 关于git报错的解决办法

git clone 的时候遇到这样的报错。

root@VM-8-15-ubuntu:/code/python# git clone https://github.com/dfir-iris/iris-web.git
Cloning into 'iris-web'...
fatal: unable to access 'https://github.com/dfir-iris/iris-web.git/': gnutls_handshake() failed: Error in the push function.

执行以下命令即可解决。

sudo apt-get install libcurl4-openssl-dev
sudo apt-get update
sudo apt-get install build-essential fakeroot dpkg-dev libcurl4-openssl-dev

lsof: no pwd entry for UID xx 报错分析

root@VM-8-15-ubuntu:~# lsof 2>&1 | head -n 3
lsof: no pwd entry for UID 999
lsof: no pwd entry for UID 999
lsof: no pwd entry for UID 999

出现大量‘lsof: no pwd entry for UID 999’的情况,主要有两个原因:

  1. 进程在用户被删除之前启动,并且从那以后一直在运行;
  2. 进程在容器内被启动(该UID为容器内的用户ID)

如何分析呢?

root@VM-8-15-ubuntu:~# ps -ef | awk '$1==999{print $0}'
999       2238 11289  0  2021 ?        00:00:00 redis-rdb-bgsave *:6379
999      11289 11261  0  2021 ?        01:45:07 redis-server *:6379
999      19669 19636  0 Mar25 ?        00:03:19 mysqld
root@VM-8-15-ubuntu:~# ps -ef | awk '$1==999{print $3}' | xargs -I % strings /proc/%/cmdline
redis-server *:6379
/usr/bin/containerd-shim-runc-v2
-namespace
moby
f33fd58f2967e4b1c256cd0093426d1f3fbf8f265798f8a70812d8deed813e8f
-address
/var/run/docker/containerd/containerd.sock
/usr/bin/containerd-shim-runc-v2
-namespace
moby
bfcb373742b34bfed83aa1944fd0af02d262a61a81b09edf04185ec4db021902
-address
/run/containerd/containerd.sock
root@VM-8-15-ubuntu:~# 

我们查看父进程的cmdline可以看到是docker的进程。

ln -s 软链接产生Too many levels of symbolic links错误

今天调用Nginx的时候发现找不到,ls报错提示Too many levels of symbolic links。

这个软链接指向的是相对路径。一定要改为绝对路径!!!

重新建立软链接即可。

Debian下iptables规则重启失效问题的解决方法

Debian系统默认不会保存iptables规则,重启后所有设置过的iptables会失效。解决方法是:设置好iptables规则后,使用iptables-save保存规则到文件;然后设置开机时使用iptables-restore导入这个文件。

具体执行命令:

touch /etc/network/if-pre-up.d/iptables

chmod +x /etc/network/if-pre-up.d/iptables

然后编辑这个文件:vi /etc/network/if-pre-up.d/iptables

输入以下内容:

#!/bin/sh

/sbin/iptables-restore < /etc/iptables

然后,配置iptables规则。

iptables -t nat -A POSTROUTING -s ‘10.20.20.20/24’ -o vmbr0 -j MASQUERADE

iptables -t nat -A PREROUTING -i vmbr0 -p tcp –dport 7894 -j DNAT –to 10.20.20.100:3389

配置完毕后,把规则保存到文件:iptables-save > /etc/iptables

这样设置,重启系统iptables规则就不会再失效了。

将CHM文件翻译成中文

hh.exe是微软windows系统程序,.chm扩展名的帮助文件默认是用hh.exe打开。

CHM文件是Windows的一种帮助文件格式, 它主要是由.html 转换制作出来的,有时我们需要将.CHM文件反向转换成 .html 格式文件,即chm to html。我们可以利用Windows自带的hh.exe文件来进行文件格式转换。

转换语法为:hh -decompile 目标文件夹 源CHM文件名。

比如想要在阅读logparser的chm文档时进行翻译。

hh.exe -decompile ./README ./LogParser.chm

浏览器打开,翻译即可。

grep匹配两个字符串之间的字符

grep -P的使用。

​ Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of nimplemented features.

-P, –perl-regexp

这意思是,-P 可以让grep使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。

最典型的用法是,匹配指定字符串之间的字符。 比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符串(my name is) 可以这样写正则表达式。

[root@allen1 ~]# echo "Hello, my name is aming."|grep -P '(?<=Hello, ).*(?= aming.)'
Hello, my name is aming.

?<=字符串1:表示只匹配字符串1后面的内容

?= 字符串2:表示只匹配字符串2前面的内容

如果只需要匹配到的部分,还可以加上-o选项

[root@allen1 ~]# echo "Hello, my name is aming."|grep -Po '(?<=Hello, ).*(?= aming.)'
my name is

根据这个思路,我们可以去匹配IP地址

centos6:ifconfig eth0 |grep -Po ‘(?<=addr:).*(?= Bcast)’

centos7: ifconfig ens33 |grep -Po ‘(?<=inet ).*(?= netmask)’

[root@allen1 ~]# ifconfig ens33 |grep -Po '(?<=inet ).*(?= netmask)'
192.168.197.128

安装telnet服务端并允许root用户登录

yum -y install telnet* xinetd
systemctl start telnet.socket
systemctl start xinetd

1、开启telnet在终端中输入 vi /etc/xinetd.d/telnet 打开文件后,将里面的disable=yes行前面加上#注释掉,保存退出,重新启动 xinetd服务 /etc/rc.d/init.d/xinetd restart 就可以了。注意,由于安全考虑,telnet不允许root用户直接登录,需要您先建立一个普通用户,使用这个用户登录,再转换到root用户:su root。
2、配置允许root用户登录:允许root用户登录是很不安全的,但是有时候为了测试的方便,也可以允许root用户登录,但是这个方法最好不要对公网开放使用。 (1)vi /etc/pam.d/login  将文件中的 pam_securetty.so行,加上“#”注释掉;重启telnet看是否可以以root用户登录telnet,如果可以跳过(2),不可以执行(2);(2)查看log信息:tail /var/log/securetail /var/log/secureMar 17 02:16:55 localhost login: pam_securetty(remote:auth): access denied: tty ‘pts/3’ is not secure !
Mar 17 02:16:59 localhost login: FAILED LOGIN 1 FROM 192.168.160.1 FOR root, Authentication failure
根据“tty’pts3′ is not secure”的提示。添加 pts/ 系列终端到 /etc/securetty  pts/1
  pts/2
  pts/3                  //增加这个是增加使用root登陆的个数
  pts/4
  pts/5
  //也不知道有多少可以加,不能登陆就看log,如果不够再加好了。此时,再重启telnet,便可以以root用户登录telnet服务器了。3. 我们不建议你允许root用户通过telnet方式远程登录,而且系统缺省也是不允许这样做的。如果希望以root的身份远程管理服务器,可以在服务器上安装SSHD,然后通过 Secure Shell连接到服务器。
目前较新的linux发行版都自带名为OpenSSH的SSH服务器,通过
/etc/rc.d/init.d/sshd start即可启动SSH服务器。客户端通过SSH客户端即可连接到服务器。telnet服务重启
[root@rhel52 /]# service xinetd restart Stopping
xinetd:                                  [  OK  ]
Starting xinetd:                                  [  OK  ]

shell随机生成 IP 地址

使用dd生成随机ip

dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'

od -An -tu1,-An防止打印地址,-tu1将输入作为一字节无符号整数。
-A, –address-radix=RADIX
文件偏移量的输出格式;RADIX是[doxn]之一,表示十进制、八进制、十六进制或无。
-t, –format=TYPE
TYPE是由这些规格中的一个或多个组成。
u[SIZE] 无符号十进制,SIZE字节/整数

生成ip如下:

root@VM-8-15-ubuntu:~# dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'
30.146.167.159
root@VM-8-15-ubuntu:~# dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'
17.61.46.18
root@VM-8-15-ubuntu:~# dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'
9.184.22.215
root@VM-8-15-ubuntu:~# dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'
187.189.145.98
root@VM-8-15-ubuntu:~# dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1 | xargs |sed 's/ /./g'
41.33.12.143

使用nmap生成随机ip

nmap -n -iR 10 -sL | awk '/report for/ { print $NF }'
root@VM-8-15-ubuntu:~# nmap -n -iR 10 -sL | awk '/report for/ { print $NF }'
83.251.27.17
82.242.157.237
34.139.154.159
67.78.145.180
187.70.234.250
143.203.74.252
55.80.23.114
58.105.16.154
29.249.197.42
18.38.251.22
Print Friendly, PDF & Email
赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。