Shell Script
Table of Contents
- Standard IO
cut
: 바이트, 문자열, 필드 기준으로 문자열을 잘라 출력awk
: 행과 단어 별로 처리해 출력sed
: (행)추가, 변환, 제거 처리하여 출력tee
: 표준출력 또는 파일에 쓰는 명령어- 텍스트 파일 라인별 출력
- 텍스트 파일 생성
- Use cases of Shell
- System Daemon
- Kernel
curl
다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구
- HTTPS 요청 with 인증서
▒ curl -HHost:httpbin.example.com --resolve httpbin.example.com:31390:192.168.0.99 --cacert httpbin.example.com/2_intermediate/certs/ca-chain.cert.pem https://httpbin.example.com:31390
- 기타 사용법
▒ curl -s https://httpbin.org/headers -X GET # http methods (GET,POST,PUT,DELETE)
▒ curl -s https://httpbin.org/headers -H "Header1:value1" -H "Header2:value2" # add http header
▒ curl -s https://httpbin.org/headers -o /dev/null # output empty
▒ curl -s https://httpbin.org/headers -o /dev/null -w "code:%{http_code}"; # response code
▒ curl -i https://httpbin.org/ip # -i : print with http-headers
Standard IO
cut
파일 또는 표준입력 문자열을 바이트, 문자열, 필드 기준으로 문자열을 잘라 출력
cut -f1 -d ' '
: ‘ ‘ 로 구분 했을 때 첫번째 컬럼
▒ kubectl get secrets | grep default | cut -f1 -d ' '
awk
표준입력 문자열를 행과 단어 별로 처리해 출력
# 2행 1번째 컬럼 값
▒ kubeadm token list | awk 'FNR==2 {print $1}'
▒ kubeadm token list | awk 'FNR==2 {print "token = " $1}'
# output 라인 갯수
▒ kubectl get nodes | awk 'END { print NR }'
sed
표준입력을 (행)추가, 변환, 제거 처리하여 출력
- admin.conf 파일에서
server:
로 시작하는 행에서server: (none)
행을 추가하고 5번행을 삭제해 출력한다.
▒ sed -e '/server:/i\server: (none)' -e '5d' admin.conf
- admin.conf 파일에서 5번행을 ` server: https://100.100.100.0:6443` 로 교체해서 출력
▒ sed '5s/.*/ server: https:\/\/100.100.100.0:6443/g' /etc/kubernetes/admin.conf
- credentials 파일 2행에서
aws_secret_access_key =
문자열을 제거하고 출력▒ head -n 2 credentials | tail -n 1 | sed 's/aws_secret_access_key = //g'
- /etc/hosts 파일에서
127.0.0.1
로 시작 하는 행을127.0.0.1 localhost itnp.kr
로 변경
▒ sed -i "s/127.0.0.1.*/127.0.0.1 localhost itnp.kr/g" /etc/hosts
- 문자열
aaaa
를bbbb
로 replace
▒ echo "aaaa.bbbb.cccc" | sed -e "s/aaaa/bbbb/g"
bbbb.bbbb.cccc
- 큰따옴표를 제거 Replace - “"를 앞에 붙여줌
▒ echo "\"cb-cluster-w-xzuz4\"" | sed -e "s/\"//g"
cb-cluster-w-xzuz4
tee
표준입력을 표준출력 또는 파일에 쓰는 명령어
- 파일에 행 추가
▒ echo "set \$l7 ${COMMAND};" | sudo tee -a /usr/local/nginx/conf/nginx-test.conf"
텍스트 파일 라인별 출력
- 파일을 읽어 LF(line feed) 를 “\n” 로 전환한 문자열로 변환
# 방법 1
▒ while read line; do if [[ "$line" != "" ]]; then echo -n "$line\n";fi; done < aaa.txt
# 방법 2
▒ cat aaa.txt | while read line; do if [[ "$line" != "" ]]; then echo -n "$line\n";fi; done
텍스트 파일 생성
echo
로 파일 만들기
▒ echo -e "[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PrivateKey = $(sudo wg genkey)" | sudo tee /etc/wireguard/wg0.conf
cat
으로 파일 생성 sudo
▒ sudo bash -c 'cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF'
- 작은 따옴표안에서 작은 따옴표 문자열 사용 :
\047
▒ echo -e 'kubectl get nodes --no-headers | awk \047END { print NR }\047'
kubectl get nodes --no-headers | awk 'END { print NR }'
sudo cat
으로 파일 생성
▒ sudo cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
Use cases of Shell
key=value 파라메터
./credentials.sh aws="..." gcp="...."
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
aws) AWS_FILE=${VALUE} ;;
gcp) GCP_FILE=${VALUE} ;;
azure) AZURE_FILE=${VALUE} ;;
alibaba) ALIBABA_FILE=${VALUE} ;;
tencent) TENCENT_FILE=${VALUE} ;;
oepnstack) OPENSTACK_FILE=${VALUE} ;;
*)
esac
done
echo "AWS_FILE=${AWS_FILE}"
System Daemon
systemd
https://fmd1225.tistory.com/93
servaice 파일
- Unit, Service, Install 섹션으로 구성
- ExecStart : 실행 command
- After : 이전에 실행할 서비스들, 나열된 서비스 이후에 실행 하겠다는 의미
- Before: 이후에 실행할 서비스들, 나열된 서비스 이전에 실행 하겠다는 의미
▒ sudo bash -c 'cat > /lib/systemd/system/ladybug-bootstrap.service <<EOF
[Unit]
Description=Ladybug bootstrap script
After=multi-user.target
StartLimitIntervalSec=60
StartLimitBurst=3
[Service]
ExecStart=/lib/systemd/system/ladybug-bootstrap
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=kubelet.service
EOF'
# reload 및 reboot 시 실행하도록 지정
▒ sudo systemctl daemon-reload
▒ sudo systemctl enable ladybug-bootstrap
- 조회
# unit 파일 리스트
▒ systemctl list-unit-files
# unit 파일 보기
▒ systemctl show kubelet.service
systemctl
# 실패 서비스 조회
▒ sudo systemctl --failed
# 동작중 서비스
▒ systemctl
# 의존관계 조회
▒ systemctl list-dependencies
▒ systemctl list-dependencies kubelet.service
# critical-chain
▒ systemd-analyze critical-chain
▒ systemd-analyze critical-chain kubelet.service
# 부팅과정에 각 서비스별 초기화하는데 걸린 시간
▒ systemd-analyze blame
# 부팅과정 svg 파일로 저장
▒ systemd-analyze plot > order.svg
# targe 조회
▒ systemctl list-units --type target --all
Kernel
▒ lsmod | grep 8021q # 커널에서 vlan 모듈(8021q) 존재 확인
▒ modprobe 8021q # 커널에 vlan 모듈(8021q) 추가
posted at 2022/03/18 09:42