大柚子

这世界不过如此

xargs

  • -a file 从文件中读入作为 stdin
  • -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
  • -p 当每次执行一个argument的时候询问一次用户。
  • -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
  • -t 表示先打印命令,然后再执行。
  • -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
  • -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
  • -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
  • -L num 从标准输入一次读取 num 行送给 command 命令。
  • -l 同 -L。
  • -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
  • -x exit的意思,主要是配合-s使用。。
  • -P 修改最大的进程数,默认是1,为0时候为as many as it can 

docker

循环访问机器当前开放端口:

for i in $(netstat -anopt|grep LIST|awk '{print $4}'); do curl -I -m 3 -o /dev/null -s -w "%{http_code} %{url_effective}\n" $i'/'; done
  • -I 仅测试HTTP头
  • -m 3 最多查询3s
  • -o /dev/null 屏蔽原有输出信息
  • -s silent模式,不输出任何东西
  • -w %{http_code} 控制额外输出,当前为状态码,url

获取所有docker容器保存日志位置

docker ps |awk 'NR>1{print $1}'|xargs -I {} docker inspect --format="{{json .LogPath}}" {}

获取所有docker映射端口关系

docker ps |awk ‘NR>1{print $1}’|xargs -I {} docker inspect –format=”{{json .NetworkSettings.Ports}}” {}

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) 可以这样写正则表达式。

<strong>[</strong>root@allen1 ~]# echo "Hello, my name is aming."|grep -P '(?&lt;=Hello, ).*(?= aming.)'
Hello, my name is aming.
  • ?<=字符串1:表示只匹配字符串1后面的内容
  • ?= 字符串2:表示只匹配字符串2前面的内容

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

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

使用xargs实现for循环(输出两列)

正常使用for循环,但只能输出成一列

[root@VM-0-10-centos ~]# for i in $(cat /etc/passwd|awk -F: '{print $1,$NF}');do echo $i;done
root
/bin/bash
bin
/sbin/nologin
daemon
/sbin/nologin
adm
/sbin/nologin
lp
/sbin/nologin
sync
/bin/sync
shutdown
/sbin/shutdown
halt
/sbin/halt
mail
/sbin/nologin
operator
/sbin/nologin
games
/sbin/nologin
ftp
/sbin/nologin
nobody
/sbin/nologin
systemd-network
/sbin/nologin
dbus
/sbin/nologin
polkitd
/sbin/nologin
libstoragemgmt
/sbin/nologin
rpc
/sbin/nologin
ntp
/sbin/nologin
abrt
/sbin/nologin
sshd
/sbin/nologin
postfix
/sbin/nologin
chrony
/sbin/nologin
tcpdump
/sbin/nologin
syslog

使用xargs实现循环输出两列

[root@VM-0-10-centos ~]# cat /etc/passwd |awk -F: '{print $1,$NF}'|xargs -n2 bash -c 'echo $1 $2' cc
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
libstoragemgmt /sbin/nologin
rpc /sbin/nologin
ntp /sbin/nologin
abrt /sbin/nologin
sshd /sbin/nologin
postfix /sbin/nologin
chrony /sbin/nologin
tcpdump /sbin/nologin
syslog /bin/false
lighthouse /bin/bash
dockerroot /sbin/nologin

把两列的数据都作为单独变量循环输出

[root@VM-0-10-centos ~]# cat /etc/passwd |awk -F: '{print $1,$NF}'|xargs -n2 bash -c 'for i in $1;do for j in $2;do echo $i $j;done  ;done'  ff
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
libstoragemgmt /sbin/nologin
rpc /sbin/nologin
ntp /sbin/nologin
abrt /sbin/nologin
sshd /sbin/nologin
postfix /sbin/nologin
chrony /sbin/nologin
tcpdump /sbin/nologin
syslog /bin/false
lighthouse /bin/bash
dockerroot /sbin/nologin

注:末尾的ff为随机输入,为的是设定$0,及脚本自身,但这里并不需要,以及bash -c后面需要接‘,而不是”,因为”会把$1和$2识别成系统变量

实时监测文件夹内文件变动inotifywait

需要安装inotify

yum install -y inotify-tools
语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]

-m: 即“–monitor” 表示始终保持事件监听状态。

-r: 即“–recursive” 表示递归查询目录

-q: 即“–quiet” 表示打印出监控事件

-o: 即“–outfile” 输出事情到一个文件而不是标准输出

-s: 即“–syslog” 输入错误信息到系统日志

-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等

-format: 指定输出格式;常用的格式符如:

%w:表示发生事件的目录

%f:表示发生事件的文件

%e:表示发生的事件

%Xe:事件以“X”分隔

%T:使用由-timefmt定义的时间格式

-timefmt:指定时间格式,用于-format选项中的%T格式

实时监控/var/log文件夹文件变动,且设置输出格式

[root@VM-0-10-centos log]# inotifywait -m --timefmt "%Y-%m-%d %H:%M:%S" --format "[%T] : [%e] : %w%f" /var/log

audit实时审计服务网络连接

  • 创建审计规则(-k 为指定规则key)
auditctl -a always,exit -F arch=b64 -S socket,connect,sendmmsg,sendmsg,bind,recvmsg,close  -k test
注解:
socketcall socket系统调用
socket 建立socket
bind 绑定socket到端口
connect 连接远程主机
accept 响应socket连接请求
send 通过socket发送信息
sendto 发送UDP信息
sendmsg 参见send
recv 通过socket接收信息
recvfrom 接收UDP信息
recvmsg 参见recv
listen 监听socket端口
select 对多路同步I/O进行轮询
shutdown 关闭socket上的连
getsockname 取得本地socket名字
getpeername 获取通信对方的socket名字
getsockopt 取端口设置
setsockopt 设置端口参数
sendfile 在文件或端口间传输数据
socketpair 创建一对已联接的无名socket
  • 查看审计日志

日志位置:/var/log/audit/audit.log

root@VM-0-10-centos ~]# ausearch -k test
----
time->Wed Oct 12 17:24:14 2022
type=PROCTITLE msg=audit(1665566654.787:3475803): proctitle="barad_agent"
type=SOCKADDR msg=audit(1665566654.787:3475803): saddr=02000050A9FE00040000000000000000
type=SYSCALL msg=audit(1665566654.787:3475803): arch=c000003e syscall=42 success=no exit=-115 a0=c a1=7fff18f19b70 a2=10 a3=4 items=0 ppid=1762 pid=1768 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=
0 fsgid=0 tty=(none) ses=5 comm="barad_agent" exe="/usr/local/qcloud/monitor/python26/bin/python" key="test"
----
time->Wed Oct 12 17:24:14 2022
type=PROCTITLE msg=audit(1665566654.889:3475882): proctitle="barad_agent"
type=SOCKADDR msg=audit(1665566654.889:3475882): saddr=02000050A9FE00040000000000000000
type=SYSCALL msg=audit(1665566654.889:3475882): arch=c000003e syscall=42 success=no exit=-115 a0=c a1=7fff18f19b70 a2=10 a3=4 items=0 ppid=1762 pid=1768 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=
0 fsgid=0 tty=(none) ses=5 comm="barad_agent" exe="/usr/local/qcloud/monitor/python26/bin/python" key="test"

sed命令实现在文件中取多个参数值

假如有如下数据,想要取domain,port,Password的值,并且只取第一个,要如何实现呢?

{"Duration":"2ffff","Data":{"domain":"xxx.xxx.com","port":18733,"userList":[{"ID":2,"Username":"aaa","Password":"abcdefg==","EncryptPass":"9a1717dafdafda6716a130f3d5f91320b91d74aefdc3aaaf","Quota":85899345920,"Download":54948906599,"Upload":1155713256,"UseDays":0,"ExpiryDate":""},{"ID":3,"Username":"fff","Password":"12345678","EncryptPass":"ad598156e5afadadf86b1c632609df6ee628611d66ee3567819c5ab91307ba","Quota":53687091200,"Download":2281521385,"Upload":73704813,"UseDays":0,"ExpiryDate":""},{"ID":4,"Username":"bbb","Password":"fffaefwe","EncryptPass":"6fb8b743165dfadfefe41d877942fd5ace1c241c70a79248e53209cd57aaf934","Quota":53687091200,"Download":4730791904,"Upload":23340061,"UseDays":0,"ExpiryDate":""}

首先,以“ : , 为分隔符,并将其替换为空

cat tt.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g' | sed -rn '/domain|port|Password/{n; p}' | head -3 | xargs
cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' 
[root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g'
{ Duration   2ffff   Data  { domain   xxx.xxx.com   port  18733  userList  [{ ID  2  Username   aaa   Password   abcdefg==   EncryptPass   9a1717dafdafda6716a130f3d5f91320b91d74aefdc3aaaf   Quota  85899345920  Download  54948906599  Upload  1155713256  UseDays  0  ExpiryDate    } { ID  3  Username   fff   Password   12345678   EncryptPass   ad598156e5afadadf86b1c632609df6ee628611d66ee3567819c5ab91307ba   Quota  53687091200  Download  2281521385  Upload  73704813  UseDays  0  ExpiryDate    } { ID  4  Username   bbb   Password   fffaefwe   EncryptPass   6fb8b743165dfadfefe41d877942fd5ace1c241c70a79248e53209cd57aaf934   Quota  53687091200  Download  4730791904  Upload  23340061  UseDays  0  ExpiryDate    }

其次去除多余空格,并将其替换为换行符

[root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g'
{
Duration
2ffff
Data
{
domain
xxx.xxx.com
port
18733
userList
[{
ID
。
。
。
。

0
ExpiryDate
}
{

0
ExpiryDate
}

最后正则匹配domain port password 并取匹配行的下一行(这里有个bug,会取所有密码,贪婪匹配)

[root@VM-0-10-centos jiemi]# cat 11.txt | grep Duration | sed -r -e 's/("|,|:)/ /g' -e 's/\s+/\n/g' | sed -rn '/domain|port|Password/{n; p}'
xxx.xxx.com
18733
abcdefg==
12345678
fffaefwe
Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注