vagrant up 오류가 발생하여 여러 시도를 해봤지만 실패..

강사님이 제시해준 다른 방법으로 하기로 결정

 

제공해준 파일로 가상머신 3대로 만들어 머신 시작누르자 네트워크 에러 발생

미리 언질로 네트워크 오류 해결 방법을 남겨주셔서 보고 하려고 했지만 

 VirtualBox Host-Olny Ethernet Adapter 이름을 가진 이더넷을 찾을 수 없어서 수동으로 추가함

 

 VirtualBox Host-Olny Ethernet Adapter 수동으로 추가 방법

1 . (윈도우 + r) 실행 창

2 . cmd

3 . cd c:\Program Files\Oracle\VirtualBox

4 . VBoxManage.exe -v

5 . VBoxManage.exe hostonlyif create

window 10에서 cmd 창에 붙여넣기가 안돼서 애먹은적 있었다.

결국 해결 못하고 보류중이였는데,,,

어제부터 지금까지 (어느새 12시가 넘어버림)  인프런 강의 듣던중 window cmd 사용할 일이 생겼다,

이번에도 붙혀넣기 기능이 필요해 저번에 해결 못한 붙여넣기 방법을 찾다가 어느 블로그를 보던 중 

 

저 노란색 부분이 체크가 되어있는 걸 발견했다.

나의 cmd 속성에는 삽입모드가 체크되어있지 않았다.

그래서 체크하고 붙여넣기 한 순간... 드디어.. 성공!!!!

 

감격이다..

'클라우드 > BashShell' 카테고리의 다른 글

웹서버 트러블 슈팅을 위한 쉘 스크립트  (0) 2023.03.03
vagrant up 오류  (0) 2023.03.03
고급 명령어  (0) 2023.02.28
메뉴 구성  (0) 2023.02.28
대화식 쉘 스크립트  (0) 2023.02.28

CUT (awk의 하위 호환)
: 간결한 문법으로 파일에서 문자열 필드를 뽑아내는 명령

SED
: 텍스트 입력 스트림을 받아 출력을 제어할 수 있는 명령
장점
한줄 만큼의 메모리를 사용하여 메모리가 적게 들어 빠르게 처리 가능
단점
라인단위로 처리되어 지나간 라인에 대해 처리가 불가능하다.
sed 옵션 문자열처리_스크립트 파일명
-
옵션
- e : 입력을 처리하는 하나의 처리 명령을 의미 , 여러번 지정하여 여러번의 처리가 가능
- f file : 사전에 명령을 추가한 파일을 지정하여 명령을 수행
- n : 각 명령의 결과를 화면에 출력하지 않고 print 명령을 대기
- r : 확장된 정규표현식을 사용
-
문자열처리 명령어


echo "이것은 테스트입니다." | sed 's/테스트/test/'

s/소스패턴/결과패턴
[root@localhost ~]# cat data.txt
1. it is test
2. it is test
3. it is test
4. it is test
5. it is test
6. it is test
7. it is test

[root@localhost ~]# sed 's/test/sed test/' data.txt
1. it is sed test
2. it is sed test
3. it is sed test
4. it is sed test
5. it is sed test
6. it is sed test
7. it is sed test
->치환하는 명령어를 사용하여 단어가 치환된 상태로 출력

[root@localhost ~]# cat data.txt
1. it is test
2. it is test
3. it is test
4. it is test
5. it is test
6. it is test
7. it is test
->  파일을 읽어서 화면에 출력하는 부분만 관여하기 때문에 원본파일은 그대로 있다.

[테스트라인 - 범위] s/소스패턴/결과패턴
[root@localhost ~]# sed '3,5s/test/sed test/' data.txt
1. it is test
2. it is test
3. it is sed test
4. it is sed test
5. it is sed test
6. it is test
7. it is test
-> 3번째 줄에서 5번째 줄까지만 변경됨

[테스트라인 -범위]/d
[root@localhost ~]# sed '3,5d' data.txt
1. it is test
2. it is test
6. it is test
7. it is test
-> 3번부터 5번까지 삭제

sed 사용할 때는 원본파일에 저장하면 에러가남
-> 출력을 리다이렉트를 사용하여 파일을 쓰거나 sed에 w플래그를 사용하여 쓸수 있다.
[root@localhost ~]# sed 's/test/sed tset/w data2.txt' data.txt
1. it is sed tset
2. it is sed tset
3. it is sed tset
4. it is sed tset
5. it is sed tset
6. it is sed tset
7. it is sed tset

or

[root@localhost ~]# cat data2.txt
1. it is sed tset
2. it is sed tset
3. it is sed tset
4. it is sed tset
5. it is sed tset
6. it is sed tset
7. it is sed tset

-e 명령어 사용
[root@localhost ~]# sed -e 's/test/sed test/; s/is/is not/' date.txt <-- ;를 이용해서 구분하여 치환
1. it is not sed test
2. it is not sed test
3. it is not sed test
4. it is not sed test
5. it is not sed test
6. it is not sed test
7. it is not sed test

-n 옵션과 p플래그
[root@localhost ~]# sed -n 's/test/sed test/' date.txt
-> n옵션만 사용할 경우 출력 X
[root@localhost ~]# sed -n 's/test/sed test/p' date.txt
-> p플래그를 붙혀주면 출력O
1. it is sed test
2. it is sed test
3. it is sed test
4. it is sed test
5. it is sed test
6. it is sed test
7. it is sed test

-f 옵션
vi two.sed
s/test/sed tset/
s/is/is not/
위와같은 파일을 만들고
sed -f two.sed data.txt 명령어 입력하면 치환된 상태로 출력됨

[root@localhost] sed -n '/^3/p' date.txt
3. it is test
-> 정규표현식 사용하여 출력

AWK
: sed기능 + 변수/함수/연산자를 사용하여 필요한 데이터를 제어할 수 있는 프로그램이 가능한 명령
awk 옵션 읽어들일_파일명
-F 필드구분자 : 필드(각각의 항목)를 구분하기 위한 구분자를 지정
-f 파일이름 : awk프로그램이 읽어들일 파일 이름을 지정
-변서 =변수값 : awk프로그램에서 사용할 변수를 지정

awk '{print $1}' txt13  
-> 첫번째 필드는 $1
awk '{print $1}' txt13 | grep ccc 
-> ccc만 출력
awk '/ccc/ {print $1}' txt13 
-> grep사용하지 않고 ccc만 출력
grep 111 txt13 | awk '{print S3}' 
-> grep사용하여 111이 있는 줄을 찾아서 세번째 필드값(zzz)을 출력
awk '/111/ {print $3}' txt13 
-> grep사용 하지 않고 111이 있는 줄을 찾아서 세번째 필드값(zzz)을 출력
awk -F: '{print $1}' colon_txt13 
-> 구분자 :를 기준으로 출력

[root@localhost ~]# uptime | awk -Faverage: '{print $2}'
 0.01, 0.02, 0.00
[root@localhost ~]# uptime | awk -Faverage: '{print $1}'
 22:06:53 up  2:40,  0 users,  load
-> 특수 기호 뿐만 아닌 문자도 구분자가 될 수 있다.



정규표현식
: 텍스트의 패턴을 특수문자 등을 사용하여 표현한 것


ls -1 a*
ls -1 | grep ^ a
ls -al txt[0-9]  <- [ ] 하나당 한 문자
ls -al txt[0-9]^[0-9]      (자꾸옵션지정돼서 ^ 써놓음 실제 사용할 때는 빼고쓰기 )
find . -type f -iname "t*" 
iname : 정규표현식 인식

'클라우드 > BashShell' 카테고리의 다른 글

vagrant up 오류  (0) 2023.03.03
window10 cmd 붙여넣기 해결  (0) 2023.03.02
메뉴 구성  (0) 2023.02.28
대화식 쉘 스크립트  (0) 2023.02.28
간단 쉘 스크립트 array, redirect  (0) 2023.02.27

메뉴가 있는 쉘 스크립트

CLI로 만들기
vi menu.sh

1. uptime
2. df -h
3. free -m
4. pstree
5. 서버를 입력받아서 그 서버에 ssh로 접속

함수작성
메뉴를 화면에 표시하기 위해서 clear명령어로 화면지움
txt로 메뉴를 출력  <-- menu 함수
메뉴 선택해서 실행 이후에 일시중지 Press any key to continue... <-- press_key
while true

#!/bin/bash

function menu {
clear
cat << EOF
   ========== menu =========
   1. 로드 에버리지
   2. 디스크 상태
   3. 메모리 상태
   4. 프로새스 트리
   5. 입력한 서버에 ssh 접속
   6. 메뉴 종료
   =======================
EOF
read -p "hope : " SELECT
}
function press_key {
        echo
        read -n1 -rsp "Press any key to continue..."
        echo
        echo
}

while true
do
 menu
        case ${SELECT} in
                1)
                        clear
                        echo "로드 에버리지"
                        uptime
                        press_key
                        ;;
                2)
                        clear
                        echo "디스크 상태"
                        df -h
                        press_key
                        ;;
                3)
                        clear
                        echo "메모리 상태"
                        free -m
                        press_key
                        ;;
                4)
                        clear
                        echo "프로세스 트리"
                        pstree
                        press_key
                        ;;
                5)
                        clear
                        read -p "접속하고 싶은 서버 이름을 입력해주세요, (cent[1-3]) : " SVR
                        sleep 1
                        echo "${SVR}에 접속합니다..."
                        ssh ${SVR}
                        ;;
                6)
                        exit 0
                        ;;
                * )
                        echo " wrong num"
                        press_key
                        ;;
        esac
done


↓↓↓↓↓

GUI로 만들기

dialog --옵션명 옵션에필요한변수



#!/bin/bash

function menu {
        dialog --title " GUI MENU " \
                --radiolist "select" 20 35 6 \ <-- 가로사이즈 세로사이즈 메뉴의 개수(숫자)
                1. "로드 에버리지" off \ <-- 아무것도 선택하지 않은상태에서 실행하기 위해 off를 써준다.
                2. "디스크 상태" off \
                3. "메모리 상태" off \
                4. "프로새스 트리" off \
                5. "입력한 서버에 ssh 접속" off \
                6. "메뉴 종료" off \
                2>./select <-- 표준입력 - 0 , 표준출력 - 1, 표준에러 - 2
}

function press_key {
        echo
        read -n1 -rsp "Press any key to continue..."
        echo
        echo
}

while true
do
       menu
        SELECT=$(cat select)
        case ${SELECT} in
                1)
                        clear
                        echo "로드 에버리지"
                        uptime
                        press_key
                        ;;
                2)
                        clear
                        echo "디스크 상태"
                        df -h
                        press_key
                        ;;
                3)
                        clear
                        echo "메모리 상태"
                        free -m
                        press_key
                        ;;
                4)
                        clear
                        echo "프로세스 트리"
                        pstree
                        press_key
                        ;;
                5)
                        clear
                        read -p "접속하고 싶은 서버 이름을 입력해주세요, (cent[1-3]) : " SVR
                        sleep 1
                        echo "${SVR}에 접속합니다..."
                        ssh ${SVR}
                        ;;
                6)
                        exit 0
                        ;;
                * )
                        echo " wrong num"
                        press_key
                        ;;
        esac
done

'클라우드 > BashShell' 카테고리의 다른 글

window10 cmd 붙여넣기 해결  (0) 2023.03.02
고급 명령어  (0) 2023.02.28
대화식 쉘 스크립트  (0) 2023.02.28
간단 쉘 스크립트 array, redirect  (0) 2023.02.27
간단 쉘 스크립트 function  (0) 2023.02.27

대화식 쉘 스크립트

쉘 스크립트 실행 후 사용자에게 입력을 받은 숫자/문잦를 처리
정해진 숫자 맞추기 게임

read 명령어에 자주사용하는 옵션
p & s
read -[ p | s ] "화면에표시할문자" 변수이름

vi read_test.sh
(p 옵션 사용- )
#!/bin/bash

read -p "아무문자나 입력 해주세요 : " ANY
echo ${ANY} 

(s 옵션 사용-> s를 사용할 때는 p 앞에 붙혀야한다. - s는 시크릿 모드로 문자를 입력할 때 화면에 보이지 않고 출력 후에 보인다.)
#!/bin/bash

read -sp "아무문자나 입력 해주세요 : " ANY
echo ${ANY} 


간단 숫자 맞추기 게임 만들기


1. 1~100사이의 숫자를 랜덤으로 생성해서 GOAL에 저장
2. 반복해서 사용자에게 숫자를 입력받음
3. 입력받은 숫자를 GOAL과 비교해서
3-1. 입력받은 숫자가 GOAL보다 크면 숫자가 크다는 메세지를 출력
3-2. 입력받은 숫자가 GOAL보다 작으면 숫자가 작다는 메세지를 출력
3-3. 입력받은 숫자가 GOAL보다 같으면 축하메세지를 출력, 몇 번만에 맞췄는지 알려준다.
4. 3-3을 출력한 후 쉘스크립트를 종료


vi num_game.sh
#!/bin/bash

GOAL=$ (($RANDOM% 100+1))
CNT=0
while true

do
        read -p "1~100숫자를 입력해주세요 : " NUM
         CNT=$ (($ {CNT} + 1))
        if [ ${NUM} -gt ${GOAL} ]
        then
                echo " 입력한 숫자가 더 큽니다. "
        elif [ ${NUM} -lt ${GOAL} ]
        then
                echo " 입력한 숫자가 더 작습니다. "
        elif [ ${NUM} -eq ${GOAL} ]
        then
                echo " 축하합니다. ${CNT}번만에 숫자를 맞췄습니다.!! "
                exit 0 (명령이 성공적으로 완료)(1은 알수없는 오류)
        fi

done

왜왜 안되는건데에

'클라우드 > BashShell' 카테고리의 다른 글

고급 명령어  (0) 2023.02.28
메뉴 구성  (0) 2023.02.28
간단 쉘 스크립트 array, redirect  (0) 2023.02.27
간단 쉘 스크립트 function  (0) 2023.02.27
간단 쉘 스크립트 반복문  (0) 2023.02.27


배열
배열에 숫자 또는 문자 사용 가능
단, 쉘 스크립트에서는 배열을 자주 사용 안함,, 복잡하게 만들기 때문에
속도는 느리지만 배열대신 file을 사용

test_array=(one two three 4 5 6 7)
[root@localhost ~]# echo ${test_array}  <- 디폴트로 첫번째 값만 출력됨
one
[root@localhost ~]# echo ${test_array[1]}  <- 배열번호 지정가능
two
[root@localhost ~]# echo ${test_array[ * ]}
one two three 4 5 6 7

[root@localhost ~]# for i in $(seq 0 7);do echo $ { test_array [${i}]};done
one
two
three
4
5
6
7

리다이렉션
- 입력 /출력 /에러(표준 스트림)를 지정한 곳으로 바꿔준다.
- 쉘 스크립트 안에서 텍스트 파일의 활용
- 표준출력 = 1 표준에러 = 2

WORK안에 있는 txt 파일 리스트 보기
[root@localhost WORK]# ls -al txt?
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt1
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt2
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt3

WORK안에 없는 파일이 있으면 없는 파일은 에러메세지 뜸
[root@localhost WORK]# ls -al txt1 txt2 txt3 txt4
ls: cannot access 'txt4': No such file or directory
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt1
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt2
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt3

리다이렉트를 이용하여 표준출력(1) & 표준에러(2) 구분하여 해당 파일로 이동
[root@localhost WORK]# ls -al txt1 txt2 txt3 txt4 1> ok 2> ng
[root@localhost WORK]# cat ok
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt1
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt2
-rw-r--r-- 1 root root 0 Feb 27 21:55 txt3
[root@localhost WORK]# cat ng
ls: cannot access 'txt4': No such file or directory

시스템정보를 확인하고 이메일로 보내기
(필요한 결과를 명확하게 하기)

vi  res

df -h
pstree
free -m
uptime

vi systeminfo.sh

#!/bin/bash
# report 파일 생성
touch report
# report파일 초기화
cp -f /dev/null report

df -h >> report
pstree >> report
free -m >> report
uptime >> report

# 위에 결과를 이메일로 보냄
# 이메일 보내는 커맨드
# cat report | mail -s "[report] cent1 system info" 이메일주소

↓↓↓↓↓

#!/bin/bash
# report 파일 생성
touch report
# report파일 초기화
cp -f /dev/null report
{
echo " ==== df ==== "
df -h
echo
echo " ==== pstree ==== "
pstree
echo
echo " ==== free ==== "
free -m
echo
echo " ==== uptime ==== "
uptime
echo
} >> report

# 위에 결과를 이메일로 보냄
# 이메일 보내는 커맨드
# cat report | mail -s "[report] cent1 system info" 이메일주소

[root@localhost WORK]# ./systeminfo.sh
[root@localhost WORK]# ls -al report
-rw-r--r-- 1 root root 462 Feb 27 22:09 report

리다이렉트를 사용하면 화면에 결과가 안나오고 파일로 들어감
화면에도 출력하고 파일에도 동시에 쓰기 위해 tee 명령어 사용한다.
tee (= >)
tee -a (= >>)

{
echo " ==== df ==== "
df -h
echo
echo " ==== pstree ==== "
pstree
echo
echo " ==== free ==== "
free -m
echo
echo " ==== uptime ==== "
uptime
echo
} | tee -a report

'클라우드 > BashShell' 카테고리의 다른 글

메뉴 구성  (0) 2023.02.28
대화식 쉘 스크립트  (0) 2023.02.28
간단 쉘 스크립트 function  (0) 2023.02.27
간단 쉘 스크립트 반복문  (0) 2023.02.27
간단 쉘 스크립스 조건문 case  (0) 2023.02.27

함수
function 함수면 {
명령어
}
함수이름 () {
> 명령어
> }

!/bin/bash

echo " =================================== "
echo "df 결과입니다."
echo " =================================== "
df -h

echo " =================================== "
echo "free 결과입니다."
echo " =================================== "
free -m
echo " =================================== "

↓↓↓↓↓


#!/bin/bash

function line {
        echo " ================================= "
}

line
echo "df"
line
df -h
line
echo "free"
line
free -m
line

여러 함수를 하나의 파일로 만들기
function plus {
        echo "$1 + $2 = "
        echo $[ $1 + $2 ] <--  [ ] 로 묶어주면 숫자 연산가능
        echo
}

function minus {
        echo "$1 - $2 = "
        echo $[ $1 - $2 ]
        echo
}

function multi {
        echo "$1 * $2 = "
        echo $[ $1 * $2 ]
        echo
}

function div {
        echo "$1 / $2 = "
        if [ $2 -eq 0 ]
        then
               echo "0으로는 나눌 수 없습니다."
        else
        echo $[ $1 / $2 ]
        fi
        echo
}

만들어 놓은 함수를 쉘스크립트에서 가져다 쓰기
#!/bin/bash

source ./calc  <-- source라는 명령어로 함수를 불러온다.
plus 30 40
minus 10 3
multi 111 7
div 2 0
div 14 2


'클라우드 > BashShell' 카테고리의 다른 글

대화식 쉘 스크립트  (0) 2023.02.28
간단 쉘 스크립트 array, redirect  (0) 2023.02.27
간단 쉘 스크립트 반복문  (0) 2023.02.27
간단 쉘 스크립스 조건문 case  (0) 2023.02.27
간단 쉘 스크립트 조건문 if  (0) 2023.02.27

반목문
for 변수 in 변수에 넣을 데이터
do
데이터가 끝날 때까지 반복해서 실행할 명령어
done

while 조건문
do
조건이 참인 동안 반복해서 실행할 명령어
done


#!/bin/bash

for SVR in cent1 cent2 cent3
do
        echo "cent[1-3]를 넣어준 반복"
        echo "[${SVR}]에 접속합니다..." 
        ssh ${SVR} "uptime"
        echo
done

for NUM in $(seq 1 3)
do
        echo "seq를 사용한 반복"
        echo "[cent${NUM}]에 접속합니다..."
        ssh cent${NUM} "uptime"
        echo
done

for SVR in $(cat serverlist)
do
        echo "파일을 읽어서 반복"
        echo "[${SVR}]에 접속합니다..." 
        ssh ${SVR} "uptime"
        echo
done

#!/bin/bash

숫자비교문 사용
NUM=1

while [ "${NUM}" -le 3 ]

do
        echo "cent${NUM}"
        ssh cent${NUM} "uptime"
        NUM=$(( ${NUM} +1 ))

done

파일비교문 사용
while read SVR
do
        echo ${SVR}

done < serverlist (리다이렉트사용해서 서버리스트를 넣어준다.)

'클라우드 > BashShell' 카테고리의 다른 글

간단 쉘 스크립트 array, redirect  (0) 2023.02.27
간단 쉘 스크립트 function  (0) 2023.02.27
간단 쉘 스크립스 조건문 case  (0) 2023.02.27
간단 쉘 스크립트 조건문 if  (0) 2023.02.27
간단 쉘 스크립트  (0) 2023.02.27

case 변수 in
패턴1)
패턴1이 참일 경우 실행할 명령어;;
패턴2)
패턴2가 참일 경우 실행할 명령어;;
... <-- 패턴이 더 필요한 경우 추가
* )
위에서 지정한 모든 패턴에 해당이 안되는 경우 실행할 명령어;;
esac

#!/bin/bash

## ./nginx_ctl.sh start          : nginx start
## ./nginx_ctl.sh stop           : nginx stop
## ./nginx_ctl.sh start          : nginx reload
## ./nginx_ctl.sh configtest     : nginx.config의 문법을 확인

### ./nginx_ctl.sh a b c
$1 : a , $2 : b , $3 : c
-> 유저가 입력한 파라미터 어떻게 인식하는가? 
-> $,숫자로다가 공백을 기준으로 인식

CMD=$1

case "${CMD}" in

start)
        NGINX 시작하는 명령 ;;
stop)
        NGINX 멈추는 명령 ;;
reload)
        NGINX 리로드하는 명령 ;;
configtest)
        NGINX 설정파일을 확인하는 명령 ;;
* )
        echo "사용방법 : ./nginx_ctl.sh {start|stop|reload|configtest}" ;;
esac


'클라우드 > BashShell' 카테고리의 다른 글

간단 쉘 스크립트 function  (0) 2023.02.27
간단 쉘 스크립트 반복문  (0) 2023.02.27
간단 쉘 스크립트 조건문 if  (0) 2023.02.27
간단 쉘 스크립트  (0) 2023.02.27
CLI 편집기  (0) 2023.02.26

조건문
if [조건문1]; then
조건문1이 참일 경우 실행할 명령어
elif[조건문2]; then <-- 조건이 필요한 경우 추가 가능
조건문1은 거짓이고 조건문2가 참일 경우 실행할 명령어
else
조건문1,2가 모두 거짓일 경우 실행할 명령어
fi

비교표



숫자비교문
-ge (크거나 같은지 비교) 
#!/bin/bash

LOAD=$(로드에버리지숫자를가조오는명령)

if ["${LOAD}" -ge 5]; then
슬랙/텔레그래매/메일로 경고메세지를 날리는 명령

else
         echo "No problem"


파일비교문
-e file  (파일이 존재하는가)
#!/bin/bash

nginx stop할 때의 로직
PID="/run/nginx.pid"

if [ -e "${PID}" ]; then
        kill로 nginx의 pid번호를 읽어서 죽이는 명령
else
        echo "nginx가 실행 중이 아닙니다."

fi 

문자열비교문
A=B (문자A, B가 같은가)

#!/bin/bash

if [ a=a ]; then
       같을때 실행할 명령
else
       다를때 실행할 명령
fi


서버의 호스트네임 실행할 때 cent1이면 웹서버입니다 출력 cent1이 아니면 웹서버가 아닙니다 출력
#!/bin/bash

SVR_NAME=$(hostname)

if [ "${SVR_NAME}" = "cent1" ]; then
        echo "웹서버입니다."

else
        echo"웹서버가 아닙니다."

fi

복합조건문
and&or 사용(&& ||)
[조건1 -a 조건2 -a 조건3]
[조건1 -o 조건2 -o 조건3]
[조건1 -a 조건2 -o 조건3]

[ -e /var/log/messages -a -f /var/log/messages]
[ -e /var/log/messages -o -f /var/log/messages]

'클라우드 > BashShell' 카테고리의 다른 글

간단 쉘 스크립트 반복문  (0) 2023.02.27
간단 쉘 스크립스 조건문 case  (0) 2023.02.27
간단 쉘 스크립트  (0) 2023.02.27
CLI 편집기  (0) 2023.02.26
초간단 쉘스크립트  (0) 2023.02.26

+ Recent posts