Shell Script

Table of Contents

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
  • 문자열 aaaabbbb 로 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