[0731] ICT COG 블록체인 테크니컬 트랙

장 창영·2021년 7월 30일
post-thumbnail

출처: https://blog.naver.com/pjt3591oo

1. 리눅스 개념

1-1. 리눅스란

다중 사용자 및 다중 작업을 지원하는 네트워크 운영체제
Ubuntu를 쓸 예정

1-2. 리눅스 구조


커널 모드(HW, 커널): 운영체제의 영역
사용자 모드(셀, 응용프로그램): 사용자의 영역

1-3. 커널

커널?
하드웨어 제어, 프로세스 관리, 메모리 관리, 파일시스템 관리 등을 수행
쉘이 전달한 명령으로 작업 수행, 쉘에 결과 전달

1-4. 쉘

쉘?
사용자가 입력하는 문자열을 해석하여 커널에게 명령전달, 작업요청, 결과반환

1-5. 디렉터리 구조



리눅스는 모든 걸(명령도) 디렉토리로 관리
home: 사용자 홈 디렉토리가 생성되는 곳
usr: 기본 실행파일과 라이브러리 파일, 헤더 파일등의 파일이 저장되어있는 디렉토리
var: 시스템 운영중에 발생한 데이터와 로그가 저장되는 디렉토리
proc: 프로세스 정보 등 커널 관련 정보가 저장되는 디렉토리
etc: 리눅스 설정을 위한 각종 파일들을 가지고 있는 디렉토리

1-6. 권한(permission)

ls -ahl
chmod 권한2진수 파일이름

d는 directory l은 link + 사용자 + 그룹 + 다른 사용자
권한? RWX = Read(읽기), Write(쓰기), Execute(실행)
-> 숫자로 치환(7>0)하여 표현

1-7. 프로세스 관리


PID: 프로세스 고유 ID
PPID: 부모 프로세스의 PID
프로세스 종료 절차? PPID 프로세스 종료 -> 자식 프로세스의 PPID가 사라짐 -> systemd(or init)의 PID(1)로 소유권이 이전 -> systemd(init)가 signup으로 해당 프로세스 없앰


고아 프로세스: 부모 프로세스가 죽어 systemd로 소유권이 이전된 자식 프로세스
좀비 프로세스: 프로세스가 죽었음에도 부모 프로세스가 메모리에서 해제하지 않은 상태의 프로세스

프로세스 실행? fork() & exec()

fork() = 복사, 일반적으로 사용, 명령을 수행한 프로세스가 부모 프로세스가 됨
exec() = 실행, 명령을 수행한 프로세스가 실행하는 프로세스로 대체됨

2. 자주 사용하는 명령어

2-1. 꼭 알아야할 리눅스 기본 명령어 10가지

1. ls - 현재 위치에서 파일 조회
2. cd - 디렉토리 이동
3. touch - 용량이 0인 파일 생성, 날짜 변경
4. mkdir - 디렉토리 생성
5. cp - 파일 복사
6. mv - 파일 이동
7. rm - 파일 제거
8. cat - 파일 내용 출력 및 파일 생성
9. redirection - 출력결과를 파일로 저장
10. alias - 자주 수행하는 명령어를 쉽게 사용할 수 있도록 설정

2-2. ls(list segments)

ls -l : 파일의 상세정보 표시
ls -a : 숨어있는 파일 표시
ls -t : 파일을 최신순으로 표시
ls -rt : 파일을 오래된순으로 표시
ls -F: 파일을 표시할 때 마지막에 유형을 나타내는 파일명을 끝에 표시('/'-디렉토리,'*'-실행파일,'@'-링크)

옵션들은 합성해서 사용가능

2-3. cd (change directory)

cd ~ : 홈디렉토리로 이동
cd .. : 상위 디렉토리로 이동
cd /dir : 절대경로로 이동
cd - : 이동하기 전의 디렉토리로 이동

2-4. touch

touch filename : filename의 파일을 생성
touch -c filename : filename의 시간을 현재시간으로 변경
touch -t 200001011200 filename : filename 의 시간을 날짜정보(YYYYMMDDhhmm) 로 변경
touch -r filename1 filename2 : filename2의 날짜정보를 filename1 의 날짜정보와 같게 변경

2-5. mkdir (make directory)

mkdir dirname : dirname 의 디렉토리를 생성
mkdir -p dirname/subdname : 존재하지 않는 디렉토리의 하위디렉토리까지 생성
mk -m 644 dirname : 특정 퍼미션을 갖는 디렉토리를 생성

2-6. cp (copy)

cp file cfile : file 을 cfile 이라는 이름으로 복사
cp -f file cfile : 복사할 때 복사대상이 있으면 지우고 강제로 복사

2-7. mv (move)

mv fname mfname : fname 의 파일을 mfname 의 이름으로 이동/변경
mv -b fname mfname : mfname 의 파일이 존재하면 mfname 을 백업한 뒤에 이동
mv -f fname mfname : mfname 의 파일이 존재하면 백업 없이 덮어씀

2-8. rm (remove)

rm fname : fname을 삭제
rm -f fname : fname을 묻지 않고 삭제
rm -r dir : dir을 삭제, 디렉토리는 -r 옵션 없이는 삭제할 수 없음

2-9. cat (catenate)

cat fname : fname 의 내용을 출력
cat fname1 fname2 : fname1 과 fname2 의 내용을 이어서 출력
cat fname1 fname2 | more : fname1, fname2 를 출력하는데 페이지별로 출력
cat fname1 fname2 | head : fname1, fname2 를 출력하는데 처음부터 10번째까지만 출력
cat fname1 fname2 | tail : fname1, fname2 를 출력하는데 끝에서부터 10번째까지만 출력

2-10. >, >> (redirection)

명령 > 파일 : 명령의 결과를 파일로 저장
cat fname1 fname2 > fname3 : fname1,fname2 를 출력하고 fname3 이라는 파일에 저장
명령 >> 파일 : 명령의 결과를 파일에 추가합
cat fname4 >> fname3 : fname3 에 fname4 의 내용을 추가
명령 < 파일 : 파일의 데이터를 명령에 입력
cat < fname1 : fname1 의 내용을 출력

2-11. alias

alias new = 'command' : command 를 실행하는 새 명령어 new 를 만듦
alias : 현재 alias 목록을 출력
unalias new : new 라는 alias 를 해제

3. 유용한 명령어

3-1. 유용한 명령어

명령어위치 찾기

whereis [명령어]
whereis ls
whereis rm

which [명령어] $ which ls

현재위치 찾기

pwd

명령창 내용 삭제

clear

3-2. 패키지 매니저

패키지 매니저

apt-get

패키지 설치

apt-get install [패키지 명]

패키지 삭제

apt-get remove [패키지명]

3-3. Net-tools

Net-tools 설치

apt-get install net-tools

오픈포트확인

netstats -ntlp

TCP established = 종단점 o / 세션생성 o
TCP listen = 종단점 x / 세션생성 x

3-4. 파이프라인 & grep

파이프라인(|)

grep linux linux.txt
linux.txt 파일에서 linux 단어가 포함된 행 출력

grep과 | 조합

ls --help | grep sort
ls --help grep | grep file
ls --help 결과에서 sort가 포함된 line 출력
ls --help 결과에서 sort 또는 file가 포함된 line 출력

3-5. I/O Redirection

Output

ls -l > result.txt ls 
-l의 결과를 result.txt 파일에 저장

Error

rm file.txt 2 > error.log

파일이 없어서 에러가 발생할 경우 에러 결과를 error.log에 저장
2는 에러를 의미하는 디스크립터이며, 에러가 발생할 경우만 >를 동작시킴

Input

head < linux.txt

linux.txt 파일 내용을 head의 input 값으로 사용

3-6. 프로세스

시스템에 동작중인 프로세스 출력

ps

cpu가 적음? 네트워크 -> 커널 -> cpu이므로, 네트워크 통신이 거의없다

PID와 PPID 포함하여 출력

ps -ef

|와 grep를 이용하여 특정 프로세스 확인

ps -ef | grep mysql

프로세스 리소스, 프로세스 상태

ps aux

프로세스 별 리소스 사용량 확인

top
종료하고 싶으면 q 입력

프로세스 종료

kill -9 [PID]

9는 프로세스를 종료하라는 signal을 의미
시그널은 프로세스에게 특정 동작을 하라고 신호를 주는 값
여기서 특정 동작을 핸들러라고 하며 시그널 핸들러를 임의로 바꿔줄 수 있음
시그널에 등록된 핸들러는 수정이 가능하며 원하는 형태의 동작을 수행할 수 있음

3-7. 백그라운드

백그라운드로 들어간 프로그램 확인

jobs
특정 프로그램 실행 백그라운드로 집어넣고 싶으면 ctrl + z

백그라운드로 들어간 프로그램 꺼내기

fg [번호]

4. 쉘 스크립트

4-1. 개념

쉘에서 실행할 코드로 .sh 확장자로 텍스트 형식으로 저장
인터프리터 방식으로 동작하며 컴파일되지 않음
문자코드 -(인터프리터 or 컴파일)-> 바이너리코드(0, 1)
인터프리터? 실시간으로 코드를 변경하여 실행 -> 느리지만 용량없음 에러간단 불편 -> 프로그램의 한 라인을 읽어 해석하고 실행하는 과정 반복, 오류 발생 시 해석 or 실행?
컴파일? 미리 코드를 변경하여 .exe 파일을 만들어 실행 -> 빠르지만 용량필요 에러복잡 편리

  • 띄어쓰기 함부로 사용하지마

4-2. 변수

지역변수

test=20
local_test_func () { local test=10
echo $test
}
global_test_func () { test=10
echo $test }
echo "before local used: $test" local_test_func
echo "after local used: $test"
echo
echo "before local not used: $test" global_test_func
echo "after local not used: $test"
local 키워드를 이용하여 지역변수 사용가능

배열

array=(1 2 3 4 5)
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
echo ${array[4]}
echo ${array[@]}
unset array[2]
echo ${array[@]}
unset array
echo ${array[@]}
# 전체출력
# 특정요소 지우기
# 전체출력 #전체지우기
# 전체출력 lines1=(`cat "log.log"`)
echo ${lines1[@]}
lines2=(`tail "log.log"`) echo ${lines2[@]}

환경변수

echo $PWD
echo "PWD: $PWD"
echo $HOME
echo "HOME: $HOME"
echo $PATH
echo "PATH: $PATH"

예약어 및 환경변수 종류

HOME 사용자의 홈 디렉토리
PATH 실행 파일을 찾을 경로
LANG 프로그램 사용시 기본 지원되는 언어 PWD 사용자의 현재 작업중인 디렉토리 FUNCNAME 현재 함수 이름
SECONDS 스크립트가 실행된 초 단위 시간 SHLVL쉘 레벨(중첩된 깊이를 나타냄) SHELL로그인해서 사용하는 쉘
PPID 부모 프로세스의 PID
BASH BASH 실행 파일 경로
BASH_ENV 스크립트 실행시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION 설치된 BASH 버전
BASH_VERSINFO BASH_VERSINFO[0]~BASH_VERSINFO[5]배열로 상세정보 제공 MAIL 메일 보관 경로
MAILCHECK 메일 확인 시간
OSTYPE 운영체제 종류
TERM 로긴 터미널 타입
HOSTNAME 호스트 이름
HOSTTYPE 시스템 하드웨어 종류
MACHTYPE 머신 종류(HOSTTYPE과 같은 정보지만 조금더 상세하게 표시됨)
LOGNAME 로그인 이름
UID 사용자 UID
EUID su 명령에서 사용하는 사용자의 유효 아이디 값(UID와 EUID 값은 다를 수 있음) USER 사용자의 이름
USERNAME 사용자 이름
GROUPS 사용자 그룹(/etc/passwd 값을 출력)
HISTFILE history 파일 경로
HISTFILESIZE history 파일 크기
HISTSIZE history 저장되는 개수
HISTCONTROL 중복되는 명령에 대한 기록 유무
DISPLAY X 디스플레이 이름
IFS 입력 필드 구분자(기본값: - 빈칸)
VISUAL VISUAL 편집기 이름
EDITOR 기본 편집기 이름
COLUMNS 현재 터미널이나 윈도우 터미널의 컬럼 수
LINES터미널의 라인 수
LS_COLORS ls 명령의 색상 관련 옵션
PS1 기본 프롬프트 변수(기본값: bash\$)
PS2 보조 프롬프트 변수(기본값: >), 명령을 "\"를 사용하여 명령 행을 연장시 사용됨 PS3 쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?)
PS4 쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +)
TMOUT0이면 제한이 없으며 time시간 지정시 지정한 시간 이후 로그아웃

파라미터 위치변수

$0 실행된 스크립트 이름
$1 $1 $2 $3...${10}인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함 $* 전체인자값
$@ 전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴)
$# 매개변수의총개수

특수변수

$$ 현재 스크립트의 PID
$? 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태 $! 최근에 실행한 백그라운드(비동기) 명령의 PID
$- 현재 옵션 플래그
$_ 지난 명령의 마지막 인자로 설정된 특수 변수

4-3. 조건문

값 존재유무

str="hello"
if [[ -z "$str" ]]; then # -z 값이 비었는지 검사( 값이 비었다면 true, 아니면 false) echo "empty"
elif [[ -n "$str" ]]; then # -n 값이 있는지 검사( 값이 있다면 true, 아니면 false) echo "not empty"
fi

파일 존재유무

file1="file.txt" file2="test.txt"
if [[ -e $file1 ]]; then # -e 파일이 존재유무 검사( 파일이 존재하면 true, 아니면 false) echo "$file1 exists"
fi
if [[ -e $file2 ]]; then # -e 파일이 존재유무 검사( 파일이 존재하면 true, 아니면 false) echo "$file2 exists”
fi

비교연산

a=1 b=2
if (( $a < $b )); then
echo "$a is smaller than $b"
fi
if [[ $a -lt $b ]]; then
echo "$a is smaller than $b" fi
if (( $a > $b )); then
echo "$b is smaller than $a"
fi
if [[ $a -gt $b ]]; then
echo "$b is smaller than $a" fi
<, >의 형태와 -lt, -gt의 형태로 작성 가능.
단, <, >을 쓸 땐 (())을 사용 -lt, -gt 옵션 형태로 사용할 땐 [[]] 사용 ((또는 [[다음에 꼭 띄어쓰기가 와야 함

비교연산자

[[ -z STRING ]]Empty string
[[ -n STRING ]]Not empty string
[[ STRING == STRING ]] Equal
[[ STRING != STRING ]] Not Equal
[[ NUM -eq NUM ]]
[[ NUM -ne NUM ]]
[[ NUM -lt NUM ]]
[[ NUM -le NUM ]]
[[ NUM -gt NUM ]]
[[ NUM -ge NUM ]]
[[ STRING =~ STRING ]] Regexp
[[ -o noclobber ]] If OPTIONNAME is enabled [[ ! EXPR ]] Not
[[X]]&&[[Y]] And [[X]]||[[Y]] Or
(( NUM < NUM ))Numeric conditions

파일연산자

[[-eFILE]] Exists [[-rFILE]] Readable [[-hFILE]] Symlink [[-dFILE]] Directory [[-wFILE]] Writable [[-sFILE]] Sizeis>0bytes [[-fFILE]] File [[-xFILE]] Executable
[[ FILE1 -nt FILE2 ]] [[ FILE1 -ot FILE2 ]] [[ FILE1 -ef FILE2 ]]
1 is more recent than 2
2 is more recent than 1
Same files

4-4. 반복문

파일 리스트 읽기

for i in ./test/*; do echo $i
done

쉘 스크립트는 디렉터리를 반복자에 전달하면 해당 디렉터리에 존재하는 파일, 디렉터리를 요소로 가짐

파일 읽기

cat ./test/1.txt | while read line; do echo $line
done
cat은 파일 내용을 가져오는 명령어 |(파이프)는 결과를 보내는 역할 수행

범위 반복문

for i in {1..5}; do echo "Welcome $i"
done

범위 반복문 - 변수사용

start=0 end=10
for i in {$start...$end}; do echo "$i"
done

4-5. 함수

함수정의

test1() {
echo "welcome $1 ~"
}
function test2() { echo "welcome $1 ~"
}
test1 "pjt" test2 "pjt"

function 키워드는 필수아님

함수저장

myfunc() {
local myresult='some value' echo $myresult
} result="$(myfunc)"
echo $result
echo $result

전달인자

function test() {
echo "welcome $1 $2~" echo "$*"
echo "$@"
echo "$#"
}
test "pjt" "mung1" "27"

$숫자 함수 호출시 전달 인자를 순서대로 가져오는 역할을 한다. 이 경우 $0은 해당 파일 이름이 된다. $*는 $1부터 마지막 전달 인자를 모두 가져오는 역할을 한다.
$@는 $*과 동일하다.
$#은 전달 인자의 갯수를 의미
함수 전달시 전달하는 값들은 반드시 띄어쓰기로 구분!!!

4-6. 디버그

# set -n
set-x #명령어 실행 후 해당 명령어 출력
set -o nounset # 미선언 변수 발견시 “unbound variable” 메시지 출력 echo "hello"
echo "world" echo $a
쉘 스크립트는 변수 선언없이 사용이 가능하기 때문에 변수가 존재하지 않을 때 에러를 띄우기 위해 set -o nounset 사용

4-7. 시스템 정보

echo '===== kernel name =====' # set -x
uname -s
echo '\n===== sernel release =====' # set -x
uname -r
echo '\n===== network node hostname =====' uname -n
echo '\n===== machine hardware architecture =====' uname -m
echo '\n===== all information of uname command' uname -a

4-8. 리소스 정보

echo “———————-System Information:———————“
/bin/echo -n "Uptime: " && uptime | awk '{print $3}'
echo
/bin/echo -n "CPU Usage: " && top -l 1 | awk '/CPU usage/ {print $3}'
echo
/bin/echo -n "Hard Drive Space Available: " && df -h | grep -E "disk1" | awk '{print $4}'
/bin/echo -n "Hard Drive Usage: " && df -h | grep -E "disk1" | awk '{print $5}'
echo
/bin/echo -n "Memory Used: " && top -l 1 -s 0 | grep PhysMem | awk $'{print $2}'
/bin/echo -n "Memory Free: " && top -l 1 -s 0 | grep PhysMem | awk $'{print $6}'
echo
/bin/echo -n "Internal IP Address: " && ipconfig getifaddr en0
/bin/echo -n "External IP Address: " && curl -s icanhazip.com
/bin/echo -n "Traffic Out: " && top -l 1 -s 0 | grep Networks | awk ' {print $3}' FS=/ | awk '{print $1}' /bin/echo -n "Traffic In: " && top -l 1 -s 0 | grep Networks | awk ' {print $2}' FS=/ | awk '{print $1}'
echo && echo —————————Top Processes:—-————————- && ps -arcwwwxo "command pid %cpu %mem" | head -11 echo

4-9. 색상

NONE='\033[00m' RED='\033[01;31m' GREEN='\033[01;32m' YELLOW='\033[01;33m' PURPLE='\033[01;35m' CYAN='\033[01;36m' WHITE='\033[01;37m' BOLD='\033[1m' UNDERLINE='\033[4m'
echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and $ {UNDERLINE}underlined${NONE}."

4-10. 프로그레스바

####################################
# params
# $1 ticks: 총 틱 갯수 (default 10)
# $2 delay: 한 틱당 소요시간 (default 0.3) ####################################
NONE='\033[00m' RED='\033[01;31m' GREEN='\033[01;32m' YELLOW='\033[01;33m' PURPLE='\033[01;35m' CYAN='\033[01;36m' WHITE='\033[01;37m' BOLD='\033[1m' UNDERLINE='\033[4m'
progress() { local ticks=$1 local delay=$2
local default_ticks=10 local default_delay=0.3
if [[ -z "$ticks" ]]; then ticks=$default_ticks
fi
if [[ -z "$delay" ]]; then delay=$default_delay
fi
for ((i = 1 ; i <= $ticks ; i++)); do
local w=80 p=$i;
printf -v dots "%*s" "$(( $p*$w/$ticks ))" "";
dots=${dots// /.};
printf "${GREEN}\r\e[K|%-*s| %3d(s) / %s(s) %s" "$w" "$dots" "$p" "$ticks" "still working..."; sleep $delay
done ; echo }
progress progress 10 0.1 progress 20 0.4

4-11. 아스키아트

echo -n $'\033[01;33m'
echo "##
echo "##
echo "##
echo "##
echo "##
echo "##
echo "##
echo "##
echo "##
echo "##
echo "######## ###### ## ### :######: :## ##: " echo "######## ###### ## ### :####: ## ## "

4-12. 데이터베이스 덤프

#!/bin/bash echo on
MAX_COUNT=100
for ((i=0;i<=$MAX_COUNT;i++)) do
echo "Running Import "$i
mysql -u root --password=비밀번호 -D 데이터베이스 이름 < sql.sql done

4-13. 이더리움 키스토어 파일 자동생성

function parse(){ lines=(`tail "$1"`) account=${lines[28]:1:40} echo $account
rm $1 }
cnt=10
password_file="./password" result_file="temp_account.log"
for ((i = 0 ; i < cnt ; ++i)); do
geth --datadir $PWD account new < $password_file >> $result_file parse $result_file
done;

4-14. ssh

skeletone

ssh -i 인증서.pem 계정@아이피 << EOF # 접속된 서버에서 실행할 스크립트
cd ~/
mkdir tt
EOF

다수 IP 접속하여 특정스크립트 실행1

IP_LIST=("10.10.10.1" "10.10.10.2" "10.10.10.3" "10.10.10.4" "10.10.10.5")
for VALUE in "${IP_LIST[@]}"; do
ssh -p 22 ubuntu@$VALUE <<EOF # 이 아래의 코드는 접속된 서버에서 실행할 스크립트 sh < /temp.sh
EOF done

다수 IP 접속하여 특정스크립트 실행2

IP_LIST=("10.10.10.1" "10.10.10.2" "10.10.10.3" "10.10.10.4" "10.10.10.5")
for VALUE in "${IP_LIST[@]}"; do
ssh -p 22 ubuntu@$VALUE <<EOF # 이 아래의 코드는 접속된 서버에서 실행할 스크립트 nohup sh < /temp.sh >> '/temp.log' &
EOF done
65

0개의 댓글