個人用_linux常用命令

gself發表於2019-03-22

網路 路由 抓包 iptables 相關

# 檢視路由閘道器資訊
ip route
# ip 地址資訊
ip -4 -o addr
# tcpdump 指定網路卡檢視包資訊
tcpdump -i <interface>
# 檢視當前iptables的所有規則
iptables-save -c
複製程式碼

確認網路埠相關

# 持續 ping 並將結果記錄到日誌
ping api.jpush.cn  | awk '{ print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime()) } ' >> /tmp/jiguang.log &`
# 檢視tcp連線狀態
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
# 查詢80埠請求數最高的前20個IP
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20`
複製程式碼
# master_vip
master_vip='10.47.162.19'
port='6443'
result=`echo quit | timeout --signal=9 2 telnet $master_vip $port 2>&1 | grep -w 'Connected'`
echo $result
status=`echo $result | grep -wc 'Connected'`
if [ $status -eq 1 ]; then
    echo -e '\\n$master_vip $port connected OK\\n'
else
    echo "$master_vip $port connected NG\!\!" 1> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
fi

# sys-node flannel
sys_nodes='
10.47.113.176
10.47.113.248
'
port='8472'
for sys_node in $sys_nodes; do
    result=`nc -v -u -z -w 3 $sys_node $port 2>&1 | grep -w ''Connected`
    echo $result
    status=`echo $result | grep -wc 'Connected'`
    if [ $status -eq 1 ]; then
        echo -e "\\n$sys_node $port connected OK\\n"
    else
        echo "$sys_node $port connected NG\!\!" 1> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
    fi
done

# etcd
etcd_ips='
10.47.113.19
10.47.113.23
10.47.113.120
'
port='2379'
for etcd_ip in $etcd_ips; do
    result=`echo quit | timeout --signal=9 2 telnet $etcd_ip $port 2>&1 | grep -w 'Connected'`
    echo $result
    status=`echo $result | grep -wc 'Connected'`
    if [ $status -eq 1 ]; then
        echo -e "\\n$etcd_ip $port connected OK\\n"
    else
        echo "$etcd_ip $port connected NG\!\!" 1> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
    fi
done

# docker_registry_proxy
registry_proxy_vip='10.47.160.116'
ports='80 443 8080 9090'
for port in $ports; do
    result=`echo quit | timeout --signal=9 2 telnet $registry_proxy_vip $port 2>&1 | grep -w 'Connected'`
    echo $result
    status=`echo $result | grep -wc 'Connected'`
    if [ $status -eq 1 ]; then
        echo -e "\\n$registry_proxy_vip $port connected OK\\n"
    else
        echo "$registry_proxy_vip $port connected NG\!\!" 1> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
    fi
done
複製程式碼

rpm、yum相關

# 查詢是否有安裝某個軟體
rpm -qa jen*
# 列出軟體的檔案內容
rpm -aql jenkins*
複製程式碼

查詢檔案相關

替換目錄中CR(\r\n)換行符為R(\n)換行符

$ find ./ -type f | xargs -n1 -I {} sed -i 's@\r@@g' {}

$ find ./ -maxdepth 1 -type f | xargs -n1 -I {} sed -i 's@\r@@g' {}

find與grep結合使用,從多個檔案中搜尋關鍵字並顯示檔名

$ find ./ -type f -print | xargs grep 'hoge'

排除某個目錄,排除多個指定目錄

# 排除多個目錄
$ find SRC-PATH -path 'IGNOR-PATH' -prune -o -path 'IGNOR-PATH2' -prune -o -print
# 另一種方式,使用!邏輯操作符
$ find SRC-PATH ! -path 'IGNOR-PATH*' ! -path 'IGNOR-PATH2*' -print
複製程式碼

程式資訊相關

# 找出當前系統記憶體使用量較高的程式
ps -aux | sort -rnk 4 | head -20
# 找出當前系統CPU使用量較高的程式
ps -aux | sort -rnk 3 | head -20
複製程式碼

停啟程式

#!/bin/bash

services=(
    kubelet
    kube-proxy
    docker
    flanneld
)

for service in ${services[@]} ; do
    systemctl stop $service
done

services=(
    flanneld
    docker
    kube-proxy
    kubelet
)

for service in ${services[@]} ; do
    systemctl start $service
done
複製程式碼

磁碟清理相關

因為/data/archive是 NFS 網盤,整理本地硬碟的資料不需要包含進去,因此用du --excluede來排除一邊不檢查此 FS。

alias dua="du --exclude=/data/archive --exclude=/hash -sh * |sort -hr"

重定向、管道相關

# 使用while read line語句,將程式標準錯誤stderr用紅色字型列印
COMMAND 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
# 應用篇 用紅色字型列印
echo "$master_vip $port connected NG\!\!" 1> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
複製程式碼

ansible相關

ansible 語法檢查

# 列出主機
$ ansible-playbook -i HOSTS_FILE --list-hosts PLAYBOOK_FILE
# 語法檢查
$ ansible-playbook --syntax-check PLAYBOOK_FILE
# 列出task
$ ansible-playbook -i HOSTS_FILE --list-tasks PLAYBOOK_FILE
# 檢查語法是否正確
$ ansible-playbook --check PLAYBOOK_FILE
複製程式碼

golang相關

# Mac 下編譯 Linux 和 Windows 64位可執行程式

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

# Linux 下編譯 Mac 和 Windows 64位可執行程式

$ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

# Windows 下編譯 Mac 和 Linux 64位可執行程式

$ SET CGO_ENABLED=0
$ SET GOOS=darwin
$ SET GOARCH=amd64
$ go build main.go

$ SET CGO_ENABLED=0
$ SET GOOS=linux
$ SET GOARCH=amd64
$ go build main.go
複製程式碼

GOOS:目標平臺的作業系統(darwin、freebsd、linux、windows) GOARCH:目標平臺的體系架構(386、amd64、arm) 交叉編譯不支援 CGO 所以要禁用它

上面的命令編譯 64 位可執行程式,你當然應該也會使用 386 編譯 32 位可執行程式 很多部落格都提到要先增加對其它平臺的支援,但是我跳過那一步,上面所列的命令也都能成功,且得到我想要的結果,可見那一步應該是非必須的,或是我所使用的 Go 版本已預設支援所有平臺。

helm 相關

cd /data/helm/all-chart/34a2b228-a5f7-4b17-ae67-b9aaf804073c/
cd palite-sharecloud-stg2_0.0.1

file_to_sed=`find ./ -type f -print | xargs grep 'palite-aggregate1.0.0' | awk -F: '{print $1}'`
echo $file_to_sed

app_name=`ls | sed -ne 's/-stg2//gp'`
app_name=$app_name'1.0.0'
echo $app_name

for file in `echo $file_to_sed`; do
    sed -i "s/palite-aggregate1.0.0/$app_name/g" $file
done

file_to_sed=`find ./ -type f -print | xargs grep 'paliteaggregate' | awk -F: '{print $1}'`

app_name=`ls | sed -ne 's/-stg2//g; s/-//gp'`

for file in `echo $file_to_sed`; do
    sed -i "s/paliteaggregate/$app_name/g" $file
done

file_to_sed=`find ./ -type f -print | xargs grep 'shb-dmz-stg-ae5a45f9' | awk -F: '{print $1}'`

for file in `echo $file_to_sed`; do
    sed -i "s/shb-dmz-stg-ae5a45f9/shb-dmz-stg-f7847ac7/g" $file
done
複製程式碼

docker 相關

# build -t標記選項,在建立映象檔案的同時打標籤 . 為使用當前目錄下Dockerfile檔案為Dockerfile
docker build -t hub.yun.paic.com.cn/library/go-server:latest .
# run --expose 指定暴露埠,expose在應用上一般只是作為哪個埠提供哪個服務的提示,在宿主機上並不能訪問到此埠。
docker run --expose 9860 -t -i --rm hub.yun.paic.com.cn/library/go-server sh
# run -p 釋出埠,127.0.0.1:9860為宿主機埠。
docker run -p 127.0.0.1:9860:9860/tcp --rm hub.yun.paic.com.cn/library/go-server
# 列出所有映象
docker images -a
# 刪除映象
docker rmi Image Image
# 刪除所有不再被使用的資料(按照順序: 停止的容器,沒有容器使用的卷,沒有容器使用的映象)。如果要刪除從未被使用的資料,可以使用'-a'引數。
docker system prune
# 另外還有:
docker container prune
docker image prune
docker network prune
docker volume prune
複製程式碼

kubernetes 相關

# list pods
n_namespace=$(grep -iw namespace /root/.kube/config | cut -d':' -f2 | sed 's/^ *//g')
kubectl get pods --namespace=<namespace>

# get node show-label
kubectl get nodes --show-labels | sed -n '1p;/\<30\.4\.171\.24\>/p'

# create resource
# check yaml errors
kubectl create --dry-run --validate -f ./go-server.yaml
# use --record 來記錄resource被執行過的命令,命令會被記錄在resource的annotation的kubernetes.io/change-cause當中。
kubectl create -f ./go-server.yaml --record
# create configmap using file as content
kubectl create configmap nginx --namespace=shb-dmz-qiye-portal-stg-9d135f6b --from-file=./nginx.conf

# kill pod forcibly
kubectl -n shb-sf-stg-046a2940 delete pods sps-search-service-74fddcdfc-lbf7n --grace-period=0 --force

# watch log
kubectl logs -f --tail=100 traefik-ingress-lb-9qdhv -n kube-system

# enter container
kubectl exec falcon-caas-watcher-5d6b5874-wsdcw --namespace=kube-system -i -t -- bash -il

# copy content from container to host filesystem
kubectl cp itax-core-taxation-6857465f7f-jl7gb:/root/heap.hprof /tmp/itax-core-taxation_heap_30.4.171.20.hprof --namespace=shb-sf-stg-cf156ca8

# kubectl jsonpath
# 檢視當前叢集網路使用的所有子網 podCIDR
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

# kubectl json
$ kubectl get no -o json \
| jq '.items[] | { node_ip: .metadata.labels."kubernetes.io/hostname", host_name: .metadata.labels.host_name, labels: .metadata.labels }' \
| grep -v -e 'beta.kubernetes.io/arch' -e 'beta.kubernetes.io/os' -e 'kubernetes.io/hostname'

# go-template
# write below to a file named 'nodes-taints.tmpl'
{{printf "%-50s %-12s\n" "Node" "Taint"}}
{{- range .items}}
    {{- if $taint := (index .spec "taints") }}
        {{- .metadata.name }}{{ "\t" }}
        {{- range $taint }}
            {{- .key }}={{ .value }}:{{ .effect }}{{ "\t" }}
        {{- end }}
        {{- "\n" }}
    {{- end}}
{{- end}}
# then reference like this:
kubectl get nodes -o go-template-file="./nodes-taints.tmpl"
# you'll get output like so:
Node                                            Taint
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=containerlinux-canary-channel-workers:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
複製程式碼

相關文章