본문 바로가기
리눅스

리눅스 수업 6차시 (셀프실습)

by IT매니절 2024. 3. 14.

6차시는 한달전부터 선약이 있어서 강의에 불참했다

내용은 강사님이 주신 자료로 혼자 실습.

 

--

 

tty : 터미널 확인 명령어
출력
/dev/pts/1

원격으로 접속하면 /dev/pts/n~로 디렉터리가 생성된다.
0번째는 문자 장치로 되어 있는 터미널.

wall : 현재 로그인된 사용자들에게 메시지 브로드캐스트
(단, tty 그룹이 터미널에 쓰기 권한이 있어야 보내짐)
ex wall "test"
출력
Broadcast message from root@localhost.localdomain (pts/0) (Thu Mar 14 20:51:00 2024):

dd

mesg : 메세지 여부를 출력/결정하는 명령어
ex mesg              <- 인수없이 실행시 현재 상태 출력
is y
ex mesg n           <- 인수 n으로 설정시 no로 설정되고 /dev/pts/n 의 group 쓰기권한이 삭제됨

 

 

파일시스템 파티션의 구조
┌────────┐
│1│2│ 3│   4  │
└────────┘
1. 부트블록 boot block
- 부팅에 관련된 블록. 시작 부분에 위치하고 부팅시에 읽혀진다.
- 파일 시스템이 어디에 위치하고 있는지, 유형이 뭔지, 부팅 로더에 필요한 정보 등을 포함


2. 슈퍼블록 super block
- 메타데이터 중 하나. 시스템 전반에 대한 중요한 정보를 저장하고 파티션에 대한 전체 정보를 가진다.
- 파일 시스템 크키, i-node의 수, 데이터 블록의 수, 파일 시스템 상태 등을 나타내는 매개변수가 있다
- 올바르게 마운트되기 위해 필수
- 이 블록이 망가지면 파티션을 사용할 수 없을 정도로 중요


3. 아이노드 블록 i-node block
- i-node들이 저장된 블록. 파이, 디렉토리와 관련된 메타데이터 저장
- 모든 파일은 대응되는 i-node를 가진다
- i-node들은 파일의 종류, 권한, 소유자, 크기 및 데이터 블록에 대한 포인터 정보를 가짐


4. 데이터 블록 data block
- 실제 데이터가 저장된 블록. 필요에 따라 새로운 데이터 블록이 할당되어 저장된다.

 

 

텍스트 편집기
1. nano 입문자용
2. vi 시니어급
3. emacs 리처드 스톨만이 제작

설치 명령어
redhat 계열 : yum, dnf 명령어
debian 계열 : apt-get, apt 명령어

 

nano 편집기 설치
: yum -y install nano

 

nano test.txt
-> 같은 이름의 파일이 없으면 새 파일로 열어서 편집창을 연다
Ctrl+X 입력하면 종료

vi test2.txt
-> 같은 이름의 파일이 없으면 새 파일로 열어서 편집창을 연다
:wq 저장하고 종료
:wq! 저장 안 하고 종료
:w 저장
:q 종료

 

프로그램 : vmware를 설치하면 HDD에 저장된다. 실행파일. (수동적, 정적 개체)
프로세스 : 설치된 vmware를 실행해서 사용. 프로그램의 한 개의 인스턴스. (동적, 활성화된 엔티티)

UID (User ID)
- 사용자를 고유하게 식별하는 번호. 사용자마다 다르다.
- root는 0번으로 할당됨
- 일반유저는 보통 1000번대부터 할당

EID(Effective User ID)
- 프로세스가 현재 실행되는 사용자의 실제 권한을 나타내는 값.
- 일반적으로 UID와 EUID는 동일하다
- 단, 실행파일에 setuid, setgid가 설정되어 있다면 EUID는 소유자와 그룹의 권한으로 실행될 수 있다

 

gcc는 GNU Compiler Collection의 줄임말로 오픈 소스 컴파일러.

gcc 패키지 설치
: yum -y install vim gcc make gdb glibc.i686 glibc-devel.i686 libgcc.i686 libstdc++.i686 glibc  glibc-devel libgcc libstdc++ 

 

실습
컴파일 : gcc -o 실행파일 소스파일 또는 gcc 소스파일 -o 실행파일

1. gcc -o setuidTest setuidTest.c
2. ll setuidTest
출력
-rwxr-xr-x. 1 root root 8472  3월 14 21:20 setuidTest

3. ll -n setuidTest
출력
-rwxr-xr-x. 1 0 0 8472  3월 14 21:20 setuidTest

=> -n은 소유자와 그룹을 숫자로 표기한다. 현재 root 이므로 0 0 표기됨

file setuidTest
출력
setuidTest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=349e98edd122e56983d90f2a4a3272907af07c88, not stripped

=> ELF 64-bit LSB executable : 64bit 실행파일이라는 뜻
ELF 32-bit LSB executable : 32bit 실행파일 (-m32 옵션이 필요함)

 

c언어 파일 실행 실습... 인데 자꾸 에러남

혹시나 주석때문인가 해서 주석을 다 빼도
./setuidTest.c: line 3: syntax error near unexpected token `('
./setuidTest.c: line 3: `int main()'

이런 출력메시지가 뜨면서 실행되지 않아서 곤란... 하다고 생각했는데 그냥 내가 잘못한거였다

gcc로 컴파일해서 실행파일을 만들어놓고, 폴더를 옮길 때 실행파일 말고 c언어 파일만 옮겨온것

gcc로 현재 위치에서 실행파일을 다시 만들고 실행했더니

uid와 euid가 잘 나왔다

 

./setuidTest
uid  = 0
euid = 0

=> root에서 실행했을 때

uid  = 1000
euid = 1000

=> user1에서 실행했을 때

 

chmod u+s setuidTest -c

mode of `setuidTest' changed from 0755 (rwxr-xr-x) to 4755 (rwsr-xr-x)
=> setuid 설정해줌. -c는 기존 모드에서 변경될 때 메세지를 출력해준다.

 

uid  = 1000
euid = 0

=> setuid를 설정한 후 user1에서 실행했을 때.

euid가 0이 된 것을 확인할 수 있다. setuid의 root 권한으로 실행된 것.

 

Sticky bit
- 공용 디렉터리에서 사용하는 권한. 디렉터리에 other의 w쓰기 권한이 있을 때 누구나 파일을 생성할 수 있다.
단, 삭제나 수정 등은 자신이 생성한 파일에만 할 수 있다.

# chmod o-w  /test/ -c
이후 touch 명령어 실행하면
touch: cannot touch `aaa.txt': 허가 거부
other의 w 권한이 삭제되었기 때문에 파일 생성이 안됨
# chmod o+w  /test/ -c
다시 권한을 넣어주면 touch 명령어로 잘 생성되는 것을 확인 할 수 있다.

 

chmod o+t  /tmp/ -c
stickybit 권한 추가해주고
ls -ld /test
drwxr-xrwt. 2 root root 73  3월 14 21:54 /test/
t권한 생긴것 확인

 

touch user1_test.txt
ll user1_test.txt
-rw-r--r--. 1 user1 user1 0  3월 14 21:57 user1_test.txt

=> user1로 파일생성
rm -rf user1_test.txt
rm: cannot remove `user1_test.txt': 명령을 허용하지 않음

=> user2로 파일삭제 실패

removed `user1_test.txt'

=> 생성자인 user1은 삭제 가능

 

chmod
1. Symbolic mode 문자: ugoa, +-=rwxst
ex chmod u+rwx,go+rx 파일명            -> rwxr-xr-x 0755
ex chmod a+rwx,go-w 파일명             -> rwxr-xr-x 0755

2. Octal mode 8진수 숫자: 0~7
ex chmod 000 파일명
ex chmod 755 파일명

 

 

파일 디스크립터 File Descriptor
- 파일이나 소켓 등 I/O 리소스에 대한 식별자.
- 모든 프로세스는 파일 디스크립터 테이블을 갖고 있으며, 이 테이블은 해당 파일 또는 소켓과 연결된다
- 위치 : /proc/<프로세스의 PID>/fd

 

find / -type d -name fd
출력
/proc/13302/task/13302/fd
/proc/13302/fd
/sys/fs/selinux/class/fd
...

 

/usr/include/unistd.h를 열어보면
#define STDIN_FILENO    0       /* Standard input.  */
#define STDOUT_FILENO   1       /* Standard output.  */
#define STDERR_FILENO   2       /* Standard error output.  */
파일 디스크립터가 #define 선언된 내용을 확인할 수 있다. 0번이 input, 1번이 output, 2번이 error

#define은 치환한다는 뜻 (매크로 함수라고도 함)

 

교재로 제공된 c언어 파일 내용
: test.1txt과 test2.txt 파일 생성, TCP 소켓과 UDP 소켓 생성
그 후
test2.txt의 파일 디스크립터 printf
TCP 소켓의 파일 디스크립터 printf
UDP 소켓의 파일 디스크립터 printf
close

 

실행 : ./fdtest

두 번째 파일 디스크립터 : 4
세 번째 파일 디스크립터 : 5
네 번째 파일 디스크립터 : 6

 

실행 : ./fdtest &
[1] 13989
[root@localhost ~]# 두 번째 파일 디스크립터 : 4
세 번째 파일 디스크립터 : 5
네 번째 파일 디스크립터 : 6

 

& 를 붙이면, 프로그램을 실행할 때 백그라운드 프로세스로 실행하라는 뜻

&를 붙여 실행했더니 이상한 출력내용이 나왔다.

13989는 현재 디스크립터의 PID 이다

 

ll /proc/13989/fd

lrwx------. 1 root root 64  3월 15 17:52 0 -> /dev/pts/0
lrwx------. 1 root root 64  3월 15 17:52 1 -> /dev/pts/0
lrwx------. 1 root root 64  3월 15 17:52 2 -> /dev/pts/0
l-wx------. 1 root root 64  3월 15 17:52 3 -> /root/test1.txt
lr-x------. 1 root root 64  3월 15 17:52 4 -> /root/test2.txt
lrwx------. 1 root root 64  3월 15 17:52 5 -> socket:[79937]
lrwx------. 1 root root 64  3월 15 17:52 6 -> socket:[79938]

각각 생성한 파일들에 대한 파일디스크립터 심볼릭링크가 걸려있는 것을 확인할 수 있다

(시간이 좀 지난 후에 하면 사라지는듯)

 

실습을 위해 psmisc설치

yum -y install psmisc

(psmisc란 pstree를 실행하기 위해 필요한 패키지)

 

pstree -p | grep bash
           |-login(683)---bash(1270)
           |-sshd(1005)---sshd(1287)---bash(1291)-+-grep(14392)

 

pstree란
프로세스와 프로세스간 관계를 파악하기 위한 명령어.
현재 실행중인 프로세스를 트리구조의 형태로 보여준다

-p는 pid를 같이 보여주는 명령어

'리눅스' 카테고리의 다른 글

리눅스 수업 8차시  (0) 2024.03.17
리눅스 수업 7차시  (0) 2024.03.16
리눅스 수업 5차시  (0) 2024.03.09
리눅스 수업 4차시  (0) 2024.03.03
리눅스 수업 3차시  (0) 2024.03.02