From 2356c5f5b5efc40b42075f1dad16eaa94cb71af4 Mon Sep 17 00:00:00 2001 From: escho Date: Thu, 31 Aug 2023 16:30:04 +0900 Subject: [PATCH] docs: Update shell & network --- _posts/tip/0000-01-01-shell.md | 300 ++++++++++++++++++++++++++++++- _posts/tip/0000-01-02-network.md | 8 + 2 files changed, 307 insertions(+), 1 deletion(-) diff --git a/_posts/tip/0000-01-01-shell.md b/_posts/tip/0000-01-01-shell.md index 862c334..09a086e 100644 --- a/_posts/tip/0000-01-01-shell.md +++ b/_posts/tip/0000-01-01-shell.md @@ -19,13 +19,20 @@ description: Development Tips - Shell Script * [`sed`](#sed) : (행)추가, 변환, 제거 처리하여 출력 * [`tee`](#tee) : 표준출력 또는 파일에 쓰는 명령어 * [텍스트 파일 라인별 출력](#텍스트-파일-라인별-출력) + * [`ex`](#ex) : `vi`의 line-editor 모드 명령어 * [텍스트 파일 생성](#텍스트-파일-생성) +* [if 연산자](#if) +* [for ~ in ~](#for--in) * [Use cases of Shell](#use-cases-of-shell) * [key=value 파라메터](#keyvalue-파라메터) + * [Passwordless and Sudoers](#passwordless-and-sudoers) + * [`sudo sh EOF`](#sudo-sh-eof) + * [Check for IP validity](#check-for-ip-validity) * [System Daemon](#system-daemon) * [`systemd`](#systemd) * [`systemctl`](#systemctl) -* [Kernel](#Kernel) +* [`apt`](#apt) +* [Kernel](#kernel) ## `curl` > 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구 @@ -36,6 +43,19 @@ description: Development Tips - Shell Script ▒ 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 -O https://cube.k3.acornsoft.io/download-cubectl +▒ curl -o download-cubectl.sh https://cube.k3.acornsoft.io/download-cubectl +``` + +* 리모트 sh 파일 로컬 실행 + +``` +▒ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.18.2 TARGET_ARCH=x86_64 sh - +``` + * 기타 사용법 @@ -47,8 +67,121 @@ description: Development Tips - Shell Script ▒ curl -i https://httpbin.org/ip # -i : print with http-headers ~~~ + ## Standard IO +### Variables + +* 특정 범위의 문자열 자르기 `${STR:offset:length}` + +``` +▒ str="Hello, World, Bash" + +▒ echo "${str:0:5}" +Hello + +▒ echo "${str:7}" +World, Bash + +▒ echo "${str:(-4)}" +Bash + +▒ echo "${str:(-4):2}" +Ba +``` + +* 첫번째 문자열 포함, 가장 짧게 매칭되는 문자열 삭제 : `${STR#PATTERN}` + +``` +▒ str="AAABBBCCC" + +▒ echo ${str#A*B} +BBCCC + +▒ echo ${str#*B} +BBCCC + +▒ echo ${str#B*C} +AAABBBCCC +``` + +``` +▒ str1="/data/harbor" +▒ str2="data/harbor" + +▒ echo ${str1#/} = ${str2#/} +data/harbor = data/harbor +``` + +* 첫번째 문자열 포함, 가장 짧게 매칭되는 문자열 삭제 : `${STR##PATTERN}` + +``` +▒ str="AAABBBCCC" + +▒ echo ${str##A*B} +CCC + +▒ echo ${str##*B} +CCC + +▒ echo ${str##B*C} +AAABBBCCC +``` + +* 마지막 문자열 포함, 가장 짧게 매칭되는 문자열 삭제 : `${STR%PATTERN}` + +``` +▒ str="AAABBBCCC" + +▒ echo ${str%A*B} +AAABBBCCC + +▒ echo ${str%*B} +AAABBBCCC + +▒ echo ${str%B*C} +AAABB +``` + +* 마지막 문자열 포함, 가장 길게 매칭되는 문자열 삭제 : `${STR%%PATTERN}` + +``` +▒ str="AAABBBCCC" + +▒ echo ${str%%A*B} +AAABBBCCC + +▒ echo ${str%%*B} +AAABBBCCC + +▒ echo ${str%%B*C} +AAA +``` + +* Null 이면 default 문자열 출력 `${STR:-value}` + +``` +▒ str="" +▒ echo ${str:="default value"} +default value + +▒ echo ${str} + +``` + +* Null 이면 default 문자열 출력 및 변수값 지정 `${STR:=value}` + +``` +▒ str="" +▒ echo ${str:="default value"} +default value + +▒ echo ${str} +default value +``` + + + ### `cut` > 파일 또는 표준입력 문자열을 바이트, 문자열, 필드 기준으로 문자열을 잘라 출력 @@ -140,6 +273,19 @@ cb-cluster-w-xzuz4 ▒ cat aaa.txt | while read line; do if [[ "$line" != "" ]]; then echo -n "$line\n";fi; done ~~~ +### `ex` + +* 예 : `openssl.conf` 파일에서 `DNS.1 = localhost` 찾아 `DNS.2 = www.itnp.kr` 라인을 추가 + +``` +▒ ex openssl.conf < +elif [ expression ]; then + +else + +fi + +if [ expression ] +then + +else + +fi +``` + +* Not +``` +if [ ! -f "$filename" ] +fi +``` + +* 비교 연산자 + * `-z` a : 문자열 길이가 0 + * `-n` a : 문자열 길이가 0 이상 + * a `–eq` b : a == b (equal) + * a `–ne` b : a != b (negative) + * a `–gt` b : a > b (greater then) + * a `–lt` b : a < b (less then) + * a `–ge` b : a >= b (greater or equal) + * a `–le` b : a <= b (less or equal) + +``` +# 매개변수가 1보다 작으면 +if [ $# -lt 1 ]; then +fi +``` + +* 파일 검사 + + * `-e` : Exist (노드, 디렉토리, 블록장치, 소켓 등) + * `-d` : Directory + * `-f` : File + * `-w` : Writable + * `-x` : Execuable + * `-r` : Readable + * `-O` : 소유자가 현재 사용자 + * `-G` : 소유자 그룹이 현재 사용자 + * `-h` : 심볼릭 링크 + * `-b` : 블록 디바이스 + * `-S` : 소켓 디바이스 + * `-c` : 캐릭터 장치 파일이면 + * `-s` : 0보다 큰 파일 + * a `-nt` b : a 가 b 보다 최신파일 + * a `-ot` b : a 가 b 보다 이전파일 + * a `-ef` b : a 와 b 가 같은 파일이 + ## Use cases of Shell @@ -222,6 +456,55 @@ echo "AWS_FILE=${AWS_FILE}" ``` +### Passwordless and Sudoers + +* Passwordless + +``` +▒ USER="ubnutu" +▒ SERVERS='192.168.122.20 192.168.122.251' +``` + +``` +▒ for IP in $SERVERS +do + scp ${HOME}/cubectl-key.pub ${USER}@${IP}:/home/${USER}/cubectl-key.pub + ssh ${USER}@${IP} <> /home/${USER}/.ssh/authorized_keys +EOF +done +``` + +* sudoers + +``` +▒ for IP in $SERVERS +do + ssh -i ${HOME}/cubectl-key ${USER}@${SERVER_1} < https://ko.linux-console.net/?p=10360#gsc.tab=0 + +``` +▒ sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install iptables-persistent +▒ sudo iptables-save -t nat | sudo tee /etc/iptables/rules.v4 +``` + ### Use cases