2021/일일 기록

2021 06 11(금)

ililillllllliilli 2021. 6. 12. 13:22

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 를 찾지 않을 것이고, 따라서 없는 프로그램이라고 표준 출력에 에러를 띄울 것이다.

조금 더 범용성 있는 프로그램을 만들기 위해서는 환경변수를 인자로 받아올 필요가 있었는데, 내가 알아본 방법으로는

  1. getenv(): 를 사용해서 환경변수를 받아온다.
  2. 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적용



학습에 도움된 사이트 :

주제 사이트 비고
c 환경변수 받아오기
main-envp
https://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-c-c  
getenv() https://joequery.me/code/environment-variable-c/  
how to get env in c https://www.google.com/search?q=how+to+get+environment+variable+in+c&oq=how+to+get+env&aqs=chrome.3.69i57j0l7j0i30l2.5685j0j4&sourceid=chrome&ie=UTF-8  
     
LVM과 RAID https://wiseworld.tistory.com/32  
LVM 과 그룹,.. https://jangpd007.tistory.com/235  
     
2BeRoot 가이드/블로그 https://nostressdev.tistory.com/12  
Git https://junwoo45.github.io/2019-09-03-git%EC%9D%B4%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%B0%A9%EC%8B%9D/  

오늘 발견한 문제와 해결방안:

  •  

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 사용법 정리.