티스토리 뷰

 현재 다니는 대학교 학회의 학생용 리눅스 실습서버를 구축해줘야할 일이 있었다. 서버 구축이야 수십번 이상 해왔으니 어려운 일은 아니지만, 이제 막 리눅스 서버를 처음 접해보고 멘붕할 후배들을 위해 간단한 motd (message of the day)를 매우 간단하고 허접한 스크립트로 짜놓았다. 

 고전적으로 motd는 /etc/motd 파일을 수정해서 만들었지만(라고 학교에서 배웠지만) 우분투의 경우 14.04 부터 구조가 꽤 많이 변경되었더라. /etc/update-motd.d/ 하위에 여러 스크립트가 있는데 조건에 따라 특정 스크립트를 motd로 보여주거나 안보여주거나 하는 듯하다. 이 친구들을 컨트롤 하는 데몬은 찾지 않았지만 분명 구글링 했을 때 영문으로 관련 자료가 있었던 듯 하다.

 아아. 복잡한 건 질색이다. 저걸 파헤쳐서 습득할 시간이 부족하니 간단하게 /etc/motd.sh를 만들고 /etc/profile에서 실행시키기로 결정했다. motd 실행 구조가 변경되었어도 /etc/motd로 파일을 생성하면 로그인 후 화면에 출력은 된다. 하지만 일반적인 motd 파일의 경우 쉘 스크립트로 실행되지 않는다.

$ sudo vi /etc/motd.sh

확인 배포판 : Ubuntu 16.04 LTS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
# Shell Script by Yowu (uyu423@gmail.com / Yu Yongwoo, CSIE '10
publicIP=`wget http://ipecho.net/plain -- -q ; echo 2> /dev/null`
TotalPMem=`free -| grep -v total | grep -v Swap | awk '{print $2}'`
UsingPMem=`free -| grep -v total | grep -v Swap | awk '{print $3}'`
UsingPMemPer=`expr \( ${UsingPMem} \* 100 \/ ${TotalPMem} \)`
TotalVMem=`free -| grep -v total | grep -v Mem | awk '{print $2}'`
UsingVMem=`free -| grep -v total | grep -v Mem | awk '{print $3}'`
UsingVMemPer=`expr \( ${UsingVMem} \* 100 \/ ${TotalVMem} \)`
TotalHDD=`df -| grep sda1 | awk '{print $2}'`
UsingHDD=`df -| grep sda1 | awk '{print $3}'`
UsingHDDPer=`df -| grep sda1 | awk '{print $5}'`
 
#color
NONE='\033[0m'
RED=`tput setaf 1`
GREEN=`tput setaf 2`
YELLOW=`tput setaf 3`
BLUE=`tput setaf 4`
MAGENTA=`tput setaf 5`
CYAN=`tput setaf 6`
 
echo "=================================================================================="
echo "||                                        ||"
printf "||    가톨릭대학교 ${MAGENTA}컴퓨터정보공학부 학회 F.A.N${NONE} 의 ${GREEN}학생용 실습 서버${NONE}입니다.    ||\n"
echo "||                                        ||"
printf "||    = ${CYAN}작업 환경${NONE} =                                ||\n"
echo "||        배포판 정보    : Ubuntu 16.04 LTS (64 bit)            ||"
echo "||        커널 정보    : `uname -r`                ||"
echo "||        메모리 사용량    : ${UsingPMem}M / ${TotalPMem}M (${UsingPMemPer}%)                ||"
echo "||        SWAP 사용량    : ${UsingVMem}M / ${TotalVMem}M (${UsingVMemPer}%)                ||"
echo "||        HDD 사용량    : ${UsingHDD} / ${TotalHDD} (${UsingHDDPer})                ||"
echo "||                                        ||"
printf "||    = ${CYAN}기타 정보${NONE} =                                ||\n"
echo "||        마지막 재부팅     : `uptime -s`                ||"
echo "||        공인 IP     : ${publicIP}                ||"
echo "||        gcc 버전    : `gcc --version | grep gcc | awk '{ print $4 }'`                        ||"
echo "||        javac 버전     : 9-internal                    ||"
echo "||                                        ||"
printf "||    * 실습에 필요한 패키지가 설치되지 않은 경우 임원진에게 알려주세요.    ||\n"
printf "||    * ${YELLOW}메모리, HDD 사용량이 90%% 이상이면 FAN 임원진에게 알려주세요.${NONE}        ||\n"
echo "||    * 시스템 자동 업데이트    : 매주 토요일 새벽 3시                ||"
echo "||                                        ||"
printf "||                        ${BLUE}last modified : 160330-yowu${NONE}    ||\n"
echo "||                                        ||"
echo "=================================================================================="
cs

(아무래도 복붙하다보니 탭 size가 깨졌다; 하지만 출력은 이쁘게 된다.)


 크게 세부분으로 나누어 3~12 line은 정보 출력에 필요한 기본 변수를 선언한 것들, 15~21 line은 텍스트에 컬러를 입히기 위한 변수들, 실제 출력은 23 line부터 이루어졌다. 파이프를 통해 사용된 grep과 awk 명령어에 대해서는 인터넷에 관련 자료가 많으니 참고하면 될듯하다. 이번에 텍스트에 컬러입히는 것을 처음 해봤는데 내가 찾은 방법으로는 tput 명령어를 사용해 콘솔의 표준출력을 ANSI 색상으로 변경하는 것으로 printf 로 밖에 색이 입혀지지 않았다. (이것에 대해 좀 더 자세히 아시는 분은 댓글 부탁드립니다 ㅜㅜ) 필요한 기능 추가하고, 본인 환경에 맞게 적절히 수정하여 사용하면 되겠다. 아마 배포판이 다를 경우 명령어의 출력 형식이 아예 다른 경우가 있어 배포판이 다를 경우 꽤 많이 수정해야할지도...

 javac 버전을 스트링을 박은 이유는 javac, python 과 같은 친구들은 javac -version과 같은 명령어로 버전 정보를 뽑아내도 변수에 들어가는게 아니라 바로 표준 출력으로 튀어나와버리더라. 아마 javac의 경우 java 코드가 바로 실행되어서 표준 출력으로 나타는 듯하고 python의 경우도 비슷하지 않나 싶다. (이 문제를 해결할 수 있는 분은 댓글 부탁드립니다 ㅜㅜ)

 /etc 디렉토리 하위에 만든 motd.sh는 로그인 후 자동으로 실행되지 않아 /etc/profile에 다음 한 줄(41 line)을 추가해주었다.

$ sudo vi /etc/profile

32
33
34
35
36
37
38
39
40
41
if [ -/etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi
 
/etc/motd.sh
cs


마무리.

 아무래도 꼼수를 써서 쉘 스크립트 형태의 motd를 갈제 실행시키다 보니 제약사항이 있다. 우선 본 쉘 기반이 아닌 쉘에 대해서는 적용되지 않는다. 배쉬 쉘(bash)와 본 쉘(sh)에는 적용되는 걸 확인. /etc/profile이 본 쉘에서 파생된 쉘 친구들에게만 적용되다보니 발생한 문제로 추측한다. 개인적으로 zsh을 사용하는데 zsh로는 로그인하니 보이지 않더라... 굳이 zsh과 기타 등등 안되는 쉘에 적용하기 위해서는 각 쉘의 설정 파일 (ex. ~/.zshrc)에 /etc/profile에 추가한 구문을 추가하면 될 듯하다. 하지만 사실 실습용으로 사용하는 학생들은 대부분(아니 사실 거의 모두라고 생각함) bash를 사용할 것이라 생각하므로 그냥 진행했다. 정석대로 하려면 /etc/update-motd.d를 파보는 수 밖에...


저작자 표시 비영리 변경 금지
신고
프로필사진

Yowu (Yu Yongwoo)

My MBTI type is ENTP. (Of course I do not believe it 100%, but I want to do that) I use Node.js to develop the backend. I use Ubuntu Linux as my development environment, and I love Vim. I am interested in open source and are keen to contribute. I have a bachelor's degree in computer science from Catholic University and now a software engineer at Plating Inc., I spent about 5 years developing and learning, and I am still interested in software development and culture. Recently, I am interested in React, Serverless structure, Domain Design Driven. Sometimes I play drums in the band.