카테고리 보관물: shell-script

[Powershell] 포트 정보 조회

파워쉘(Powershell)을 이용한 포트 정보 조회

파워쉘을 이용하면 네트워크 연결 상태에 보다 효율적인 접근을 할 수 있습니다.

이전 명령 프롬프트(cmd)를 이용하면 아래와 같이 할 수 있습니다.

> netstat -anp tcp | findstr 8080

위의 정보는 TCP 연결중 8080 이 포함된 문자열을 검색하라는 뜻입니다.

TCP 연결 상태 조회

Get-NETTcpConnection cmdlet 을 이용하면 현재 운영체제에서 TCP로 연결된 목록을 출력할 수 있습니다.

PS> Get-NetTCPConnection | Select-Object -First 10

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
::                                  60625     ::                                  0          Bound                      15984
::                                  60357     ::                                  0          Bound                      21468
::1                                 60625     ::1                                 3306       Established Internet       15984
::                                  49672     ::                                  0          Listen                     708
::                                  49668     ::                                  0          Listen                     700
::                                  49667     ::                                  0          Listen                     2384
::                                  49666     ::                                  0          Listen                     1388
::                                  49665     ::                                  0          Listen                     1192
::                                  49664     ::                                  0          Listen                     600
::                                  17500     ::                                  0          Listen                     18324

위의 명령은 TCP연결중에서 10개의 데이터만 출력하라는 뜻입니다.

특정 포트 정보 조회

그렇다면 TCP 연결중에 원하는 포트만 찾고 싶은 경우에는 다음과 같이 할 수 있습니다.

PS> Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 3306 -and $_.State -eq 'Listen'}

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
::                                  3306      ::                                  0          Listen                     8248

포트 정보를 이용해서 프로세스 정보 조회하기

가끔 서버를 설정하다보면 포트 충돌이 발생하는 경우를 확인할 수 있습니다. 그럴 경우 이전에 해당 포트를 사용하는 프로세스를 검색하고 검색된 프로세스를 죽이는 방식으로 처리를 하곤 합니다.

아래의 명령을 통하면 해당 포트를 사용중인 프로세스가 어떤 프로세스인지 확인할 수 있습니다.

PS> $pid3306 =  Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 3306 -and $_.State -eq 'Listen'} | select-object -ExpandProperty owningprocess

PS>  Get-Process | Where-Object {$_.ID -eq $pid3306}
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    230      22   445112      79396       0.20   8248   5 mysqld

결과는 3306 포트를 사용중인 프로세스는 mysqld 라는 프로세스입니다.

아직 파워쉘(Powershell)을 사용한지 오래되지 않았지만 확실하게 느낄 수 있는 것은 Batch 프로그램 보다는 효율적인것 같습니다.

[Shell Script] 인라인 파이썬코드로 ini 파일 파싱

Shell Script에서 python 을 이용하여 ini 파일 파싱


의도

쉘 스크립트를 이용해 /etc/systemd/system/서비스명 파일을 분석하려고 하니 스크립트에서 ini 형태의 파일을 분석하는게 조금 노가다성이라 pythonConfigParser 를 이용하면 좋겠다라는 생각이 들어 사용하였습니다.

[/etc/systemd/system/web-monitor.service] 샘플

[Unit]
Description=CHIeru Webmonitoring system.

[Service]
ExecStart=/usr/bin/node $INSTALL_PATH/server/server.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=web-monitor
User=root
Environment=\"NODE_CONFIG_DIR=$INSTALL_PATH/config\"

[Install]
WantedBy=multi-user.target

위의 부분에서 제가 필요한 부분은 Service 섹션의 ExecStart 값중 INSTALL_PATH 경로를 가져오는 것입니다.

[Shell Script code]

pathFromService=$(python - <<EOF
import ConfigParser
import os
Config = ConfigParser.ConfigParser()
Config.read('/etc/systemd/system/web-monitor.service')
executeCommand = Config.get('Service', 'ExecStart')
executeFilePath = executeCommand.split(' ')[1]

installationPath = os.path.abspath(os.path.dirname(executeFilePath) +'/../')

print installationPath
EOF
)
    LEN=$(echo ${#pathFromService})
    echo $pathFromService

[Shell Script] JSON parsing using Nodejs

Shell Script에서 Nodejs를 이용하여 JSON 값 가져오기


의도

쉘 스크립트를 이용해 프로그램 설치시 방화벽에 자동으로 포트를 추가하려고 하니 설정 정보는 JSON 파일로 되어 있어 쉘 스크립트만으로 파싱하기는 어려움이 있습니다.

다행히 프로그램이 nodejs 기반으로 돌아가는 어플리케이션이라 쉘 스크립트에서 nodejs 를 이용하여 파싱하고 값을 가져오는 처리를 하였습니다.

※ 다른 방법도 많이 있습니다. awkpython 을 이용하여 값을 가져오는 방법도 있으니 구글링해보시길 바랍니다.

입력, 실행 파일


[JSON file]

// default.json
{
    "http": {
        "port": 9080
    },
    "websocket": {
        "port": 9070
    },
    "peerjs": {
        "path": "/peerjs",
        "port": 9000,
    }
}

[Shell script file]

// test.sh

# http 포트 정보 가져오기 
HTTP_PORT=$(node -pe 'JSON.parse(process.argv[1]).http.port' "$(cat default.json)")

# peerjs 포트 정보 가져오기
PEERJS_PORT=$(node -pe 'JSON.parse(process.argv[1]).peerjs.port' "$(cat default.json)")

# websocket 포트 정보 가져오기
WEBSOCKET_PORT=$(node -pe 'JSON.parse(process.argv[1]).websocket.port' "$(cat default.json)")

echo "HTTP port is $HTTP_PORT"
echo "PEERJS port is $PEERJS_PORT"
echo "WEBSOCKET port is $WEBSOCKET_PORT"

# Output
# HTTP port is 9080
# PEERJS port is 9000
# WEBSOCKET port is 9070

실행


// 스크립트에 실행 권한을 추가 
> chmod u+x test.sh

// 스크립트 실행
> ./test.sh

[Script] bash root 권한 확인

Bash 스크립트 작성시 ROOT 여부 확인

아래와 같이 코드를 도입부에 추가하면 루트 권한이 있는 경우에만 실행 되도록 할 수 있습니다.

#!/bin/bash
ROOT_UID=0
E_NOTROOT=67

if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Script have to execute on ROOT mode"
exit $E_NOTROOT
fi

Euckr to UTF-8

폴더 Euckr to UTF-8


문제점

자바를 처음 시작하면서 이클립스의 기본 인코딩인 Euckr를 이용하여 코딩을 하다 Linux 또는 OSX로 IDE를 변경하게 되면
UTF-8이 기본 인코딩으로 되어 한글이 깨지는 문제가 발생됨.

해결

아래의 스크립트를 이용하여 폴더(하위 폴더 포함)에 포함된 모든 자바 파일의 인코딩을 Euckr 에서 UTF-8로 변경

#!/bin/sh
# Author: 	coozplz@gmail.com
# Date	:	2015.03. 25
# Desc	: 	Convert 'Euckr encoded Java file' to 'UTF-8 encoded Java file' in specific directory.

if [ -z "$1" ]; then
	echo "[ERROR] No argument supplied, need directory path "
	exit 1
fi

echo "Convert euckr to utf8"
echo "target dir $1"

for fName in $(find $1 -name *.java -type f -print); do
	iconv -c -f euc-kr -t utf-8 $fName > $fName.tmp && mv $fName.tmp $fName
done

[awk] log4j를 로그를 이용한 실행시간 분석

Log4j 로그를 이용한 실행 시간 분석 예제

log4j 를 이용한 출력 결과에서 입력된 시간 이상의 로그를 추출하는 awk 스크립트.
(연습하는 중이라 내용에 불필요한 데이터가 많습니다..또한 더 쉬운 방법도 있을 겁니다.)

coozplz@localhost:~/tutorial/awk$ cat catalina.out

[Sample.log]

[INFO ] [2014-03-24 10:01:59] [Processor:534] connectionAlerting – 양재남[0991, 0424] // Alerting END takes 127ms, callID=294352, callingNum=0424, calledNum=0704]
[INFO ] [2014-03-24 10:01:59] [Processor:306] connectionEstablished – 문창운[0990, 0313] // Established END takes 94ms, callID=0, callingNum=0313, calledNum=0286]

[getExecutionTime.awk]

#
# getExecutionTime.awk
# 설명: 로그 파일에서 실행 시간만을 추출한다.
#
BEGIN {
   print “”;
   print “==================================================================”;
   print “사용법: awk -f getExecutionTime.awk iTime=[실행시간] [파일명]     “;
   print “실행시간 입력이 없는 경우 1000 ms 를 기본값                        “;
   print “==================================================================”;
   print “”;
}
{
   timeStr = $14;     # output= 127ms,  
   time = substr(timeStr, 0, length(timeStr) -length(“ms,”)+1);   # time=127
   time = time+0.1; #문자열을 숫자로 캐스팅한다.
   if(length(iTime) == 0) {
       iTime = 1000;
   }
   if( time > iTime ) {
       print $0;
   }
}

[사용방법]

사용법: awk -f getExecutionTime.awk iTime=[실행시간] [파일명]     
실행시간 입력이 없는 경우 1000 ms 를 기본값                        
coozplz@localhost:~/tutorial/awk$ awk -f getExecutionTime.awk iTime=100 catalina.out