[Linux] awk 활용 + 쉘스크립트

728x90

/etc/passwd 1000 udid 이상의 사용자는 일반 유저이다. awk 를 사용해서 일반 유저 정보만 출력해라

df -hTP | sed 's/%//g' | awk '$1 ~ /^/dev/ && $6 >= 40 {print $1, $6"%", $7}’

잘 모르겠으면 검색해서 확인하자..

$[필드 번호] ~  ⇒   특정 필드에 조건문을 넣을 때 사용하는 방식

정규표현식을 사용할 때 ^ 는 정규표현식에서 값을 가지기 때문에 ^\ 를 해야 문자열로 처리가 된다.

^[0-9], ^[a-zA-Z] 이것 처럼 ^ 정규표현식에서 시작점을 의미하기 때문에... ^\ 로 문자로 변경한 것.

 

로그인에 실패한 로그 기록이 아래와 같다.

user     ssh:notty    192.168.110.200  Mon Oct  5 17:25 - 17:25  (00:00)    
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)    
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)    
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)    
user     ssh:notty    192.168.110.200  Mon Oct  5 17:09 - 17:09  (00:00)    
user     ssh:notty    192.168.110.136  Mon Oct  5 17:08 - 17:08  (00:00)    
user     ssh:notty    192.168.110.136  Mon Oct  5 17:07 - 17:07  (00:00)    
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:27 - 16:27  (00:00)    
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:27 - 16:27  (00:00)    
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:27 - 16:27  (00:00)    
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:26 - 16:26  (00:00)    
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:26 - 16:26  (00:00)    
user     ssh:notty    192.168.110.110  Mon Oct  5 17:13 - 17:13  (00:00)    
user     ssh:notty    192.168.110.110  Mon Oct  5 17:09 - 17:09  (00:00)    
user     ssh:notty    192.168.110.110  Mon Oct  5 17:08 - 17:08  (00:00)    
user     ssh:notty    192.168.110.110  Mon Oct  5 17:07 - 17:07  (00:00)     
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:26 - 16:26  (00:00)    
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:25 - 16:25  (00:00)    
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:25 - 16:25  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)    
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)    
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)    
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)    
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:24 - 16:24  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:26 - 16:26  (00:00)    
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:26 - 16:26  (00:00)    
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)    
root     :0           :0               Mon Oct  5 11:02 - 11:02  (00:00)    

btmp begins Mon Oct  5 11:02:02 2020

원격에서 접속한 녀석들이 10번 이상 접속을 실패한 친구들을 찾아라

awk ‘$3 ~ /^[0-9]/ {print $3}’ lastb.txt | sort -n | uniq -c | awk ‘$1 >= 10 {print “10 회 이상 접속한 ip 는 “ $2}’;

$ cat /var/run/sshd.pid 를 통해 pid 를 알게 되면 어떤 프로세스가 실행되는지 알 수 있다.

$ ls /proc | grep ^[0-9]

$ ls -l /proc/923/exe

 

명령어의 결과 물을 출력하고 싶을 때는 `` 를 사용해서 출력을 하거나 $() 처럼 사용한다. (작은 따음표가 아니라 백틱!)

 

$ echo “ls /proc | grep ^[0-9]" ⇒ $A 같은 변수가 들어오면 변수의 값으로 처리된다.

$ echo ‘ls /proc | grep ^[0-9]’ ⇒ $A 같은 변수도 문자로 처리한다.

$ echo `ls /proc | grep ^[0-9]` => 백틱은 `` 사이의 명령을 실행하여 처리한다.

$ echo $(ls /proc | grep ^[0-9]) ⇒ 위와 같은 방법으로 $() 사이에 명령어와 변수를 넣어주면 실행하여 처리한다.

 

i 에 ls /proc \ grep ^[0-9] 의 실행값이 하나하나 차례로 들어간다.

$ for i in `ls /proc | grep ^[0-9]`

> do

> ls -l /proc/$i/exe 2> /dev/null

> done

 

실행 결과는 아래와 같다.

cat bbbb 라는 파일이 존재하지 않아서 echo $? 명령어를 입력하면 1이 리턴된다. 정상이면 0이 리턴.

파이프 라인과 다르게 보통 명령어를 연속하여 선언할 때는 ; 와 && 부호를 사용한다.

명령어를 열거하는 방식은 크게 두가지이다.

  1. cat aaa ; cat bbb → cat aaa 명령의 참, 거짓과 상관 없이 후행 명령을 실행
  2. cat aaa && cat bbb → cat aaa 명령의 결과가 참일 경우 후행 명령을 실행

위 둘은 서로 다르게 작동한다.

; 은 앞에 있는 선행 명령어가 실행하든 실행하지 않든 후행 명령어를 실행한다.

&& 앞에 있는 선행 명령어가 실행하지 않으면 후행 명령어를 실행하지 않는다.

 

$ 작업 1 ; 작업 2 ; 작업 3 → 작업 1, 작업 2, 작업 3이 아무 관련 없을 때 사용

$ 작업 1 && 작업 2 && 작업 3 → 작업 1, 작업 2, 작업 3의 관계가 연관이 있을 경우 유용하다.

 

파이프 라인과의 차이?

$ 작업 1 | 작업 2 → 작업 1의 결과가 작업 2의 입력으로 들어오는 것! 위와 아예 다르다!

cat /etc/passwd ; ls -l etc/shadow → 이 경우를 보면 passwd 와 shadow 를 읽는 것이다. 결과값을 입력값으로 넣어주는 작업을 할 필요가 없다!!!!!

개별적으로 열거를 해 줄 때 사용해주면 된다.

read.sh 파일을 만든다.

read x 로 변수 x 를 받아오고 echo 를 이용해 출력하는 스크립트 파일이다.

argument 에 대해 알아보자

쉘 스크립트에서 $# 은 입력받은 매개변수의 갯수를 출력, $0 은 파일 이름을 출력한다. $$ 은 PID 를 출력한다.

if 문의 성공은 then, if 문을 끝낼 때는 항상 fi 를 붙여야 한다.

if [$A -eq $B] 이렇게 작성하면 실행되지 않는다. if [ $A -eq $B ] 처럼 대괄호에 스페이스가 존재해야 한다!!!!!

리눅스의 쉘 스크립트에서 if 문은 파일의 유무에 대한 처리에 굉장히 특화되어 있다.

-e 옵션을 사용한 if 문은 아래와 같다.(파일의 경로는 절대 경로로 써야 한다.)

성공할 때 까지 반복문을 돌림

test1 이 로그인하는지 확인하는 프로그램을 만든다. (특정 이벤트나, 특정 프로그램이 실행되면 확인하는 프로그램을 만드는 것..)

$ user add test1

$ grep test1 /etc/passwd /etc/shadow /etc/group

$ passwd test1

$ who

#!/bin/bash
until  who  |  grep “^test1”      
do 
	sleep 5
done
echo  “지금 막 test1 유저가 접속했습니다.”

chmod u+x test1_login_check.sh 로 배쉬 실행 권한을 준다.

& 를 붙이는 것은 백그라운드에서 실행하도록 하는 것이다.

test1 이 로그아웃 하면 로그를 찍는다.(실패할 때 까지 반복, 조건을 만족할 때 까지 계속해서 반복문을 돌린다.)

백그라운드에서 실행되고 있는 프로세스를 종료하고 싶으면 jobs 명령어를 실행시키고 [1] [2] [3] [n] 이런식으로 실행되고 있는 프로세스에 번호가 매겨지는데 그 번호를 기억하고 fg %번호 를 입력하고 ctrl+c 를 누르면 실행중인 프로세스가 종료된다.

동작을 잠시 중단하고 싶다 fg %번호 를 한 후에 ctrl+z 를 누르면 프로세스가 stop 상태가 된다. 다시 백그라운드에서 실행 시키려면 bg %번호 를 통해 백그라운드에서 프로세스를 실행할 수 있다.

728x90