# Network Management with NetStat

 

 - NetStat (네트워크 통계)는 라우팅 테이블, 인터페이스 통계 등을 볼 수 있을 뿐만아니라 수신 및 발신 네트워크 연결을 모니터링하기 위한 CLI 도구이다.

 - 이는 네트워크의 문제 해결과 성능 측정에서 매우 유용하다.

 - NetStat은 가장 기본적인 네트워크 서비스 디버깅 도구 중 하나로, 열려있는 포트와 포트에서 수신 중인 프로그램이 있는지의 여부를 알려준다.

 - NetStat은 리눅스 네트워크 관리자와 시스템 관리자가 네트워크 관련 문제를 모니터링하고 해결하고 네트워크 트래픽 성능을 결정하는 데 매우 중요하고 유용하다.

 

# List all LISTENING Ports of TCP and UDP connections

 - Listing all ports (both TCP and UDP) using netstat -a option.

# netstat -a | more

 

# List TCP Port connections

 - Listing only TCP (Transmission Control Protocol) port connections using netstat -at

# netstat -at

 

# List UDP Port connections

 - Listing only UDP (User Datagram Protocol) port connections using netstat -au

# netstat -au

 

# List all LISTENING Connections

 - Listing all active listening ports connections with netstat -l

# netstat -l

 

# List all TCP Listening Posts

 - Listing all active listening TCP ports by using option netstat -lt

# netstat -lt

 

# List all UDP Listening Posts

 - Listing all active listening UDP ports by using option netstat -lu

# netstat -lu

 

# List all UNIX Listening Ports

 - Listing all active UNIX listening ports using netstat -lx

# netstat -lx

 

# Show Statistics by Protocol

 - Displays statistics by protocol. By default, statistics are shown for the TCP, UDP, ICMP, and IP protocols. The -s parameter can be used to specify a set of protocols.

# netstat -s

 

# Show Statistics by TCP Protocol

 - Showing statistics of only TCP protocol by using option netstat -st

# netstat -st

 

# Show Statistics by UDP Protocol

# netstat -su

 

# Display Service name with PID

 - Displaying service name with their PID number, using option netstat -tp will display “PID/Program Name”.

# netstat -tp

 

# Display Promiscuous Mode

 - Displaying Promiscuous mode with -ac switch, netstat print the selected information or refresh screen every five second. Default screen refresh in every second.

# netstat -ac 5 | grep tcp

 

 

# Display Kernel IP routing

 - Display Kernel IP routing table with netstat and route command.

# netstat -r

 

 

# Show Network Interface Transactions

 - Showing network interface packet transactions including both transferring and receiving packets with MTU size

# netstat -i

 

# Show Kernel Interface Table

 - Showing Kernel interface table, similar to ifconfig command.

# netstat -ie

 

# Display IPv4 and IPv6 Information

 - Displays multicast group membership information for both IPv4 and IPv6.

# netstat -g

 

# Print Netstat Information Continuously

 - To get netstat information every few second, then use the following command, it will print netstat information continuously, say every few seconds.

# netstat -c

 

# Find non supportive Address

 - Finding un-configured address families with some useful information.

# netstat --verbose

 

# Find Listening Programs

 - Find out how many listening programs running on a port.

# netstat -ap | grep http

 

# Display RAW Network Statistics

# netstat --statistics --raw

 

# Display all ports in the LISTEN state

# netstat -an | grep LISTEN

 


 [ Option ]

   --verbose, -v
       Tell the user what is going on by being verbose. Especially print
       some useful information about unconfigured address families.

   --wide, -W
       Do not truncate IP addresses by using output as wide as needed. This
       is optional for now to not break existing scripts.

   --numeric, -n
       Show numerical addresses instead of trying to determine symbolic
       host, port or user names.

   --numeric-hosts
       shows numerical host addresses but does not affect the resolution of
       port or user names.

   --numeric-ports
       shows numerical port numbers but does not affect the resolution of
       host or user names.

   --numeric-users
       shows numerical user IDs but does not affect the resolution of host
       or port names.

   --protocol=family, -A
       Specifies the address families (perhaps better described as low level
       protocols) for which connections are to be shown.  family is a comma
       (',') separated list of address family keywords like inet, inet6,
       unix, ipx, ax25, netrom, econet, ddp, and bluetooth.  This has the
       same effect as using the --inet|-4, --inet6|-6, --unix|-x, --ipx,
       --ax25, --netrom, --ddp, and --bluetooth options.

       The address family inet (Iv4) includes raw, udp, udplite and tcp
       protocol sockets.

       The address family bluetooth (Iv4) includes l2cap and rfcomm protocol
       sockets.

   -c, --continuous
       This will cause netstat to print the selected information every
       second continuously.

   -e, --extend
       Display additional information.  Use this option twice for maximum
       detail.

   -o, --timers
       Include information related to networking timers.

   -p, --program
       Show the PID and name of the program to which each socket belongs.

   -l, --listening
       Show only listening sockets.  (These are omitted by default.)

   -a, --all
       Show both listening and non-listening sockets.  With the --interfaces
       option, show interfaces that are not up

   -F
       Print routing information from the FIB.  (This is the default.)

   -C
       Print routing information from the route cache.

'Basic > shell' 카테고리의 다른 글

[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] rsync  (0) 2019.09.03
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

[shell] -ksh: {파일명.sh}: not found 오류 문제

 

[상황]

 - 윈도우에서 스크립트 작성 후 linux로 옮겨 실행

 

아래와 같이 스크립트 파일 자체를 실행 할 수 없다고 오류 메시지가 출력

-ksh: {파일명.sh}: not found ~~

 

"쉘 스크립트 -ksh not found"로 오류 검색

 

[결론]

 - 윈도우는 텍스트 파일의 끝에서 CR-LF로 줄바꿈을 하고, 유닉스는 LF 문자로 줄바꿈을 한다.

 - 윈도우에서 작성한 쉘 스크립트가 리눅스로 옮겨 실행 시 스크립트 내에 "유닉스 개행문자"와 도스 개행문자"가 섞여 있을 때 문제 발생

 - 모든 문자열 끝에 '^M'이라는 문자는 개행문자가 깨진 흔적

 

[원인 파악 방법]

 

# 오류를 발생하는 파일을 vi 파라미터 -b를 추가하여 실행

vi -b {파일명}.sh

 - 오류가 발생했던 파일을 "vi -b {파일명}.sh"으로 실행하여 확인
(아래와 비슷한 문자열을 확인)

#!/bin/sh^M

function () {^M
    command^M
}^M

 

[원인]

 - 쉘 스크립트 파일 형식이 DOS 형식으로 인하여 CR(carriage return)이 달라서 생기는 경우로 파악

 

[해결책]

 1. vi 에디터에서 DOS 파일 타입을  Unix 파일 타입으로 세팅

# Unix Text로 변환

:set ff=unix

 2. vi에서 각 행의 끝에 있는 ^M 문자를, 모두 공백으로 바꾸기

# 각 행의 끝($)에 있는 ^M문자를 모두(g) 공백(//)으로 변환(%s)

:%s/^M$//g
# ^M쓰는 법

ctrl + v 키 > '^' ctrl + m > 'M'

 

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] rsync  (0) 2019.09.03
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

[Shell] rsync 사용법

- Rsync는 원격에 있는 파일디렉토리복사하고 동기화 하기 위해서 사용하는 툴

 

Rsync의 기능
 - 원격 시스템으로부터 파일을 효율적으로 복사하거나 동기화 가능
 - Linux, device, 파일의 소유자와 그룹 권한(Permissions)등 파일의 부가정보도 복사 가능
 - scp보다 빠름, rsync는 remote-update 프로토콜을 이용해서 차이가 있는 파일만 복사
(처음에는 모든 파일과 디렉토리를 복사 그 후부터는 차이가 있는 파일만 복사하기 때문에 더 빠르고 효율적)
 - 데이터를 압축해서 송/수신하기 때문에 더 적은 대역폭을 사용

 

Rsync의 동기화 알고리즘
1. 파일 전송 결정
    1) 파일의 크기와 수정시간(modification)을 비교하는 것으로 파일을 전송 할지 말지를 결정
(일반적으로 파일의 내용을 변경하면 크기와 수정시간이 변하지만 항상 그렇다고 단정할 수는 없다는 예외가 있다.)

    2) "--checksum" 의 옵션을 통해 비교 방법을 개선
(크기 / 시간을 이용한 비교 방법보다 안전하지만 더 느리고 더 많은 자원을 사용)

2. 전송할 파일 부분의 결정
    1) 파일을 고정 크기를 가지는 청크(chunk)로 나누어 checksum을 계산

    2) checksum을 서로 계산하여, 다를 경우 해당 부분의 청크만을 복사
(만일 파일의 앞 부분의 정보가 수정되어 정보가 밀릴 경우, 모든 chunk의 checksum이 어긋남)

    3) Rolling hash를 통해 위의 문제를 해결

 

Rsync의 사용법
# rsync [-v] [-q] [-a] [-r] [-b] [-u] [-l] [-p] [-o] [-g] [-D] [-t] [-n] [-e=Command] [–del|–delete] [-z] [–exclude] [–stats] [–progress] Source [[USER@]HOST:]DIST

 

Rsync의 주요 옵션

옵션

설명

-v

verbosity를 높이는 옵션으로 복사하는 과정을 더 자세하게 보여줌

-z

compress를 주는 옵션으로 파일을 복사할 때 압축해서 복사

-h

사람이 읽기 쉬운 형태로 복사 결과물들을 출력

-a 

(same as -riptgoD)

archive 모드로 -riptgoD 옵션을 적용한 것과 같음 (symlink, 권한, timestamp와 같은 속성을 그대로 복사)

-r

디렉토리를 복사 할 때 사용하는 옵션

-l

symlink는 symlink 형태로 복사하는 옵션

-p

파일과 디렉토리들의 권한을 유지하는 옵션

-t

수정시간을 유지하는 옵션

-g

그룹 속성을 유지하는 옵션

-o 소유자 속성을 유지하는 옵션

-D

(same as --devices --specials)

--devices --specials 옵션과 같음

--devices root 권한이 필요하며 Device  관련된 파일들을 복사해서 생성

--specials

name socket이나 fifo와 같은 특수한 파일들도 복사하는 옵션

 

 

Rsync 로컬에서 파일과 디렉토리 복사 및 동기화 

1. 원격 파일 복사 프로그램이지만 로컬 컴퓨터에서 사용도 가능

rsync -zvh {source} {destination}

2. 로컬 컴퓨터에서 디렉토리 복사 및 동기화

rsync -avzh {source} {destination}

 

 

Rsync 서버로부터 파일과 디렉토리를 복사 혹은 동기화

1. 로컬 서버에서 원격 서버로 디렉토리 복사

rsync -avz {domain}@{targetIP}:{targetPath} {localPath}

2. 원격 서버의 디렉토리를 로컬 서버로 복사

rsync -avzc {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync SSH 사용
 - Rsync는 -e 옵션을 이용해서 ssh, rsh와 같은 remote shell 프로그램을 선택 가능
 - -e 옵션이 없다면 ssh 사용 (default)

 

Rsync server 모드
Rsyn 데몬  프로그램 설정
 - "--darmon" 옵션을 이용하여 서버 모드로 작동
 - xinetd를 이용해서 시스템 서비스로 등록

 

[ xinetd 패키지 설치 ]
1. /etc/xinetd.d/rsync 설정 파일 만들기
2. rsync 설정파일은 /etc/rsyncd.conf (설정파일이 없는 경우 직접 만들어야 함)
    1) 복사(동기화) 디렉토리로 /home/share를 선택
    2) 읽기/쓰기 모두 가능 설정
    3) 디렉토리에 대한 소유자는 nobody.nogroup, /home/share 소유자를 nobody.nogroup로 변경
    4) 접속 허용 유저로 user을 추가
    5) auth users에 대한 설정파일은 /etc/rsyncd.secrets에 저장
    * /etc/rsyncd.serets 파일에 접속유저이름과 패스워드를 지정할 수 있다. (패스워드는 plain/text)
3. 읽기 테스트
4. 쓰기 테스트

 

Rsync 데이터 복사 진행 상황 확인
 - "--progesss" 옵션 (진행정도를 화면에 출력)

 

Rsync Include exclude 옵션

1. include

2. exclude

 - 복사할 파일을 제외

# data 디렉토리를 복사에서 제외

rsync -avz --exclude 'data' {domain}@{targetIP}:{targetPath} {localPath}
# (*)를 사용하여 .bak 확장자를 포함하는 파일만 제외

rsync -avz --exclude '*.bak' {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync delete 옵션
# "--delete" 옵션을 사용하여 삭제 후 복사

rsync -avz --delete {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync 전송할 파일의 최대 크기 정하기
# "--max-size" 옵션을 이용해서 전송할 파일의 최대 크기를 정함

rsync -avz --max-size='10k' {doamin}@{targetIP}:{targetPath} {localPath}

 

Rsync 성공적으로 전송 후 원본파일 지우기
#"--remove-source-files"이용하여 전송이 끝난 후 원본 파일 삭제

rsync --remove-source-files -zvh {file} {경로}

 

Rsync Bandwidth 제한 설정
# "--bwlimit" 옵션을 이용하여 파일전송에 사용할 네트워크 대역폭을 제한
# 인터넷 서비스중인 서버에서, 다른 서비스에 영향을 주지 않는 범위내에서 파일 복사를 원할 경우 유용하게 사용

rsync --bwlimit=100 -avzhe ssh {localPath} {domain}@{targetIP}:{targetPath}

 

[참고]

https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

쉘 작업 하다가 쉘 명령어가 실행이 안되었을 경우

어떻게 확인해야 하나 고민하다가 java에서 처럼 예외처리하는 방법이 있는지 찾아봄

 

 * 실행 명령어를 조건문에 넣어서 1과 0으로 판단 (0: TRUE, 1: FALSE)

"실행 명령어" && echo "실행됨" || echo "실행안됨!"

위 명령어의 처리 순서

 

"실행 명령어" 실행 결과가 정상 일 경우 `&& echo "실행됨"`이 실행 되어 결과적으로 "실행됨"이 출력

"실행 명령어" 실행 결과가 오류 발생 시 `|| echo "실행안됨!"`이 실행 되어 결과적으로 "실행안됨!"이 출력

 

 * 다중 명령어 수행 시

{

	"실행 명령어1" &&
	"실행 명령어2" &&
	echo "실행 명령어 수행 완료 로그"
    
} || {

	echo "실행 명령어 수행 실패 로그"
	"실행 명령어 수행 실패 시 수행될 명령어"
	exit 1
    
}

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] rsync  (0) 2019.09.03
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07
# 현재 폴더 내에 파일 검색 (하위폴더 포함)
find .

 

# 현 폴더 이하 생성된지 7일 이하 파일 찾기
find -type f -ctime -7
# 현 폴더 이하 7일 이내로 수정된 파일 찾기
find -type f -mtime -7

 

# 현 폴더 내에 파일 총 개수 찾기
find "path" -type f | wc -l

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] rsync  (0) 2019.09.03
[Shell] Exception Handling  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

 * 오류 해결하기

 

변수가 08일 때 수식으로 비교하려 할 때 발생

쉘 스크립트는 특별한 접두사나 표기법이 없다면 숫자를 10진수로 해석한다.
만약에 숫자 앞에 0이 있다면 8진수이고, 0x이 있으면 16진수
#이 들어간 숫자는 진법#숫자로 계산된다.

 

# 10진수
23 > 23
45 > 45

# 8진수 ('0'다음에 나오는 숫자)
071  > 8 (10진수로 표현)

# 16진수 ('0x'나 '0X' 다음에 나오는 숫자)
0x7a > ? (10진수로 표현)

* 날짜로 만들어지는 폴더 경로를 SFTP 명령어로 작성 하고 싶다.

 

이를테면 SFTP 로 접근해서 해당 경로에 파일을 지운다던가

 

이때 폴더가 날짜값으로 만들어지는 이유로 반복문을 돌리는데 숫자 2자리 수 이전 값에서는 01, 02, ... 09와 같은 포맷을 만들기 위해서는 몇가지 작업이 필요하더라

 


 * 한 자리 수 숫자 앞에 0을 붙이는 방법

 

`seq [option] [first_number] [increment] [last_number]`

`seq [option] [first_number] [last_number]`

`seq [option] [last_number]`

 

[option]

-f 포맷방식 "02g", "03g"
-w 마지막 숫자(last_number) 자릿수에 맞게 0을 채움 seq -w 1 10
-s 숫자 사이에 특정 구분자를 추가 seq -s "/t" -w 1 5

 


 * 내가 활용한 방법

`seq -f "02g" 시작 끝`

 

for time in `seq -f "02g" $START $END` ; do

	shtp -i $SSHKEY "사용자계정@호스트" << EOF
    	rm /경로/$time/*
    	quit
        EOF
    
done

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] rsync  (0) 2019.09.03
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12

+ Recent posts