Linux 소소한 명령 및 팁 요약
CentOS hostname 변경
# hostname # 확인 # hostname [myhost] # 변경 # vi /etc/sysconfig/network 수정 # 영구 변경 (CentOS 6) # hostnamectl set-hostname [myhost] # 영구 변경 (CentOS 7)
CentOS 주로 설치 하는 패키지
yum install vim yum install net-tools # ifconfig 등 네트워크 command yum install psmisc # pstree yum install gcc yum install rdate yum install iftop # 네트워크 사용량 체크 yum install iptraf-ng # TCP 패킷 및 바이트 카운트 yum install jnettop # 트래픽 모니터링 yum install nmap # 네트워크 탐색도구 / 포트 스캐너
Linux에서 문자셋
$ echo $LANG # 확인 ko_KR.UTF-8 # 유니코드 ko_KR.eucKR # 기본언어
Prompt 변경
# .bash_profile 에 추가 export PS1="\u@\h:\W$ "
.vimrc 주로 이용하는 옵션
set t_ti= t_te= # vim 종료시에 화면을 클리어 하지 않음 syntax on # 문법 표현 colors desert # 칼라 스킵 설정 set et # TAB을 Sapce로 변경 set ts=4 # TAB 사이즈 설정 set sw=4 # 들여쓰기 사이즈 설정
.bashrc 주로 이용하는 설정
alias ls='ls --color=none' # ls 실행시 칼라가 거슬릴때 사용 export LESS=-X # man 등의 화면이 닫히기 않게 처리
SSH 자동 로그인
-
인증키 생성
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/sysop/.ssh/id_rsa): Created directory '/home/sysop/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/sysop/.ssh/id_rsa. Your public key has been saved in /home/sysop/.ssh/id_rsa.pub. The key fingerprint is: SHA256:HoiisAjLzOrBgGrBIg2W0dQYsEOFZIiWZPTOj+fUsLg sysop@sysop The key's randomart image is: +---[RSA 2048]----+ |*XB++ | |*+=o . | |o= . | |+o+ . . | |Booo... S | |&+..+ +. . | |*B o = .. | |o . = | |o. E . | +----[SHA256]-----+
-
인증키 구성
-
SSH Client
# SSH Client .ssh/id_rsa.pub # 공개키 .ssh/id_rsa # 개인키 (유출 조심)
TipSSH Client는 chmod 600 id_rsa
처리 -
SSH Server
.ssh/authorized_keys # Client의 id_rsa.pub와 같아야 함
-
-
접속 명령
$ ssh <id>@<ip> $ ssh -v <id>@<ip> # 접속 과정의 문제 추적시 사용
-
.ssh/config 설정으로 id 및 포트번호 지정
Host <hostname> User <id> Port <port>
Tipconfig 파일은 chmod 600 config
처리 -
SSH 인증 여러개 사용
# ~/.ssh/config 수정 Host github.com User test1 IdentityFile ~/.ssh/github_id_rsa Host gitlab.com User test2 IdentityFile ~/.ssh/gitlab_id_rsa
-
known_hosts 파일에 암호화(fingerprint) 값 저장
-
최초 ssh 접속할 경우 아래와 같은 메시지로 yes/no 를 물음
ECDSA key fingerprint is SHA256:ONPV8pd31CC4bl8R3iKwjzEmXaVUizxBV69MyQ7Zteg. ECDSA key fingerprint is MD5:a7:0f:7f:3d:ec:ec:ec:ed:52:92:c1:16:f1:f2:97:b2. Are you sure you want to continue connecting (yes/no)?
-
ssh-keyscan 을 이용하여 미리 등록
#- 하나만 등록 ssh-keyscan -p <port> -t rsa <hostname> >> ~/.ssh/known_hosts #- 여러개 등록 (호스트 리스트가 들어 있는 파일 만들어서 작업) ssh-keyscan -p <port> -t rsa -f <hostname_list_file> ~/.ssh/known_hosts
-
텍스트 파일 문자셋 변경
-
텍스트 파일 변환 하기 (eucKR → UTF-8 로 변환)
$ iconv -f eucKR -t UTF-8 [파일명] > [변환파일명]
-
파일이 여러개일 경우 아래와 같이 쉘스크립트로 처리
#! /bin/sh for FILENAME in `ls` do F=`echo ${FILENAME} | cut -d'.' -f 1` echo ${F}_UTF-8.log iconv -f eucKR -t UTF-8 ${FILENAME} > ${F}_UTF-8.log done
쉘스크립트에서 파일 유무 체크
-
기본 문법
if [ -f "$FILENAME" ] then echo "파일 있음" else echo "파일 없음" fi
-
주요 옵션
- -b FILE
-
파일이 존재하고 특별한 파일인지 체크
- -c FILE
-
파일이 존재하고 툭수문자가 있는지 체크
- -d FILE
-
파일이 존재하고 그 파일이 디렉토리 인지 체크
- -e FILE
-
파일과 디렉토리를 가리지 않고 존재 하는지 체크
- -f FILE
-
파일이 존재하고 보통 파일인지 체크
- -g FILE
-
파일이 존재하고 group ID로 설정 되었는지 체크
- -L FILE
-
파일이 존재하고 synmbolic link 파일인지 확인
- -r FILE
-
파일이 존재하고 Read 가능한 파일인지 확인
- -s FILE
-
파일이 존재하고 파일 사이즈가 0인지 체크
- -S FILE
-
파일이 존재하고 그 파일이 소켓인지 확인
- -w FILE
-
파일이 존재하고 쓰기 가능한 파일인지 확인
- -x FILE
-
파일이 존재하고 실행 가능한 파일인지 확인
쉘스크립트에서 case 문 활용
#!/bin/bash birth_date=$1 case $birth_date in 921207) echo "저와 생일이 같으시군요!" ;; ??03??|??04??|??05??) echo "봄에 태어나셨군요!" ;; ??06??|??07??|??08??) echo "여름에 태어나셨군요!" ;; ??09??|??10??|??11??) echo "가을에 태어나셨군요!" ;; ??01??|??02??|??12??) echo "겨울에 태어나셨군요!" ;; esac
BASH 쉘에서 파일 한줄씩 읽기
while read <변수명> do echo ${<변수명>} done < <파일명>
rsync
-
기본 사용법
rsync <options> <source> <destination>
-
기본 옵션
-v : verbose -r : recursively 데이터 복사 -a : archive mode (이 모드를 이용하면 심볼릭 링크, 파일 유저/그룹 권한, timestamp 복사) -z : 파일 압축 후 전송
-
추가 옵션
--progress : 진행 정도를 화면에 출력 --checksum : 파일의 checksum을 이용하여 좀더 정교함 (크기/시간 비교 보다 느림) --exclude : 디렉토리 또는 파일을 제외 (예: --exclude='.*' 점(.)으로 시작하는 파일 제외) --delete : destination에만 존재하는 파일 또는 디렉토리를 삭제함 --max-size : 전송할 파일의 최대 크기를 정함 (초과 하는 파일은 전송하지 않음) --bwlimit=KBPS : 사용하는 네트워크 대역폭을 제한함 (서비스중인 시스템에 사용시 유용함) --copy-links : 심볼릭 링크에 대하여 모두 원본 파일을 복사 (디렉토리, 파일 모두 해당) --copy-dirlinks : 심볼릭 링크를 디렉토리를 간주하고 복사 (디렉토리만 해당) --chown=<user>:<group> : 파일을 가져온 후 user와 group 지정 --chmod=D775,F664 : 파일을 가져온 후 디렉토리와 파일의 퍼미션 지정(D775:디렉토리, F664:파일)
-
로컬 복사
rsync -av /usr1/test/ /usr2/test/
Notedestination
의test
디렉토리가 없으면 생성됨Tipsource의 /usr1/test/
와/usr1/test
는 다르게 동작함
/usr1/test/
→/usr2/test
/usr1/test
→/usr2/test/test
-
ssh를 이용한 복사
#- 로컬 서버에서 원격 서버로 복사 rsync -ave ssh /home/sysop/test/ root@sysop-t1:/home/test2/ #- 원격 서버에서 로컬 서버로 복사 rsync -ave ssh root@sysop-t2:/home/test/ /home/sysop/test2/ rsync -ave 'ssh -p 8392' root@10.11.25.80:/mysql . --bwlimit=10240 --progress #- 원격 서버에서 로컬 서버로 복사 (rsh 사용) rsync -av --rsh='ssh -p 11122' sysop2:/home/test/ home/test/
-
rsync 데몬을 통한
원격
→로컬
복사-
rsyncd.conf
[test] path = /home/sysop/test comment = test uid = sysop gid = sysop use chroot = yes read only = yes hosts allow = 192.168.100.0/24 max connections = 3 timeout = 600
-
복사 명령
rsync -av sysop-t1::test/ /home/sysop/test2/
-
-
rsync 데몬을 통한
로컬
→원격
복사-
rsyncd.conf
[test] path = /home/sysop/test2 comment = test uid = sysop gid = sysop use chroot = yes read only = no hosts allow = 192.168.100.0/24 max connections = 3 timeout = 600
-
복사 명령
rsync -av /home/sysop/test2/ sysop-t1::test/
-
cwrsync (윈도우용)
-
설치
-
공식 페이지에서 다운로드 (https://itefix.net/cwrsync)
-
압축 풀기
#- 압축 해제 후 디렉토리 cwRsync_5.5.0_x86_Free #- 최초 실행 cwrsync.cmd
-
-
데몬 실행
-
rsyncd.conf 생성
[D] path = /cygdrive/d comment = D Drive use chroot = false read only = yes hosts allow = 192.168.0.0/24 max connections = 5 lock file = /cygdrive/c/Temp/rsync.lock
-
데몬 모드로 실행
bin\rsync.exe --daemon --config=rsyncd.conf
Note프로세스 종료는 작업 관리자
에서작업 끝내기
로 하면 됨 -
상대쪽 호스트를 hosts 에 넣어줘야 Unknown Hosts 오류가 발생 안함
윈도우즈 hosts 퍄일 위치: C:\Windows\System32\drivers\etc
-
screen
-
screen session 만들기
$ screen -S <sockname>
Tipsession 이 만들어 지면서 연결까지 됨 -
screen session 리스트 확인
$ screen -ls There is a screen on: 32165.test (Attached) 1 Socket in /var/run/screen/S-pyhouse.
Note"<PID>.<sockname>" 형태 -
screen session 끊기 (Detach)
Ctrl
+a
,d
-
screen session 에 다시 연결 (Attach)
screen -r <sockname>
-
screen session 죽이기
$ screen -S <sockname> -X quit
Tip해당 session에 연결된 상태에서는 exit
로 나올 수 있음 -
Session 에서 윈도우 만들기
Ctrl
+a
,c
-
윈도우 간의 전환
Ctrl
+a
,<숫자 0~9>
-
screen session Lock 걸기
Ctrl
+a
,x
-
screen 에서 스크롤 방법
1)
Ctrl
+ a,Esc
2)Page Up
Page Down
으로 스크롤 가능
3)Esc
스코롤 모드 종료
vim 에서 문법 지정
# vi /usr/share/vim/vim74/filetype.vim # 대강 아래의 것 주어 하면 됨 au BufNewFile,BufRead *.asciidoc,*.adoc setf asciidoc
SELinux 끄기
-
파일 수정 후 리부팅
vi /etc/sysconfig/selinux #SELINUX=enforcing # 주석처리 SELINUX=disabled # 추가
-
확인
sestatus SELinux status: disabled
nss-softokn의 의한 Slab 메모리 누수
-
발생 상황
-
libcur + nss_softokn
라이브러리의 조합에서 curl 을 통해서 https 주소를 호출할 때 발생
-
-
원인
-
nss-softokn
라이브러리에서sdb_measureAccess()
함수 호출
-
-
해결
-
환경변수
NSS_SDB_USE_CACHE=yes
설정 하여nss-softokn
라이브러리에서sub_measureAccess()
호출하지 않도록 처리 -
Apache 웹서버의 경우 /etc/init.d/httpd 상단에 넣거나 전역 환경변수에 넣어 주면 될 듯
-
-
Slab 메모리 비우기 (참고사항)
# cat /proc/meminfo | grep Slab Slab: 47320 kB # echo 2 > /proc/sys/vm/drop_caches # cat /proc/meminfo | grep Slab Slab: 33412 kB
-
참조
MySQL yum으로 설치
-
rpm 으로 yum repo 설치
#- 온라인으로 설치 (또는 다운로드 후 rpm 설치) rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm #- 확인 yum search mysql-community
-
설치
#- Client yum install mysql-community-client #- Server yum install mysql-community-server
Apache(httpd) 웹서버 가상호스트에 인코딩(CharSet) 설정
-
설정 파일에서 가상호스트 부분 수정
<VirtualHost *:80> DocumentRoot /home/test ServerName www.test-site.com AddDefaultCharset Off # 이 부분을 넣어야 글러벌 설정이 먹히지 않음 IndexOptions CharSet=UTF-8 # 인코딩 설정 ErrorDocument 404 http://www.test-site.com </VirtualHost>
Linux 에서 VLAN
-
관련 유틸리티 설치
yum install bridge-utils yum install vconfig
-
VLAN(IEEE802.1Q) 모듈 확인 및 올리기
# 확인 modinfo 8021q lsmod | grep 8021q # 올리기 modprobe 8021q
-
VLAN 인터페이스 생성
# 생성 # vconfig add enp0s3 70 Added VLAN with VID == 70 to IF -:enp0s3:- # 확인 # cat /proc/net/vlan/config VLAN Dev name | VLAN ID Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD enp0s3.70 | 70 | enp0s3
Ubuntu 고정 IP 설정
-
설정 파일 수정 후 네트워트 재시작 방법
-
설정 파일 수정
vi /etc/network/interfaces iface eth0 inet static address 192.168.0.120 netmask 255.255.255.0 gateway 192.168.0.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 58.227.193.227 221.143.20.131
-
적용
systemctl restart networking.service
-
-
Netplan 사용는 방법
-
Interface 목록 확인
$ ls /sys/class/net
-
설정 파일 수정
$ sudo vi /etc/netplan/50-cloud-init.yaml network: version: 2 ethernets: eth0: addresses: [192.168.100.79/24] gateway4: 192.168.100.1 nameservers: addresses: [210.94.0.73,168.126.63.1] dhcp4: no match: macaddress: b8:27:eb:87:34:bb set-name: eth0
-
설정 반영 및 확인
$ sudo netplan apply # ip addr # ip route
-
Linux 에서 GPT 파티션 생성 후 포멧 및 마운트
-
파티션 생성 및 확인
#- 명령 진입 # parted /dev/sdb #- 도움말 (parted) help #- GPT 라벨 생성 (레벨타입 : bsd, gpt, loop, mac, mips, msdos, pc98, sun) (parted) mklabel gpt #- 파티션 생성 (파티션타입 : primary, logical, extedned) (parted) mkpart primary 1 1000GB # 0 부터 10000GB 까지 지정 (parted) mkpart primary 1 3TB # 0 부터 3TB 까지 지정 (parted) mkpart primary 3TB 100% # 3TB 부터 전체 지정 (parted) mkpart primary 1 100% # 하나의 파티션에 모든 용량 사용 #- align 체크 (Parted) align optimal 1 1 aligned #- 확인 (parted) print Model: ATA Hitachi HDS72101 (scsi) Disk /dev/sdb: 1000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 1000GB 1000GB primary #- 종료 (parted) quit
-
모든 블록장치의 파티션 레이아웃 확인
# parted -l Model: LSI MR9271-8i (scsi) Disk /dev/sda: 90.0TB Sector size (logical/physical): 512B/4096B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 90.0TB 90.0TB xfs Model: ATA INTEL SSDSC2BW12 (scsi) Disk /dev/sdb: 120GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 525MB 524MB primary ext4 boot 2 525MB 17.7GB 17.2GB primary linux-swap(v1) 3 17.7GB 120GB 102GB primary ext4
-
포멧 후 확인
mkfs.xfs -f /dev/sdb1 parted /dev/sdb (parted) print Model: ATA Hitachi HDS72101 (scsi) Disk /dev/sdb: 1000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 1000GB 1000GB primary xfs
-
마운트
#- UUID 확인 # blkid /dev/sdb1: UUID="8c0a8fb6-0cda-4ca3-ba36-0b2261ead18b" TYPE="xfs" PARTLABEL="primary" PARTUUID="2719c519-e753-4cb7-8b29-df37fa493f22" #- /etc/fstab 에 추가 #- 정상 마운트 되는지 확인 mount -a
Note미리 /etc/fstab이 정상적으로 작동 하는지 *mount -a" 명령으로 마운트 되는 지 확인 필요
/etc/fstab의 오타가 있을 경우 부팅시에 싱글모드로 빠지게 됨
파일 개수가 많을 경우 일괄 삭제
-
ls + rm 활용
ls # 확인 ls | xargs rm -f # 삭제
-
find 명령 이용
find./ -type f -exec ls {} \; # 확인 find./ -type f -exec rm {} \; # 삭제
Note항상 삭제 전에는 ls
로 확인 후rm
실행
scp 활용
-
사용 형식
#- 기본 형싱 scp <option> <surce_host>:<source_dir> <destination_host>:<destination_dir> #- 자주 사용하는 옵션 -P <포트번호> : ssh 포트 지정 -p : 원본 파일의 times, access times, modes 유지 -r : Recursively copy
-
활용
#- 퍼미션과 하위 디렉토리까지 복사 scp -rp ./test test2_server:/usr/local/src #- 서버의 포트와 계정 지정하여 복사 scp -P 2222 * test@192.168.1.10:/home/imsi
디렉토리별 용량 확인 (du)
-
해당 디렉토리 용량 확인
du -hs <directory>
-
현재의 하위 디렉토리 용량 확인
du -hs *
-
용량이 많은 디렉토리로 정렬하여 보기
du -hsx * | sort -rh | head n 5
Notex 옵션은 다른 파일시스템의 디렉토리는 제외함
find 명령 활용
-
기본 명령 구조
find [경로][옵션][작업]
-
경로
/ # 전체 경로 ./ # 상대 경로 ./[디렉토리] # 특정 경로를 줄 수 있음
-
옵션
# 지정한 이름의 파일을 찾음 (와일드 카드 사용시 역슬레시를 함께 사용 하거나, 따옴표로 묶어야 함) -name [파일명] : 지정된 이름의 파일을 찾음 # 지정된 사용자의 파일을 찾음 -user [사용자이름] # 파일의 소유자가 없는 파일을 찾음 -nouser # 지정된 그룹 소유의 파일을 찾음 -group [그룹이름] # 소유자가 아닌 그룹을 찾음 -nogroup [그룹이름] # 파일 퍼미션 조건이 맞는 것만 찾음 -perm [모드] # 파일 타입을 지정하여 찾음 -type [bcdflps] b : 블럭 디바이스 c : 캐릭터 디바이스 d : 디렉토리 f : 일반 파일 l : 심볼릭 링크파일 p : 파이프 s : 소켓 # 지정된 크기의 파일을 찾음 -size [+/-]n[bckw] : 지정된 크기의 파일을 찾음 +n : n보다 큼 -n : n보다 작음 b : 512-byte c : byte k : kilobytes w : 2byte # 특정 inode 번호와 파일을 찾음 -inum [number] # 최근 n일 이전에 액세스된 파일을 찾음 -atime [+n/-n/n] : 최근 n일 이전에 액세스된 파일을 찾음 +n : -n일 또는 그보다 더 오래전 -n : 오늘 부터 n일 전까지 n : n일 전에 액세스 # atime과 비슷한 파일을 변경 시킨 날자를 의미 함 -ctime [+n/-n/n] : atime 과 비슷하나 파일을 변경 시킨 날자를 의미 함 # "파일명" 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾음 -cnewer [파일명] # n개의 링크를 가진 파일을 찾음 -link [n] # 경로를 함게 보여 줌 -depth # 각 옵션 앞에 붙이면 not의 의미를 갖음 ! # 검색된 파일명을 표준 출력 함 -print # 도움말 --help
-
작업
# 찾은 각 파일에 대해 지정된 명령을 실행 -exec [명령어] {} \; # 실행 여부를 사용자에게 확인한 후 명령을 실행 -ok [명령어] {} \;
-
예제
# 홈 디렉토리 아래에 있는 확장자가 "txt" 인 모든 파일을 확인하면서 지움 find $HOME -name '*.txt' -type f -ok rm {} \; # 위와 같으나 묻지 않고 바로 지움 find $HOME -name '*.txt' -type f -exec rm {} \; # 현재 디렉토리 아래에서 "test" 라는 파일을 찾을때 find ./ -name test -print # 루트 디렉토리에서 ".py" 로 끝 나는 파일을 출력 할때 find / -name \*.py -print find / -name '*.py' -print # 현재 디렉토리 아래의 서브디렉토리를 모두 출력 find ./ -type d -print # 현재 디렉토리 아래에서 소문자로 시작 하지 않는 파일을 검색 find ./ ! -name '[a-z]*' -type f -print # 현재 디렉토리 아래에서 확장자가 c나 o 인 파일을 찾으면서 5일 이내에 수정 된 것 출력 find ./ -atime -5 \( -name '*.c' -o -name '*.o' \) -print # 조건을 만족 하지 않을 때 찾기 find ./ ! \( -atime -5 \( -name '*.c' -o -name '*.o' \) \) -print # 파일의 크기가 0인 파일을 찾을 때 find / -size 0 -print # 홈 디렉토리 아래에서 파일의 크기가 1MB 이상인 파일을 찾아서 자세히 보고 싶을 때 find ~ -size +1024k -exec ls -l {} \; # 디렉토리명이 "board" 로 시작하지 않는 디렉토리만 지우기 find ./ -mindepth 1 -maxdepth 1 ! -name 'board*' -type d -exec rm -rf {} \;
NoteUNIX 기종과 버전에 따라 차이가 있을 수 있음으로 man find
로 확인 후 작업
삭제 하는 명령은ls
로 미리 확인하면 실수를 줄일 수 있음
github 연결 필요 도메인
-
api 연동 연결 하려면 아래의 도메인에 대한 IP를 찾아서 방화벽에 등록 필요
github.com api.github.com codeload.github.com
unix timestamp 변경
-
date 명령어를 이용 unix timestamp 값 확인
$ date -d "2019-10-01" +%s 1569855600 $ date -d "now" +%s 1570003725 $ date +%s 1570003780
-
unix timestamp 값으로 날자 추출
$ date -d @1570003725 2019. 10. 02. (수) 17:08:45 KST
sshd 기본 포트 변경 절차 (CentOS7 기준)
-
리눅스의 방화벽 조정
#- 포트 추가 firewall-cmd --permanent --zone=public --add-port=2222/tcp #- 적용 firewall-cmd --reload #- 확인 firewall-cmd --list-all
-
sshd 설정 변경
#- 설정 파일 에디팅 vi /etc/ssh/sshd_config #- 설정 수정 Port 2222 #- 적용 systemctl restart sshd
Caution원격으로 작업시 기존 포트(22)로 접속된 세션을 끊지말고 새로운 포트 접속 테스트 하여
설정을 잘못 하였을 경우 대비해야 함
tcpdump 사용법
-
기본 옵션들
# tcpdump [ -AdDefIKlLnNOpqRStuUvxX ][ -B buffer_size ][ -c count ][ -C file_size ][ -G rotate_seconds ][ -F file ][ -i interface ][ -m module ][ -M secret ][ -r file ][ -s snaplen ][ -T type ][ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ][ -z postrotate-command ][ -Z user ]
-
각종 예제
# tcpdump -i eth0 => 인터페이스 eth0 을 보여줌 # tcpdump -w tcpdump.log => 결과를 파일로 저장, txt 가 아닌 bin 형식으로 저장됨 # tcpdump -r tcpdump.log => 저장한 파일을 읽음 # tcpdump -i eth0 -c 10 => 카운터 10개만 보여줌 # tcpdump -i eth0 tcp port 80 => tcp 80 포트로 통신하는 패킷 보여줌 # tcpdump -i eth0 tcp port 80 => tcp 80 포트로 통신하는 패킷 보여줌 # tcpdump -i eth0 src 192.168.0.1 => source ip 가 이것인 패킷 보여줌 # tcpdump -i eth0 dst 192.168.0.1 => dest ip 가 이것인 패킷 보여줌
-
and 옵션으로 여러가지 조건의 조합 가능
# tcpdump -i eth0 src 192.168.0.1 and tcp port 80 => source ip 가 이것이면서 tcp port 80 인 패킷 보여줌 # tcpdump -i eth0 dst 192.168.0.1 => dest ip 가 이것인 패킷 보여줌 # tcpdump host 192.168.0.1 => host 를 지정하면, 이 ip 로 들어오거가 나가는 양방향 패킷 모두 보여줌 # tcpdump src 192.168.0.1 => host 중에서 src 가 이것인것 만 지정 # tcpdump dst 192.168.0.1 => host 중에서 dst 가 이것인것 만 지정 # tcpdump net 192.168.0.1/24 => CIDR 포맷으로 지정할 수 있다. # tcpdump tcp => TCP 인것만 # tcpdump udp => UDP 인것만 # tcpdump port 3389 => 포트 양뱡향으로 이것인 것. # tcpdump src port 3389 => src 포트가 이것인 것. # tcpdump dst port 3389 => dst 포트가 이것인 것.
-
combine : and ( && ) , or ( || ) , not ( ! ) 으로 여러가지를 조합해서 사용 가능
# tcpdump udp and src port 53 => UDP 이고 src 포트가 53 인 것 # tcpdump src x.x.x.x and not dst port 22 => src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것
-
grouping : ( )
# tcpdump 'src x.x.x.x and ( dst port 3389 or 22 )' => src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것 ==> 여기서는 ' ' 가 반드시 있어야 한다.
iptables 임시 룰 넣고 빼기
-
룰 넣기
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 3306 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -j DROP
-
확인
iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:mysql 2 DROP tcp -- anywhere anywhere tcp dpt:mysql
-
룰 제거
iptables -D INPUT 2 iptables -D INPUT 1
Linux Root 직접 로그인 권한 관리
-
/etc/ssh/sshd_config 수정
PermitRootLogin no #root 직접 로그인 금지 PermitRootLogin yes #root 직접 로그인 허용
-
sshd 재시작
service sshd restart #CentOS6 systemctl restart sshd #CentOS7
인터페이스 개별 라우팅 처리
-
기본 구성
-
IP
DEV: eth0 IP: 222.222.222.100 /24 GW: 222.222.222.1 DEV: eth1 IP: 192.168.0.101 /24 GW: 192.168.0.1
-
라우팅 및 IP 확인
# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth1 222.222.222.0 * 255.255.255.0 U 0 0 0 eth0 link-local * 255.255.0.0 U 1002 0 0 eth0 link-local * 255.255.0.0 U 1003 0 0 eth1 default 22.222.222.1 0.0.0.0 UG 0 0 0 eth0 # ifconfig -a eth0 Link encap:Ethernet HWaddr 00:1B:78:A3:3F:BE inet addr:222.222.222.100 Bcast:222.222.222.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:367 errors:0 dropped:0 overruns:0 frame:0 TX packets:211 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:53333 (52.0 KiB) TX bytes:150417 (146.8 KiB) Interrupt:16 eth1 Link encap:Ethernet HWaddr 00:1B:78:A3:3F:BF inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2270 errors:0 dropped:0 overruns:0 frame:0 TX packets:27 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:151511 (147.9 KiB) TX bytes:4721 (4.6 KiB) Interrupt:17
-
-
관련 설정 파일 수정
-
/etc/iproute2/rt_tables 수정
# # reserved values # 아래 붉은색 부분에 web, storage 이름의 테이블을 추가한다. 255 local 254 main 253 default 0 unspec 200 web 201 storage # # local # #1 inr.ruhep
Noteweb, sotrage 추가 -
개별 라우팅을 위한 파일 추가
# vi /etc/sysconfig/network-scripts/route-eth0 222.222.222.0/24 dev eth0 src 222.222.222.100 table web default via 222.222.222.1 dev eth0 table web # vi /etc/sysconfig/network-scripts/route-eth1 192.168.0.0/24 dev eth1 src 192.168.0.101 table storage default via 192.168.0.1 dev eth1 table storage # vi /etc/sysconfig/network-scripts/rule-eth0 from 222.222.222.100 table web to 222.222.222.100 table web # vi /etc/sysconfig/network-scripts/rule-eth1 from 192.168.0.0/24 table storage to 192.168.0.101 table storage
-
-
적용 및 확인
-
적용
# ip route flush cache # service network restart
-
확인
# ip route list 192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.101 222.222.222.0/24 dev eth0 proto kernel scope link src 222.222.222.100 169.254.0.0/16 dev eth0 scope link metric 1002 169.254.0.0/16 dev eth1 scope link metric 1003 default via 222.222.222.1 dev eth0 # ip rule list 0: from all lookup local 32762: from all to 192.168.0.101 lookup storage 32763: from 192.168.0.101/24 lookup storage 32764: from all to 222.222.222.100 lookup web 32765: from 222.222.222.100 lookup web 32766: from all lookup main 32767: from all lookup default
-
테스트
# traceroute -s 192.168.0.101 yahoo.com # traceroute -s 222.222.222.100 yahoo.com
Note위 두개의 결과를 비교하여 잘 적용 되는지 확인함
-
-
Ubuntu의 경우 추가되는 ip 에 대하여 아래 명령어 입력
ip route add default via 115.71.29.1 dev eth0 table 101 ip route add 115.71.29.0/24 dev eth0 src 115.71.29.173 table 101 ip rule add from 115.71.29.0/24 lookup 101 ip rule add to 115.71.29.173 lookup 101
ssh "yes" 입력 안하게 하기
-
/etc/ssh/ssh_config 에 추가
StrictHostKeyChecking no
-
ssh 명령의 옵션으로 사용
ssh -o StrictHostKeyChecking=no
Ubuntu ufw (iptables) 설정
-
기본 명령
#- 방화벽 활성화 sudo ufw enable #- 방화벽 비활성화 sudo ufw disable #- 기본 룰 확인 sudo ufw show raw 방화벽 상태 확인 #- 방화벽 재시작 sudo service ufw restart #- 방화벽 상태 확인 sudo ufw status
-
설정 저장 위치
/etc/ufw/user.rules
-
룰 추가
#- 19.168.50.0/24 에서 접근 허용 sudo ufw allow from 192.168.50.0/24 #- 53 포트 허용 sudo sudo ufw allow 53 #- TCP 53 포트 허용 sudo ufw allow 53/tcp #- UDP 53 포트 허용 sudo ufw allow 53/udp #- 53 포트 거부 sudo ufw deny 53 #- TCP 53 포트 허용 sudo ufw deny 53/tcp #- UDP 53 포트 거부 sudo ufw deny 53/udp #- 53 포트 설정 삭제 sudo ufw delete 53 #- ssh 허용 sudo ufw allow ssh #- ssh 거부 sudo ufw deny ssh #- IP 123.123.123.123 허용 sudo ufw allow from 123.123.123.123 #- IP 123.123.123.123 거부 sudo ufw deny from 123.123.123.123
SSL/TLS 인증서 패스워드 제거
Note
|
nginx 등 패스워드 입력이 안되는 웹서버에서는 패스워드 제거후 사용할 수 있음 |
-
openssl 명령으로 패스워드 제거
openssl rsa -in key.pem.bak -out key.pem
expect
-
기본 명령
- spawn <명령어>
-
명령어 실행
- expect "<특정문자열>"
-
if 특정 문자열이 나타나면 정도의 의미
- send "<보낼문자열>\r"
-
문자열을 전송한다. \r은 엔터키를 의미
- interact
-
expect를 끝내고 사용자에게 제어권을 넘김
- set 변수 [lindex $argv 0]
-
0번째 명령행 인자를 변수에 지정
- send “$변수”
-
변수에 저장된 문자열을 전송
- expect eof
-
expect 종료
-
구문 옵션
- -nocase
-
대소문자 구별안함
-
ssh login 샘플
#! /usr/bin/expect set timeout 20 set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] spawn ssh "$user\@$ip" expect "Password:" send "$password\r"; interact
-
쉘스크립트에서 호출
#! /usr/bin/bash # 원하는 bash script 작업 SOME_ENV_VAR1="값" SOME_ENV_VAR2="값2" expect <<EOF # expect script 작성 # "$SOME_ENV_VAR1", "$SOME_ENV_VAR2" 형태로 shell script의 변수 사용가능 expect eof EOF # 이제 다시 원하는 셸 스크립트 작업
flock (스크립트 잠금)
Note
|
crontab에 등록한 스크립트가 일정 시간안에 종료되지 않을 경우 중복 실행 방지에 주로 사용 |
-
crontab에 적용 예
* * * * * /usr/bin/flock -n /tmp/check.lock /bin/bash /root/test/check.sh
-
주요 사용 옵션
- -n, --nb, --nonblock
-
실행 중인 스크립트가 존재 하면 바로 종료
- -w, --wait, --timeout <seconds>
-
지정한 시간 대기 후 실행 중인 스크립트가 존재하면 종료, 실행 중인 스크립트가 없으면 실행
- -s, --shared
-
두개의 스크립트에서 락파일을 공유
- -x, --exclusiv
-
앞의 -s 옵션으로 실행한 스크립트가 존재하면 대기 후 실행
표준 에러를 표준 출력으로
-
표준 파일 디스크립터
0 : 표준입력 1 : 표준출력 2 : 표준에러
-
표준 출력을 파일에 담기
test.sh > test.log test.sh 1> test.log
-
표준 에러를 파일에 담기
test.sh 2> test.log
-
표준 에러를 표준 출력으로 리다이렉트
test.sh > test.log 2>&1
Notecron 등에서 에러의 주요원인을 찾고자 할경우에 사용하면 좋음 -
표준 출력을 표준 에러로 리다이렉트
test.sh > test.log 1>&2
쉘 명령 실행 후 리턴 코드
-
리턴 코드 확인 테스트
$ ls "test" ls: cannot access test: 그런 파일이나 디렉터리가 없습니다 $ echo $? 2
Note0이 리턴 되면 정상이고 0이 아니면 오류로 간주
자동 로그 아웃 설정
-
환경 변수에 아래를 넣으면 됨
export TMOUT=300
Note단위는 초
/etc/profile 또는 ~/.bash_profile 에 넣어 주면 됨
RAID로 구성되었던 HDD 장치 파티션이 지워지지 않을 때
-
fidk 에서 확인 후 삭제
-
쉘에서 처리
dmsetup remove <장치경로>
-
계속 존재하면 서버 리부팅
chronyd (타임 동기화 데몬)
Caution
|
chronyd 와 ntpd 가 동시에 구동 되지 않도록 해야함. |
-
설치 및 실행
#- 설치 yum install chrony #- 실행 systemctl enable chronyd systemctl start chronyd
-
시간 동기화 필요성
-
chronyd는 NTP 서버와 시간차가 있을 경우 시계의 속도를 서서히 올리거나 내려서 맞춤
즉, 사라지는 시간을 없게 하여 DB등 시간 정보에 민감한 어플리케이션에 영향이 없도록 함
-
-
chrony의 특장점
-
설정 및 모니터링이 간단하고 편리함
-
대부분의 Linux 에서 기본 지원
-
최초의 시간차가 많이 발생하여도 step 처리 및 수동 동기화 제공
-
네트워크 상태가 좋지 않은 환경에서도 시간 동기화가 잘 되도록 설계됨
-
네트워크 문제 발생시 마지막으로 계산된 drift 파일을 참고하여 시간 교정
-
-
국내 타임서버 풀 확인 (www.ntppool.org/zone/kr)
server 3.kr.pool.ntp.org server 0.asia.pool.ntp.org server 3.asia.pool.ntp.org
-
설정 파일 (/etc/crony.conf)
server 192.168.50.6 # ntp 타임서버 지정 (확인된 타임서버 지정) server 0.centos.pool.ntp.org iburst # iburst 는 동기화 주기를 짧게 하여 빠른 동기화 처리 makestep 1.0 3 # 최초 3회 업데이트시에 1초 이상의 offset 발생시 step 허용 driftfile /var/lib/chrony/drift # 시스템 클럭의 오차를 저장하는 파일 지정 rtcsync # Kernel 시간으로 RTC 업데이트 allow 192.168.50.0/24 # 내부 서버에서 ntp로 접속 허용
-
모니터링
-
timedatectl 활용
# timedatectl status Local time: 금 2020-04-03 14:16:33 KST Universal time: 금 2020-04-03 05:16:33 UTC RTC time: 금 2020-04-03 05:16:33 Time zone: Asia/Seoul (KST, +0900) NTP enabled: yes NTP synchronized: no RTC in local TZ: no DST active: n/a # NTP synchronized: no --> yes 로 변경 timedatectl set-ntp
-
chronyc 활용
# chronyc tracking Reference ID : 6AF7F86A (106.247.248.106) # 시간 동기화를 위한 원격지 IP 또는 도메인 Stratum : 3 # 원격 NTP서버 까지 hop 카운트 (로컬 머신 포함) Ref time (UTC) : Fri Apr 03 07:45:02 2020 # 마지막으로 동기화된 UTC 시간 System time : 0.000019704 seconds slow of NTP time # NTP 서버와의 시간차 Last offset : +0.000066970 seconds # 마지막으로 상쇄한 시간 RMS offset : 0.000057205 seconds # 평균 offset 값 Frequency : 9.155 ppm slow # 시스템 시계가 잘못되는 비율 Residual freq : +0.003 ppm # 기준 소스와 주파수 차이 Skew : 0.040 ppm # 주파수에 대한 추정 오차 Root delay : 0.005193877 seconds # 네트워크의 경로지연 Root dispersion : 0.015543302 seconds Update interval : 1028.3 seconds # 마지막으로 업데이트한 두 클럭의 간격 Leap status : Normal # PPM (parts per million): 1PPM = 0.000001초 # chronyc sources 210 Number of sources = 4 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^- dadns.cdnetworks.co.kr 2 9 177 499 -448us[ -448us] +/- 54ms ^+ send.mx.cdnetworks.com 2 10 377 217 -523us[ -523us] +/- 75ms ^* 106.247.248.106 2 10 377 556 -214us[ -147us] +/- 46ms ^+ ec2-54-180-134-81.ap-nor> 2 10 377 512 -130us[ -130us] +/- 41ms # M (소스의 종류) ^: 서버 =: 피어 #: 로컬 # S (소스의 상태) *: 현재사용 +: 사용 중인 서버와 결합 -: 사용 중인 서버와 결합 하지 않음 ?: 연결 불능 x: 연결 불가
-
-
즉시 동기화 방법
chronyc -a makestep
FD (File Descriptor) 파일 오픈 개수 설정
-
시스템 전체 파일 오픈 개수 확인
# cat /proc/sys/fs/file-nr 1344 0 1607926 # sysctl -a | grep fs.file- fs.file-max = 1607926 fs.file-nr = 1312 0 1607926
-
시스템 커널 파라 미터 수정하여 변경
#- 바로 적용 sysctm -w fs.file-max = 2048000 #- 확인 # vi /etc/sysctl.conf fs.file-max = 2048000 #- 적용 # sysctl -p
-
계정별 파일 오픈 개수 확인
# ulimit -a # 모든 제한 사항 확인 (soft) # ulimit -aH # 모든 제한 사항 확인 (hard) # ulimit -n
Note이 값은 최대 값은 fs.nr_open
값에 의존 -
계정별 파일 오픈 개수 변경
#- 현재 로그인 계정에 대하여 변경 ulimit -n 2048 # 영구적 변경 # vi /etc/security/limits.conf <username> soft nofile 2048 <username> hard nofile 2048
-
열린 파일 개수 확인
lsof -u <UID> | wc -l
-
ulimit 사용 (프로세스의 자원 리미트 확인 및 설정 명령)
soft: 새로은 프로세스를 생성하면 할당되는 한도 hard: soft 한도에서 최대로 늘릴 수 있는 한도 #- 주요 옵션 -a : 모든 리미트 확인 -aH : 모든 하드 리미트 확인 -n : 최대 오픈 파일 -u : 해당 유저의 최대 프로세스 수
ethtool 을 이용하여 speed / duples / autoneg 설정
-
NIC 확인
# ifconfig -a enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.71 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::a00:27ff:fe10:c375 prefixlen 64 scopeid 0x20<link> ether 08:00:27:10:c3:75 txqueuelen 1000 (Ethernet) RX packets 138 bytes 14740 (14.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 84 bytes 11060 (10.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
-
ethtool 명령으로 현재 설정 상태 확인
# ethtool enp0s3 Settings for enp0s3: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: off (auto) Supports Wake-on: umbg Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes
-
ethtool -s 명령으로 설정 변경
#- 명령 형식 sudo ethtool –s [device_name] speed [10/100/1000] duplex [half/full] autoneg [on/off] #- 설정 예 sudo ethtool –s enp0s3 speed 1000 duplex full autoneg on
-
ETHTOOL_OPT 변수를 사용하여 리부팅 후에도 적용되도록 영구 설정
#- 파일 편집 vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 #- 설정 형식 ETHTOOL_OPTS="speed [100|1000|10000] duplex [half|full] autoneg [on|off]” #- 설정 예 ETHTOOL_OPTS="speed 1000 duplex full autoneg on”
TCP Segmentation Offload (TSO)
-
TCP는 전송시 패킷을 분할(Segmentation)하는데, 이작업을 CPU가 아닌 NIC가 수행 하도록 설정 하는 것인 TSO (기본값 On)
-
10G NIC에서는 이슈가 많이 발생하여 TSO를 OFF 하는 것이 좋음
-
TCP 패킷 유실 및 지연
-
TCP 연결 종료
-
Load Average 비정상적인 증가
-
-
설정 확인 및 변경
#- 설정 확인 # ethtool -k <NIC Name> # ethtool -k eth0 # ex tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp6-segmentation: on tx-tcp-mangleid-segmentation: off #- 설정 변경 # ethtool -K <NIC Name> tso off # ethtool -K eth0 tso off gso off gro off # ex #- 리부팅시에도 적용 처리 (/etc/sysconfig/network-script/ifcfg-enp0s3 에 아래 라인 추가) ETHTOOL_OPTS="--offload enp0s3 tso off gso off gro off"
Note변경 후 CPU 부하는 우려할 수준은 아니라고 함 -
영구 설정 (리부팅 후에 자동 적용)
vi /etc/sysconfig/network-script/ifcfg-enp0s3 ETHTOOL_OPTS="--offload enp0s3 tso off gso off gro off" # 추가
-
참조 사이트
http://sandilands.info/sgordon/segmentation-offloading-with-wireshark-and-ethtool http://www.linuxfoundation.org/collaborate/workgroups/networking/tso http://www.packetinside.com/2013/02/mtu-1500.html https://ston.readthedocs.io/ko/latest/admin/adv_topics.html
CentOS7 에서 rc.local 동작하게 하기
-
rc.local 파일에 실행 권한 할당
chmod +x /etc/rc.d/rc.local
-
/usr/lib/systemd/system/rc-local.service 파일 수정
[Unit] Description=/etc/rc.d/rc.local Compatibility ConditionFileIsExecutable=/etc/rc.d/rc.local After=multi-user.target # 변경전 After=network.target [Service] Type=forking ExecStart=/etc/rc.d/rc.local start TimeoutSec=0 RemainAfterExit=yes [Install] # 추가 WantedBy=multi-user.target #
-
systemctl reload
systemctl enable rc-local.service systemctl start rc-local.service systemctl daemon-reload
-
실행 하기
systemctl start rc-local
-
재부팅 하면 부팅시에 실행하게 됨
nmap 으로 열린 포트 확인
-
로컬 서버의 열린포트 확인
#-- UDP Scan # nmap 192.168.100.71 -sU Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-04 11:32 KST Nmap scan report for test.test.co.kr (192.168.0.71) Host is up (0.0000080s latency). Not shown: 998 closed ports PORT STATE SERVICE 111/udp open rpcbind 1023/udp open|filtered unknown Nmap done: 1 IP address (1 host up) scanned in 1.25 seconds #-- TCP Scan # nmap 192.168.100.71 -sT Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-04 11:33 KST Nmap scan report for test.test.co.kr (192.168.0.71) Host is up (0.0014s latency). Not shown: 994 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 111/tcp open rpcbind 443/tcp open https 548/tcp open afp 873/tcp open rsync Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
-
IP별 열린 포트 스캔
#- 특정 IP에 대하여 포트스캔 nmap -v -A 192.168.100.71 #- 특정 네트워크에 살아 있는 서버 확인 nmap -v -sn 192.168.0.0/16
nohup, & 사용
-
nohup
-
쉘스크립트파일(.sh)을 데몬 형태로 실행 시키도록 해주는 프로그램
-
터미널 세션이 끊겨도 실행을 멈추지 않음
-
-
&
-
프로세스를 백그라운드로 실행
-
-
실행예시
nohup test.sh &
Note이렇게 실행하면 nohup.out 파일이 생성되고 표준 출력이 담김 -
nohup
,&
차이-
nohup 이 아닐 경우 터미널 세션이 끊어지면 프로세스도 종료 되지만,
요즘은&
만으로도 nohup 과 같이 동작을 함
하지만 명시적으로 실행하는 것이 안전할 것으로 생각됨
-
-
nohup.out 안 남기게 하기
nohup test.sh /dev/null 2>&1 &
Note표준 에러를 표준 출력을 바꿔서 /dev/null
보내게 됨 -
nohup.out 파일을 변경하여 남기기
nohup test.sh /temp/test_nohup.log 2>&1 &
로케일(locale) 설정
-
localectl (CentOS 7 이상 지원)
#- 로케일 확인 # localectl System Locale: LANG=ko_KR.UTF-8 VC Keymap: kr X11 Layout: kr #- 설정 가능한 로케일 확인 # localectl list-locales | grep ko ko_KR ko_KR.euckr ko_KR.utf8 kok_IN kok_IN.utf8 korean korean.euc ru_RU.koi8r ru_UA.koi8u tg_TJ.koi8t uk_UA.koi8u #- 로케일 설정 # localectl set-locales "LANG=ko_KR.UTF-8"
-
locale
#- 설정된 로케일 확인 # locale LANG=ko_KR.UTF-8 LC_CTYPE="ko_KR.UTF-8" LC_NUMERIC="ko_KR.UTF-8" LC_TIME="ko_KR.UTF-8" LC_COLLATE="ko_KR.UTF-8" LC_MONETARY="ko_KR.UTF-8" LC_MESSAGES="ko_KR.UTF-8" LC_PAPER="ko_KR.UTF-8" LC_NAME="ko_KR.UTF-8" LC_ADDRESS="ko_KR.UTF-8" LC_TELEPHONE="ko_KR.UTF-8" LC_MEASUREMENT="ko_KR.UTF-8" LC_IDENTIFICATION="ko_KR.UTF-8" LC_ALL= #- 설정 가능한 로케일 확인 # locale -a | grep ko ko_KR ko_KR.euckr ko_KR.utf8 kok_IN kok_IN.utf8 korean korean.euc ru_RU.koi8r ru_UA.koi8u tg_TJ.koi8t uk_UA.koi8u
-
로케일 설정 파일
#- CentOS7 /etc/locale.conf #- CentOS6 /etc/sysconfig/i18n
쉘스크립트 if 조건문 종류
-
비교식
[ -z ${A} ] : A 문자열의 길이가 0이면 TRUE [ -n ${A} ] : A 문자열의 길이가 0이 아니면 TRUE [ ${A} -eq ${B} ] : A와 B값이 같으면 TRUE [ ${A} -ne ${B} ] : A와 B값이 다르면 TRUE [ ${A} -gt ${B} ] : A가 B보다 크면 TRUE [ ${A} -ge ${B} ] : A가 B보다 크거나 같으면 TRUE [ ${A} -lt ${B} ] : A가 B보다 작으면 TRUE [ ${A} -le ${B} ] : A가 B보다 작거나 같으면 TRUE [ 조건식A -a 조건식B ] : 조건식 A와 B가 모두 TRUE이면 TRUE (&& 와 동일) [ 조건식A -o 조건식B ] : 조건식 A가 TRUE거나 조건식B가 TRUE면 TRUE (|| 와 동일)
-
파일관련
[ -d ${A} ] : A 파일이 디렉토리면 TRUE [ -e ${A} ] : A 파일이(노드, 디렉토리, 소켓 등등 모두) 존재하면 TRUE [ -L ${A} ] : A 파일이 심볼릭 링크면 TRUE [ -r ${A} ] : A 파일이 읽기 가능하면 TRUE [ -s ${A} ] : A 파일의 크기가 0 보다 크면 TRUE [ -w ${A} ] : A 파일이 쓰기 가능하면 TRUE [ -x ${A} ] : A 파일이 실행 가능하면 TRUE [ -c ${A} ] : A 파일이 Special character file 이면 TRUE [ -f ${A} ] : A 파일이 디렉토리가 아닌 일반 regular 파일이면 TRUE [ -S ${A} ] : A 파일이 소켓이면 TRUE [ ${A} -nt ${B} ] : A 파일 B 파일보다 최신파일이면 참 [ ${A} -ot ${B} ] : A 파일이 B 파일보다 이전파일이면 참 [ ${A} -ef ${B} ] : A 파일과 B 파일이 같은 파일이면 참
쉘스크립트 if 조건문에서 대괄호(bracket) 사용
Note
|
if 조건문에서 [ 조건식] [[ 조건식]] 차이
|
-
대괄호 한개
NUM=1 if [ ${NUM} -eq 1 ] then echo "1" fi
-
대괄호 두개
NUM=1 if [ ${NUM} -eq 1 ] then echo "1" fi
-
차이점
-
결과는 동일
-
대괄호 하나는 별도의 프로세스를 실행
-
대골호 두개는 Bash에 내장된 기능 사용
-
반복이 많은 작업의 경우 두개를 사용하면 효율성이 좋다고 함
-
대괄호 두개를 쓰면 대괄호에 의해 가독성을 높여줌
NUM=1 NAME="jun" #- 대괄호 한개 if [ $NUM -eq 1 -a $NAME = "jun" ] then echo "$NUM: $NAME" fi #- 대괄호 두개 if [[ $NUM -eq 1 ]] && [[ $NAME = "jun" ]] then echo "$NUM: $NAME" fi
-
다른 Linux 시스템 SSH 접속시 화면이 멈추는 증상
-
증상 (아래와 같은 메시지 발생하면서 화면이 멈춤)
packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
-
아무런 데이터가 오고가지 않은 휴지 상태가 되었을 때 발생 하는 것으로 보임
-
해결 (서버 또는 클라이언트 둘중 하나만 설정 하면 됨)
-
서버쪽 설정
파일: /etc/ssh/sshd_config ClientAliveInterval 30 ClientAliveCountMax 30
-
클라이언트 설정
파일: /etc/ssh/ssh_config or ~/.ssh/config Host * ServerAliveInterval 30 ServerAliveCountMax 30
-
FTP 로그인가 put 을 다른 서버로 구성 테스트 방법
-
Proftpd 설정
AllowForeignAddress on
-
로그인 할 서버에서 에서 작업
# telnet 192.168.1.1 2002 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. 220 ProFTPD 1.2.10rc1 Server (ProFTPD Default Installation) [test] USER <id> 331 Password required for a0. PASS <password> 230 User a0 logged in. PASV 227 Entering Passive Mode (192,168,1,1,240,63). STOR <filename> 150 Opening ASCII mode data connection for tttt 226 Transfer complete.
Notepython 으로 만든 put 업스트림 실행 완료 후 226 Transfer complete.
메시지 발생 -
put 업스트림할 서버 에서 작업
#! /bin/python import socket sock = socket.socket() sock.connect(("192.168.1.1", 61503)) with open("testfile.txt", "rb") as fd: buf = fd.read(1024) while (buf): sock.send(buf) buf = fd.read(1024) sock.close()
NoteTCP 포트 번호 확인 수정/저장 후 실행
로그 파일의 내용만 지우기
-
cat 으로 NULL을 보냄
/bin/cat /dev/null > <filename>
logrotate
-
파일 및 디렉토리 구성
/sbin/logrotate # 실행 파일 /etc/logrotate.conf # 설정 파일 /etc/logrotate.d # 각 패키지별 설정 파일을 위한 디렉토리 # (logrotate.conf 에서 지정되어 있음 "include /etc/logrotate.d")
-
cron에 적용 여부 확인
# ls -l /etc/cron.daily/logrotate -rwx------. 1 root root 219 10월 31 2018 /etc/cron.daily/logrotate
-
docker 에 적용한 예
# pwd /etc/logrotate.d # cat docker /var/lib/docker/containers/*/*.log { rotate 31 daily notifempty missingok copytruncate dateext }
-
수동으로 실행 테스트
logrotate -fv /etc/logrotate.d/docker
-
옵션들의 의미
rotate <숫자> |
로그 파일의 개수가 <숫자> 이상 되면 삭제 |
maxage <숫자> |
로그 파일이 <숫자>일 이상 되면 삭제 |
daily|weekly|monthly |
로테이트 단위 |
notifempty |
로그 내용이 없으면 로테이트 하지 않음 |
ifempty |
로그 내용이 없어도 로테이트 함 |
missingok |
로그 파일이 없어도 에러처리 하지 않음 |
compress |
로테이트 되는 로그파일을 gzip으로 압축 |
compress|nocompress |
로테이트 되는 로그파일을 압축(gzip) 여부 설정 |
copytruncate |
이전 로그파일을 복사 후 원본 파일의 크기를 0으로 만듬 (일부 로깅 파일의 손실 발생할 수 있음) |
dateext |
로테이트 되는 파일 이름에 날짜가 들어가도록 함 (이 옵션을 주지 않으면 로테이트 파일명에 숫자를 붙여서 구분하게 됨) |
Promiscuous Mode 설정
-
ip 명령으로 설정
ip link set dev enp0s3 promisc on
-
ifconfig 명령으로 설정
#- 설정 ifconfig enp0s3 promisc #- 해제 ifconfig enp0s3 -promisc
SSL(TLS) 엑세스 확인
-
openssl 명령으로 확인
openssl s_client -connect m.naver.com:443 -ssl3 openssl s_client -connect m.naver.com:443 -tls1_1 openssl s_client -connect m.naver.com:443 -tls1_2
snmpwalk 활용
-
사용 형식
snmpwalk -v 2c -c <community> <IP> <MIB>
Ubuntu 버전 확인
-
/etc/issue 확인
$ cat /etc/issue Ubuntu 20.04.1 LTS \n \l
-
lsb_release 명령 활용
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.1 LTS Release: 20.04 Codename: focal
Ubuntu sudo 패스워드 묻지 않도록 처리
-
/etc/sudoers 파일 수정
$ sudo vi /etc/sudoers #- 추가할 내용 (service 에 적용) %sudo ALL=NOPASSWD: /usr/sbin/service
rpmrebuild 이용하여 설치된 패키지를 RPM 파일로 추출
-
설치
yum install rpmrebuild
-
패키지 네임 확인
rpm -qa | grep <package_name>
-
패키지 추출
rpmrebuild <package_name>
-
추출 RPM 파일 저장 위치
/root/rpmbuild/RPMS/x86_64
'리눅스 (Linux)' 카테고리의 다른 글
vim(vi) 즐겨 사용하는 설정 (0) | 2021.03.23 |
---|---|
Netatalk 리눅스에서 AFP 서버 구성 (0) | 2021.03.18 |
CentOS의 firewalld 관리 (0) | 2021.03.14 |