Skip to main content

· 14 min read

类似man 查看命令用法

curl cht.sh/ls

用户权限

adduser www
passwd www # 修改密码
#修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
www ALL=(ALL) ALL
#修改完毕,现在可以用www帐号登录,然后用命令 sudo – ,即可获得root权限进行操作

some

ip 查看

netstat -nltp
iptables -L
lsof -i:80
lsof -n -P -i TCP -s TCP:LISTEN

netstat

yum install -y net-tools
netstat -nltp # 查看 ip

netstat -nap | grep 进程pid
netstat -nap | grep 端口号

chkconfig

chkconfig --list #列出所有的系统服务 chkconfig --list mysqld #列出mysqld服务设置情况 chkconfig --add httpd #增加httpd服务 chkconfig --del httpd #删除httpd服务 /etc/rc[0-6].d删除 chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态 chkconfig --level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭 chkconfig mysqld on #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级

wget

#1:下载单个文件到当前目录下,也可以-P指定下载目录
wget http://nginx.org/download/nginx-1.8.0.tar.gz
#2:对于网络不稳定的用户可以使用-c和--tries参数,保证下载完成
wget --tries=20 -c http://nginx.org/download/nginx-1.8.0.tar.gz
#3:下载大的文件时,我们可以放到后台去下载,这时会生成wget-log文件来保存下载进度
wget -b http://nginx.org/download/nginx-1.8.0.tar.gz
#4:可以利用—spider参数判断网址是否有效
wget --spider http://nginx.org/download/nginx-1.8.0.tar.gz
#5:自动从多个链接下载文件
cat url_list.txt #先创建一个URL文件
http://nginx.org/download/nginx-1.8.0.tar.gz
http://nginx.org/download/nginx-1.6.3.tar.gz
wget -i url_list.txt
#6:限制下载速度
wget --limit-rate=1m http://nginx.org/download/nginx-1.8.0.tar.gz
#7:登陆ftp下载文件
wget --ftp-user=user --ftp-password=pass ftp://ip/filename

find xargs

find . -name ".py" | xargs -I name sh -c 'echo name ; cat name' find . -name ".py" | xargs -I name sh -c 'echo "\"\"\"@copyright {name}\"\"\"" ; cat name ; echo -e "\n\n\n\n"' > ~ /Desktop/a.txt find . -name "*.js" | xargs -I name sh -c 'echo "\"\"\"@copyright {name}\"\"\"" ; cat name ; echo -e "\n\n\n\n"' > ~ /Desktop/b.txt

iftop 图看io

https://www.vpser.net/manage/iftop.html
yum install -y iftop

iftop -m 5m

TX: 发送流量
RX: 接收流量
TOTAL: 总流量
Cumm: 运行iftop到目前时间的总流量
peak: 流量峰值
rates: 分别表示过去 2s 10s 40s 的平均流量

-P使host信息及端口信息默认就都显示;
-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:#
Host display: General:
n - toggle DNS host resolution P - pause display
s - toggle show source host h - toggle this help display
d - toggle show destination host b - toggle bar graph display
t - cycle line display mode B - cycle bar graph average
T - toggle cumulative line totals
Port display: j/k - scroll display
N - toggle service resolution f - edit filter code
S - toggle show source port l - set screen filter
D - toggle show destination port L - lin/log scales
p - toggle port display ! - shell command
q - quit
Sorting:
1/2/3 - sort by 1st/2nd/3rd column
< - sort by source name
> - sort by dest name
o - freeze current order

iotop http://man.linuxde.net/iotop

yum install -y iotop
iotop -d 5

常用快捷键:
左右箭头:改变排序方式,默认是按IO排序。
r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换。
a:显示累积使用量。

firewall

firewall-cmd --state
systemctl disable firewalld.service # 在开机时禁用一个服务

iostat

yum install -y sysstat

iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)
iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)
iostat -d -x -m 1 10 #查看设备使用率(%util)

参数
-d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。
-x,该选项将用于显示和io相关的扩展数据。

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

sed

http://man.linuxde.net/sed

sed -i 's/book/books/g' file

# 删除#开头行
sed -i '/^#/'d filebeat.yml
# 删除空白行
sed -i /^[[:space:]]*$/d filebeat.yml

cat

cat <<EOF
cat > filename # 敲完内容,ctrl+d
cat > filename <<EOF
敲完内容
EOF

tee

读取标准输入的数据,并将其内容输出成文件

tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cmf3ratl.mirror.aliyuncs.com"]
}
EOF

[root@localhost ~]# who | tee who.out
root pts/0 2009-02-17 07:47 (123.123.123.123)
[root@localhost ~]# cat who.out
root pts/0 2009-02-17 07:47 (123.123.123.123)
[root@localhost ~]# pwd | tee -a who.out
/root
[root@localhost ~]# cat who.out
root pts/0 2009-02-17 07:47 (123.123.123.123)
/root
[root@localhost ~]#

rename

rename 's/\.jpeg$/\.jpg/' *.jpeg
rename 's/_\w*/_/' *.mp3

split文件分割

split -l 2000 data.mt -d seofile_
curl -H 'Content-Type:text/plain' --data-binary @seofile_00 "http://data.zz.baidu.com/urls?site=www.app-echo.com&token=3iyzwDoYB6IQAMKL"

//每3行拆分成一个文件,拆分后的文件名以name开头,以数字作为后缀后缀长度为1
split -l 3 test -d -a 1 name

//每三个字节拆分成一个文件,默认不加单位就是字节,也可以带单位比如KB,MB等
split -b 3 test -d -a 1 new

redis key分布

# 1.sh
for i in `seq 1 100`;do
redis-cli -h 230f029eefb64e44.m.cnsha.kvstore.aliyuncs.com -a zc1BK5JM randomkey
done

./1.sh > r.keys

cat r.keys | awk -F ':' '{print $1}' | sort | uniq -c | sort -r -n

text len 排序

awk '{ print length, $0}' bj.conf | sort -n | sed 's/.* //'

grep

-i  忽略大小写
-n  显示行号
--color   高亮关键字,centos7默认已经高亮
-c  统计符合条件的行数
-o  只打印关键字,每个被匹配的关键字单独显示一行
-B   同时显示之前的行,后面必须有数字,如 -B2
-A   同时显示之后的行
-w  只匹配独立单词,也就是精确匹配
-v  反向查找
-e  同时匹配多个目标
-q  静默模式,只关心有没有匹配到,不关心内容
-E  可以使用扩展正则,,相当于egrep
-P  使用兼容perl的正则
fgrep: 不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高,fastgrep

tail -f api::header-debug-`date +"%w"`.log | grep ' {.*}' -o --line-buffered | jq

进程

#查看端口情况
netstat -apn | grep 9000 # ss better
ps -aux | grep php

scp

#文件
scp goaccess.conf 139:196:14:10:/usr/local/etc/goaccess.conf
#文件夹
scp -qr -P 20248 name1 root@172.16.3.121:/data/name2/

文件大小

du -sh du -sh *

文件个数

ls -l | wc -l

解压

zip

zip -r a.zip dirname
zip a.zip tests/* -x tests/ln.log #排除一个文件
zip -m a.zip test.md #向压缩文件中a.zip中添加test.md文件

unzip

unzip -r a.zip *
unzip -n test.zip -d /tmp #在指定目录/tmp解压缩,如已存在,-n 不覆盖 ~ -o 覆盖

tar

tar -zcvf filename.tar.gz folderName #压缩
tar -zcvf FileName.tar.gz DirName --exclude DirName/DirExcName #排除
tar -zcvf FileName.tar.gz DirName --exclude DirName/Dir1Name --exclude DirName/Dir2Name #多个排除

tar -zxvf filename.tar.gz -C /pcmoto/club/ #解压
tar -zxvf filename.tar.gz -C .

seq

seq -f "%04g" 5 4 1000 | xargs -n 15

completion

yum -y install bash-completion iot-echo completion bash > /etc/bash_completion.d/iot-echo.bash source /etc/bash_completion.d/iot-echo.bash

cpu

查看各cpu状况,top 然后按1

查看物理CPU的个数
#cat /proc/cpuinfo |grep &quot;physical id&quot;|sort |uniq|wc -l

查看逻辑CPU的个数
#cat /proc/cpuinfo |grep &quot;processor&quot;|wc -l

查看CPU是几核
#cat /proc/cpuinfo |grep &quot;cores&quot;|uniq

查看CPU的主频
#cat /proc/cpuinfo |grep MHz|uniq

### uname -a
Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux
(查看当前操作系统内核信息)

### cat /etc/issue | grep Linux
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
(查看当前操作系统发行版信息)

### cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
(看到有8个逻辑CPU, 也知道了CPU型号)

### cat /proc/cpuinfo | grep physical | uniq -c
4 physical id : 0
4 physical id : 1
(说明实际上是两颗4核的CPU)

### getconf LONG_BIT
32
(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

### cat /proc/cpuinfo | grep flags | grep &#39; lm &#39; | wc -l
8
(结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit)

如何获得CPU的详细信息:
linux命令:cat /proc/cpuinfo
用命令判断几个物理CPU,几个核等:
逻辑CPU个数:
### cat /proc/cpuinfo | grep &quot;processor&quot; | wc -l
物理CPU个数:
### cat /proc/cpuinfo | grep &quot;physical id&quot; | sort | uniq | wc -l
每个物理CPU中Core的个数:
### cat /proc/cpuinfo | grep &quot;cpu cores&quot; | wc -l
是否为超线程?
如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。
每个物理CPU中逻辑CPU(可能是core, threads或both)的个数:
### cat /proc/cpuinfo | grep &quot;siblings&quot;

column

cat  $(find . -name 310.html) | column -s',' -t

hostname

hostname m201
hostnamectl set-hostname m201
cat /proc/sys/kernel/hostname

tcpdump

# 端口
tcpdump -i eth0 port 61617 -w ~/tcpdump_61617.pcap

sudo tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -A -nn
所以常用的选项也就这几个:
tcpdump -D
tcpdump -c num -i int -nn -XX -vvv

· 2 min read

1

default:
cat Makefile

a:
go run cmd/pipeline-demo/main.go

b:
go run cmd/pipeline-demo/main.go

2

demo="Usage: \n\
\# 设置 crontab \n\
\t make crontab proj=xdq type=yy env=test \
"

default:
@echo ${demo}

crontab:
@echo $(proj) $(type) $(env)

3

default:
cat Makefile

build: build-fe build-be build-pkg

build-be:
docker run -it --rm \
-v "$$GOPATH/src":/go/src \
-w /go/src/github.com/zx5435/wolan/cmd/wolan-server \
golang:1.10.2 \
sh -c "CGO_ENABLED=0 GOOS=linux go build -v -installsuffix cgo -o wolan-server"

build-fe:
cd frontend && npm run build

build-pkg:
docker build -f __cicd__/Dockerfile -t zx5435/wolan .

ingress-build:
docker run -it --rm \
-v "$$GOPATH/src":/go/src \
-w /go/src/github.com/zx5435/wolan/cmd/wolan-ingress \
golang:1.10.2 \
sh -c "CGO_ENABLED=0 GOOS=linux go build -v -installsuffix cgo -o wolan-ingress"

ingress-pkg:
docker build -f __cicd__/Dockerfile.ingress -t zx5435/wolan:ingress .

ingress-test:
docker run -it -d --name wolan-ingress -p80:80 -p443:443 zx5435/wolan:ingress

restart: down up

up:
docker stop wolan
docker rm wolan
cd __work__ && docker run -it -d --name wolan -p 4321:23456 \
-v "$$PWD":/app/__work__ \
-v "/var/run/docker.sock:/var/run/docker.sock" \
zx5435/wolan

参考

NAME=timescaledb-postgis
ORG=timescale
PG_VER=pg10
VERSION=$(shell awk -F ':' '/^FROM/ { print $$2 }' Dockerfile | sed "s/\(.*\)-.*/\1/")

default: image

.build_postgis_$(VERSION)_$(PG_VER): Dockerfile
ifeq ($(PG_VER),pg9.6)
docker build --build-arg POSTGIS_VERSION=2.3.7 --build-arg PG_VERSION_TAG=$(PG_VER) -t $(ORG)/$(NAME):latest-$(PG_VER) .
docker tag $(ORG)/$(NAME):latest-$(PG_VER) $(ORG)/$(NAME):latest
else
docker build --build-arg POSTGIS_VERSION=2.4.4 --build-arg PG_VERSION_TAG=$(PG_VER) -t $(ORG)/$(NAME):latest-$(PG_VER) .
endif
docker tag $(ORG)/$(NAME):latest-$(PG_VER) $(ORG)/$(NAME):$(VERSION)-$(PG_VER)
touch .build_postgis_$(VERSION)_$(PG_VER)

image: .build_postgis_$(VERSION)_$(PG_VER)

push: image
docker push $(ORG)/$(NAME):$(VERSION)-$(PG_VER)
docker push $(ORG)/$(NAME):latest-$(PG_VER)
ifeq ($(PG_VER),pg9.6)
docker push $(ORG)/$(NAME):latest
endif


clean:
rm -f *~ .build_postgis_*

.PHONY: default image push clean

grundfos ccm

IMAGE_NS := registry.cn-shanghai.aliyuncs.com/digital-web
#TIME := $(shell date +"%Y%m%d_%H%M%S")
TIME := $(shell date +"%Y%m%d")
VER := ${TIME}_${CI_COMMIT_SHORT_SHA}
VER_RT := $(shell date +"%Y%m%d_%H%M")

default:
cat Makefile

test:
@echo ${VER}

gsc-build-runtime-image:
docker build -f __cicd__/sct.rt.Dockerfile -t ${IMAGE_NS}/sct-rt:${VER_RT} .
docker push ${IMAGE_NS}/sct-rt:${VER_RT}

ccm-build:
echo ${sid} ${env}
docker build -f __cicd__/ccm.code.Dockerfile --build-arg env=${env} -t ${IMAGE_NS}/ccm-code:${VER}_${env} .
docker push ${IMAGE_NS}/ccm-code:${VER}_${env}

ccm-deploy:
echo ${sid} ${env}
docker build -f __cicd__/gim.code.Dockerfile --build-arg env=${env} -t ${IMAGE_NS}/gim-code:${VER}_${env} .
docker push ${IMAGE_NS}/gim-code:${VER}_${env}
docker exec -w /www/env/sandbox/6.2.0.${sid}_ccm tf_tf_1 terraform apply -auto-approve -var sha=${VER}_${env}

· 2 min read

查看帮助(h) 新建分区(n) 删除分区(d) 查看分区情况(p) 写分区表并退出(w)

mount

# 首先检查是否有硬盘未被挂载
fdisk -l

# 在分别输入n、p、1、2048、1048575999、w
fdisk /dev/vdb

# 对 1 分区格式化
mkfs.ext4 /dev/vdb1

# 新建目录
mkdir disk2

# 分区信息
cat /etc/fstab
echo '/dev/vdb1 /www ext4 defaults 0 0' >> /etc/fstab

# 加载新建分区 reload
mount -a
/etc/sysconfig/network-scripts/ifcfg-eth0 /etc/resolv.conf

7709f5e8-0d1a-4a02-8dde-aca8214bc46c

vi /etc/grub.d/40_custom
menuentry 'Install haikang'{
search --no-floppy --fs-uuid --set=root 7709f5e8-0d1a-4a02-8dde-aca8214bc46c
loopback loop /CentOS-7.6-hik-r5-patch3.iso
linux16 (loop)/isolinux/vmlinuz linux repo=hd:/dev/disk/by-uuid/7709f5e8-0d1a-4a02-8dde-aca8214bc46c:/ nouveau.modeset=0
initrd16 (loop)/isolinux/initrd.img
}
将以上命令中的 08879471-79d3-4d98-9380-c40bb4bc300b替换为记录的UUID(注意是两处),并保证CentOS-7-x86_64-Minimal-1804.iso镜像名称和下载的一致。

vi /etc/default/grub
修改或添加GRUB_DEFAULT=saved 为 GRUB_DEFAULT="CentOS-7-x86_64-Minimal-1804.iso" 注意和下载的镜像名称一致

umount

yum install -y psmisc # fuser
fuser -km /mountdata/ # 释放链接
umount /mountdata # folder name
umount -f /mountdata

· 2 min read

无密码登录

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

pem

ssh-keygen -t rsa -P '' -f ~/.ssh/id_zyj
openssl rsa -in ~/.ssh/id_zyj -outform pem > id_zyj.pem
chmod 700 id_zyj.pem

autossh 内网穿透

https://www.cnblogs.com/kwongtai/p/6903420.html

# 在inner机器用777远端开启9292
ssh -fCNR 9292:localhost:777 root@101.132.151.41
# mysql 代理
ssh -fNg -L 3307:10.10.75.22:3306 -p 22 root@101.1.5.53

# ssh -fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]
# autossh
autossh -f -M Bport监控 -fCNR Bport:Aip:Aport root@Bip
autossh -f -M 6023 -fCNR 6022:localhost:22 -p1022 root@101.132.77.68 # 远程ssh
autossh -f -M 7002 -fCNR 7001:localhost:7003 -p1022 root@101.132.77.68
autossh -f -M 7778 -fCNR 7777:localhost:777 root@101.132.151.41

修改ssh默认端口

vi /etc/ssh/sshd_config
Port 1022
PermitRootLogin yes
service sshd restart

expect iterm 登录

set user zhaoyujie
set password qwerqwer
set timeout -1

spawn ssh -p2222 -i ~/Desktop/docs/zhaoyujie-jumpserver.pem $user@47.101.140.238
expect "*assword:*"
send "$password\r"
# expect "Opt>*"
# send "\r"
interact
#expect eof

vpn

https://www.jianshu.com/p/4801adfcd07e

· One min read

color mariana "color_scheme": "Packages/Color Scheme - Default/Mariana.tmTheme",

setting

"ignored_packages": ["Vintage", "vendor"],

Tools > Build System > New

{
"cmd": ["php", "$file"],
"file_regex": "php$"
}

run it cmd + b

激活码

ZYNGA INC.
50 User License
EA7E-811825
927BA117 84C9300F 4A0CCBC4 34A56B44
985E4562 59F2B63B CCCFF92F 0E646B83
0FD6487D 1507AE29 9CC4F9F5 0A6F32E3
0343D868 C18E2CD5 27641A71 25475648
309705B3 E468DDC4 1B766A18 7952D28C
E627DDBA 960A2153 69A2D98A C87C0607
45DC6049 8C04EC29 D18DFA40 442C680B

1342224D 44D90641 33A3B9F2 46AADB8F

· One min read

常量

//习惯大写
#define MAX 10
#define STING "hello world\n"
//习惯小写
const int a=10;
const char *str = "hello c";

字符串

printf("%p\n",&amp;a);//显示内存地址
printf("%c\n",&amp;a);//字符
printf("%o\n",&amp;a);//八进制
printf("%x\n",&amp;a);//十六进制abcdef
printf("%X\n",&amp;a);//十六进制ABCDEF

char c = 'a';
sizeof(c);//大小1
char c = '\a';//报警
char c = '\b';//退格
char c = '\n';//换行
char c = '\r';//回车

浮点

float a;//sizeof=4 2.000000
double b;//sizeof=4
long double c;//sizeof=8

类型限定

const a;
volatile int a;//a=a+1;a=a+2;a=a+3; 不合并成 a=a+6 变量可能在cpu指令意外的地方改变,编译器不要去优化
register int a;//变量不在内存中,在寄存器中

method

system

#include &lt;stdlib.h&gt;

int main(){
system("ls -l");
return 0;
}

· One min read

doc

install

# https://releases.llvm.org/download.html

# windows
winget.exe install LLVM.LLVM
# LIBCLANG_PATH=D:\programs\LLVM\bin

# Debian-based Linuxes
apt install llvm-dev libclang-dev clang

# mac
brew install llvm
port install clang

命令

### -E 预编译
`gcc -E -o a.e a.c``/usr/include/stdio.h`的内容`include`过来,并`删除注释`
### -S 汇编
`gcc -S -o a.s a.c` `c`转化成`汇编`
### -c 编译
`gcc -c -o a.o a.s` `汇编`转化成`二进制机器指令`
### 链接 没参数
`gcc -o a a.o`

## 快速生成
rm -f a.out;
cc a.c;
./a.out;

`gcc a.c` = `gcc -o a a.c`

· One min read
svn checkout https://svn.coding.net/zx5435/pan/pan-test
svn status
svn add read.md
svn commit -m 'c1'