2021 06 11(금)
1. 학습 날짜 : 20210611(금)
2. 학습 시간 : 12:00 ~
3. 학습 주제 : pipex 최종 정리, born2beroot조사, 알고리즘/자료구조 1문제, GIT 조사.
4. 동료 학습 방법 : 동료 1명, 개인
5. 학습 목표 :
- pipex 최종 정리, 피드백
- pipex에서 환경변수를 어떻게 받아와야 할 지 조사
- 최종 피드백
- born2beroot 평가 준비 ~ 18:30 전까지
- subject 읽고 요구사항 정리
- 평가지 읽어보기
- notion 읽어보기.
6. 학습 내용 :
pipex 요구사항 - shell command는 기본 path에 있는 path만 찾으면 되는가?
리눅스/맥 shell command path는 5개 path에 기본적으로 command가 존재한다고 한다.
웬만한 command는 아래의 path에 존재한다고 하는데, 이전에 이를 참고하여 ./pipex
프로그램을 짰었다.
./pipex
는 입력받은 인자로 유효한 shell command가 들어왔는지를 확인한다. 밑의 5개 default shell command path와 shell command 이름을 합친 뒤, 각각 open
한 뒤, path가 정확하다면 유효한 fd
를 반환할 것이고 존재하지 않는 path라면 -1
을 반환할 것이다.
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
static void init_path_arr(char **path)
{
path[0] = "/bin/";
path[1] = "/usr/bin/";
path[2] = "/usr/local/bin/";
path[3] = "/usr/sbin/";
path[4] = "/sbin/";
}
int is_valid_cmd(t_parsed **parsed)
{
int rep;
char *path[5];
int fd;
int i;
init_path_arr(path);
i = 2;
while (--i >= 0)
{
rep = 5;
while (--rep >= 0)
{
parsed[i]->cmd_path = ft_strjoin(path[rep], parsed[i]->cmd);
fd = open(parsed[i]->cmd_path, O_RDONLY);
if (fd >= 0)
{
close(fd);
break ;
}
close(fd);
free(parsed[i]->cmd_path);
}
}
return (parsed[PARENT_INDEX]->cmd_path && parsed[CHILD_INDEX]->cmd_path);
}
위 코드는 문제가 있다.
기본적인 리눅스/맥 쉘 커맨드를 실행시킬 수는 있어도, 그 외의 커맨드는 실행시키지 못한다.
그 외의 커맨드라 함은, 사용자가 지정한 path에 있는 command라던지... 그 외의 환경변수에 존재하는 command라던지..
PATH=/Users/mc/.brew/bin:/Users/mc/.brew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mu
내 ./pipex 프로그램은 위 환경변수에 존재하는 /Users/mc./brew/bin/
이나, /usr/local/mu/
에 존재하는 command 를 실행시키지 못한다.
만약, ./pipex 프로그램으로 /Users/mc./brew/bin/
디렉토리 안의 asdf
프로그램을 실행시킨다고 가정하자.
위 프로그램으로는 /Users/mc./brew/bin/asdf
를 찾지 않을 것이고, 따라서 없는 프로그램이라고 표준 출력에 에러를 띄울 것이다.
조금 더 범용성 있는 프로그램을 만들기 위해서는 환경변수를 인자로 받아올 필요가 있었는데, 내가 알아본 방법으로는
getenv()
: 를 사용해서 환경변수를 받아온다.-
main(argc, argv, env)
: 를 활용해서 환경변수를 받아온다.
위 두가지가 보편적인 방법인듯 했다.
1차적으로 생각한 getenv()는 허용되지 않은 함수를 사용한 것이기 때문에, 가능한 시나리오에서 제외시켰고,
2번째로 알게 된 main문에서 환경변수를 인자로 받아와 환경변수 문자열 char **envp
내에서 파싱하는 방법을 택했다.
int is_valid_cmd(t_parsed **parsed, char **envp)
{
int fd;
int i;
int j;
char *env_path;
char **env_path_arr;
char *temp;
i = 2;
j = -1;
while (envp[++j])
if(ft_strncmp(envp[j], "PATH", 4) == 0)
env_path = envp[j];
env_path_arr = ft_split(env_path + 5, ':'); //"PATH= ..."부터 시작하기 때문에 "PATH="를 지나치고, :를 기준으로 Split한다.
while (--i >= 0)
{
j = -1;
while (env_path_arr[++j]) //...[1]
{
temp = ft_strjoin(env_path_arr[j], "/");
parsed[i]->cmd_path = ft_strjoin(temp, parsed[i]->cmd);
free(temp);
fd = open(parsed[i]->cmd_path, O_RDONLY);
if (fd >= 0)
{
close(fd);
break ;
}
close(fd);
free(parsed[i]->cmd_path);
}
}
return (parsed[PARENT_INDEX]->cmd_path && parsed[CHILD_INDEX]->cmd_path);
}
# [1]에서의 env_path_arr 출력 결과 :
/Users/mc/.brew/bin
/Users/mc/.brew/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/as
이제 환경변수로 명령어집합을 찾을 수 있게 되었다.
쉘에서 환경변수 찾기
env
pipex % clear
pipex % env
TERM_SESSION_ID=w
SSH_AUTH_SOCK=/
LC_TERMINAL_VERSION=3.3.7
COLORFGBG=7;0
ITERM_PROFILE=Default
XPC_FLAGS=0x0
LANG=en_US.UTF-8
PWD=
SHELL=/bin/zsh
TERM_PROGRAM_VERSION=3.3.7
TERM_PROGRAM=iTerm.app
PATH=/Users/mn/.brew/bin:/Users/un/.brew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/fg
LC_TERMINAL=iTerm2
COLORTERM=truecolor
TERM=xterm-256color
HOME=/Users/m
TMPDIR=/var/
USER=djg
XPC_SERVICE_NAME=0
LOGNAME=dasd
ITERM_SESSION_ID=
__CF_USER_TEXT_ENCODING=
SHLVL=
OLDPWD=/Users/gf
_=/usr/bin/env
env 요소
BASH 사용하는 bash 쉘 경로
COLUMNS 터미널 컬럼 수
DISPLAY X 디스플레이 이름
EDITOR 기본 편집기
HISTFILE history 파일 경로
HISTSIZE history에 저장되는 개수
HOME 사용자 홈 디렉토리
HOSTNAME 호스트 이름
LANG 기본 언어
LINES 터미널 라인 수
LOGNAMES 로그인 이름
MAIL 메일을 보관하는 경로
MANPATH man 페이지 경로
OSTYPE 운영체제 타입
PATH 실행 파일 경로
PS1 명령 프롬프트변수
PWD 현재 작업 디렉토리
SHELL 로긴 쉘
TERM 터미널 타입
UID 사용자 UID
USER 사용자 이름
VISUAL Visual 편집기
2beRoot 요구사항 분석
제목 : 2bRoot
주제 : 가상화
목적 : 가상머신 세팅 ( 시스템 세팅 )
제출 : signature.txt w/ .vdi파일을 sha1 포맷팅해서 제출.
요구사항 - 모르는 개념 밑줄
- 서버를 세팅해야 함.
- X.org, 그래픽 서버 설치 불가능.
- Debian, Centos 중 택1.
- Debian이 간단해서 Debian 추천. -> CentOS는 세팅이 복잡한가?
- Centos의 Kdump ?
- AppArmor for Debian must be running at startup too?
- LVM을 사용해서 암호화된 파티션을 최소 2개 만들어야함.
- 운영체제에서 파티셔닝 설정에 대해 물어본다.
- differences between aptitude and apt
- SELinux?
- AppArmor?
- SSH service : it must not be possible to connect using SSH as root : (해석 : ssh를 root로 실행하면 안된다..?)
- UFW firewall 로 N포트만 열어야함.
- hostname 바꾸기 : hostname 바꾸는 방법/Setting하는 방법?
- a strong password policy를 구현해야한다.
어려운 / 보안이 강화된 패스워드를 사용해야한다.?인가 strong passowrd policy를 적용시킨 시스템을 깔아야한다...?인가? --> 후자- Password가 30일마다 만료되어야함
- minimum ~ before modification
- 만료 전 warning 7일전에 알려야함
- 비밀번호 문자 작성 규칙 따라야함.
- Sudo 구현, Strict Rules 따라야한다.
- 비밀번호 3번만 틀려야함
sudo
쓸 때 : 비밀번호 틀리면 에러메시지- sudo 사용했을 때. : archived. ----> log file 만들라는 말인듯.
- TTY모드가 켜져있어야한다.
- sudo만 사용할 수 있는 path들은 제한되어있어야한다.
- group 변경.
- bash에서 monitoring.sh를 만들어야한다.
- 꼭 monitoring.sh를 bash에서 만들어야한다.
- 서버가 구동되고 나서, 10분마다 wall을 사용해서 어떤 information을 제공해야한다.
- Wall이란?
- 어떤 information종류..
- 1.
- 2.
- ...etc
Os-release
명령어. : os_release 명령어로 확인 가능.
2beroot 추가요구사항 분석 :
- 파티션을 pdf 요구사항대로 정확하게 나눌 것.
- lsblk : lsblk 는 리눅스 디바이스 정보를 출력하는 명령어로 blkid 보다 더 상세한 정보를 표시합니다.
- Wordpress + lightpd, MariaDB, PHP.+ (nginx, Apache2 중 택1) 로 서비스 시작.
- UFW Rule적용
학습에 도움된 사이트 :
오늘 발견한 문제와 해결방안:
7. 학습 총평 :
- 리눅스 시스템 관리를 주제로 하는 2BeRoot를 평가해봤는데,2beRoot 요구사항 분석에서 제시한 리눅스 시스템 관리 요건을 모두 충족한 데다, 리눅스 시스템에 대한 이해도 완벽하셨고,당장 기억나는 설명만 해도 많다.
- LVM 파티셔닝 과정
- 왜 LVM과 encrypted partitioning이 필요한지
- Linux 분류 체계 :
- Redhat Enterprise계열 vs Debian 계열
- SELinux 와 AppArmor가 무엇인가?
- TTY가 무엇인가?
- Sudo의 역할과 Su의 역할
- Cron의 사용법
- SSH 개념
- aptitude vs apt계열 패키지관리자
- lighttpd서비스
- searx
- ufw명령어
- 주제와 관련한 설명도 완벽하셨다.
- 정말 수준이 높았다.
8. 다음 학습 계획 :
- pipex 프로젝트 피드백
- 알고리즘, 자료구조
- Git 사용법 정리.