/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이 리턴.
파이프 라인과 다르게 보통 명령어를 연속하여 선언할 때는 ; 와 && 부호를 사용한다.
명령어를 열거하는 방식은 크게 두가지이다.
- cat aaa ; cat bbb → cat aaa 명령의 참, 거짓과 상관 없이 후행 명령을 실행
- 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 %번호 를 통해 백그라운드에서 프로세스를 실행할 수 있다.