ifconfig 명령어와 해당 내용에 대해서 간략하게 알아보자


환경 및 선수조건

  • Linux
  • Bash shell(/bin/bash)


ifconfig 명령어

ifconfig란?

  • ifconfig : 네트워크 인터페이스 관련 정보를 조회 및 수정 할 수 있는 명령어입니다.
  • ifconfig : configure a network interface
  • 최근에는 ifconfig를 사용하기 보다 ip(ip addr, ip route 등등)명령어를 쓰는 방향을 권고하고 있습니다.

ifconfig 예시

  • 아래는 제가 생성한 VM에서 ifconfig의 출력결과 입니다.
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:45:44:cc
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe45:44cc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:47029 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19859 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:38132227 (38.1 MB)  TX bytes:2166799 (2.1 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2255 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2255 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:223063 (223.0 KB)  TX bytes:223063 (223.0 KB)


ifconfig 항목 설명

eth0, lo …

  • Network Interface들의 이름으로 여기에는 NIC, Bridge, Tap Interface 그리고 Tunneling Interface와 같은 부분들의 이름이 표시됩니다.
  • 전송을 할 때 캡슐화 되는 방식을 의미합니다. 즉, 해당 인터페이스로 보내지는 패킷의 종류라고 생각하면 될거 같습니다. Ethernet의 경우에는 이더넷 프레임으로 캡슐화 되어서 보내진다는 것이며 해당 캡슐화 종류를 통해 인터페이스의 종류도 유추가 가능합니다(위의 경우에는 eth0는 Ethernet이구나).

HWaddr

  • Layer2에서 사용하는 하드웨어 주소로 일반적으로 아는 MAC주소로 되어있습니다.

inet addr, inet6 addr

  • 각각 IP주소를 나타내며 inet addr는 IPv4의 주소이고 inet6 addr는 IPv6의 주소입니다. inet6 addr에서 뒤에 표시된 /는 CIDR을 의미합니다.

Bcast

  • Broadcast를 요청을 날릴 주소입니다.

Mask

  • Network Mask(Subnet Mask)의 형식입니다.

Scope

  • 해당 인터페이스가 어느 수준에서 접근가능하며 유효하냐는 의미이다. Global의 경우 외부 네트워크에서 접근이 가능한 범위이며(클라우드에서 호스팅한 인스턴스에 들어가면 Global로 나와있는 경우가 있다.) Link의 경우 현재 인터페이스가 속한 LAN안에서만 접근이 가능하고 유효하며 Host의 경우는 현재 인터페이스가 속해있는 호스트에서만 유효하고 접근이 가능하다.

UP

  • 네트워크 인터페이스가 켜져있음을 의미합니다. 켤 때는 ifconfig [네트워크 인터페이스 이름] up를 사용하고 끌 때는 ifconfig [네트워크 인터페이스 이름] down를 사용합니다.

BROADCAST

  • 브로드캐스트 패킷을 처리할 수 있음을 의미하며 해당 기능을 통해 DHCP 서버로부터 IP주소를 받을 수 있습니다.

RUNNING

  • 네트워크 인터페이스가 정상 작동하며 트래픽(TX 및 RX)이 발생할 수 있음을 의미합니다.

MULTICAST

  • 멀티캐스트 패킷을 처리할 수 있음을 의미합니다.

MTU

  • 해당 프로토콜이 해당 레이어에서 전송할 수 있는 최대의 단위(바이트)로 이더넷의 기본값은 1500으로 설정됩니다.

Metric

  • 우선순위를 나타내는 항목으로 0의 값부터 증가하면서 하나씩 사용할 수 있으며 낮을수록 우선순위가 높습니다. 라우팅을 할 때 여러 인터페이스 카드가 있다면 Metric이 낮은 인터페이스 카드로 라우팅을 하게 됩니다.

TX, RX

  • 보내고 받은 데이터에서 packets,errors,dropped, overruns에 해당하는 패킷의 수를 의미합니다.

TX, RX packets

  • 인터페이스를 통해 보내고 받은 패킷의 수를 의미합니다.

TX, RX errors

  • 보내고 받을 때 생성되는 오류 패킷의 총 양을 의미합니다.

TX, RX dropped

  • 여러 이유로(이 부분에 여러 이유가 있다고 합니다.) 보내고 받는 중에 버려진 패킷의 수를 의미합니다.

TX, RX overruns

  • 보내고 받는 버퍼에 overflow가 나서 추가하지 못한 패킷의 수를 의미합니다.

RX frame

  • 프레임 구조에 맞지 않은 패킷의 수를 의미합니다. 8bit로 프레임이 구성되어 있다고 가정했을 때(가정입니다.) 이러한 프레임의 구조가 틀리거나 다를 때 버려지는 패킷의 수를 의미합니다.

TX carrier

  • 신호 진폭(Signal Modulation)에 오류가 있는 패킷의 수를 의미합니다. 자세한 의미는 모르겠으나 전송할 때 신호 관련해서 생기는 오류로 예상되며 찾아보면 Half Duplex와 연관이 있다고 합니다.

txqueuelen

  • Transmission queue의 크기를 의미합니다.

collisions

  • 네트워킹에서 패킷 충돌이 일어난 패킷의 수를 의미하며 정상적이라면 0이어야 합니다.

TX bytes, RX bytes

  • 보내고 받은 데이터의 총 크기를 의미합니다.


참고자료

Read JSON file and parse it to dictionary type data in python


Environment and Prerequisite

  • Python(3.X)


Parse json file using with statement and json module

  • Easily parse json file contents to dictionary by using with statement and json module
import json # import json module

# with statement
with open('json file path or name') as json_file:
    json_data = json.load(json_file)

    ...


Examples

example.json

{
    "json_string" : "string_example",
    "json_number" : 100,
    "json_array" : [1, 2, 3, 4, 5],
    "json_object" : { "name":"John", "age":30},
    "json_bool" : true
}


example.py

import json

# open file using with statement
# assume json file is in same directory

with open('example.json') as json_file:
    json_data = json.load(json_file)

    # String
    # Get string type data
    # Key is json_string
    json_string = json_data["json_string"]
    print(json_string)

    # Numeric
    # Get numeric type data
    # Key is json_number
    json_number = json_data["json_number"]
    print(str(json_number)) # 숫자이기 때문에 str()함수를 이용

    # Array
    # Get array type data
    # Key is json_array
    json_array = json_data["json_array"]
    print(json_array)

    # Ojbect
    # Get object type data
    # Key is json_object
    # Default type is dictionary
    # You need to serialize it if you need python object (additional code needed)
    json_object = json_data["json_object"]
    print(json_object)

    # Bool
    # Get bool type data
    # Key is json_bool
    json_bool = json_data["json_bool"]
    print(json_bool)


Reference

MailReminder 프로젝트 개발기


목차


회고

  • 리눅스 기본 crontab을 이용해서 특정 시간에 원하는 코드가 실행되도록 만들었으며 그 코드가 실행되면 내 구글계정을 이용해 원하는 메일에 메일을 보내도록 해놓았다.


목표

  • 저번에는 도장에 가는 일정만 추가했는데 이번에는 사내 근골격 센터를 예약하는 작업을 추가해보려 한다.
  • 매주 있는게 아니기 때문에 필요할 때 알림기능을 on/off를 하고 싶다.
  • 도장 알림 같은 경우에는 매달 특정한 시간에 알림이 오도록하고 근골격 센터 예약은 알림을 등록하고 1달 후에 알림이 오게 하고 싶다.(결국, 이 부분을 crontab을 이용했기 때문에 하지 못했다…)


환경 및 구조

on/off의 기능

  • on/off의 기능은 shell script를 실행해서 crontab의 내용을 수정하도록 하려고 한다.
  • jupyter notebook을 통해서 원격으로 접속해서 쉘을 실행할 수 있기 때문에 쉘 스크립트의 실행을 통해 on/off 기능을 구현하려 한다.
  • 간단하게 보면 파일이 on_smc_physiotherapy.sh라는 파일이 있고 이걸 실행하면 crontab의 내용을 변경하는 방식이라 볼 수 있다.


방법 설명

  • crontab에 근골격 센터의 일정 알림을 추가하는 방법은 아래와 같다.
  • 시작할 때 PATH를 프로젝트 폴더로 잡아주고 일정이 이미 추가되어있는 smc_on_in_text 파일의 내용을 crontab에 입력으로 넣어주었다.

on_smc_physiotherapy.sh

#/bin/bash

cd /home/twpower/MailReminder
crontab smc_on_in_text

smc_on_in_text

...
# 환경 변수들 목록 쫘르륵
...

0 10 17 * * python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt
50 10 * * 3 python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt


코드 구현

  • 메일을 보내는 reminder.py는 저번과 같다.
  • off_smc_physiotherapy.sh, on_smc_physiotherapy.sh, smc_off_in_text, smc_on_in_text이 추가되었다.


메인 구현 부분

off_smc_physiotherapy.sh

#/bin/bash

cd /home/twpower/MailReminder
crontab smc_off_in_text

on_smc_physiotherapy.sh

#/bin/bash

cd /home/twpower/MailReminder
crontab smc_on_in_text

smc_off_in_text

...
# 환경 변수들 목록 쫘르륵
...

0 10 17 * * python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt

smc_on_in_text

...
# 환경 변수들 목록 쫘르륵
...

0 10 17 * * python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt
50 10 * * 3 python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt


반성

  • 결국 생각해보니 crontab일정 주기로 반복하는 작업을 도와주는 기능이어서 내가 등록하고 나서 1달 후 특정 요일에 알람이 오도록 하는건 힘든 일이었다… 나중에 프레임워크를 쓰거나 다른 라이브러리를 알아보는 방향으로 가야할거 같다.
  • 그래서 결국 매달 수요일에 하는거로 일단 구현을 하였다.


다음 목표

  • 일단, 메일은 잘 오는걸 확인했는데 2가지 문제가 있었다..
  • 첫째, 메일이 너무 많이 와서 알림 메일이 와도 메일 알림을 닫아버리면(안드로이드의 경우) 알림이 왔는지 알 수가 없다. 결국, 애초에 의도한 기능을 제대로 하지 못한다는것!
  • 둘째, on/off하기가 너무 불편하다. UI가 있으면 좋겠다.
  • 첫째와 둘째를 모두 구현하기란 쉽지 않기 때문에… crontab과 별개로 특정 시점부터 얼마가 지난후에 알림이 올 수 있도록 하는 부분을 찾아봐서 추가해야겠다.


참고자료

cat 명령어를 통해서 여러 줄을 입력하는 방법을 알아보자

환경 및 선수조건

  • Linux
  • Bash shell(/bin/bash)


cat 명령어

  • cat : 파일들을 인자로 받아서 해당 파일들을 연결해 표준출력으로 출력합니다.
  • 간단히 말해 들어오는 파일명들의 파일 내용을 쉘 화면에 출력해주는 명령어입니다.


예시 및 사용법

  • 사용법 : cat [OPTION]... [FILE]...
  • 옵션들은 아래 참고자료에 있는 링크에 가시면 볼 수 있습니다.

$ echo "Test Document" >> test.txt
$ cat test.txt # cat 명령어의 기본 사용법
Test Document


cat을 이용해 여러 줄 입력하기

  • cat 다음에 <<를 쓰고 원하는 표시자를 씁니다. 아래의 경우에는 EOF를 사용하였는데 다른 단어를 사용해도 됩니다. 단, 처음에 사용한 단어가 끝에도 같아야 합니다. 여기에 EOF를 사용했기 때문에 마지막에 입력을 끝내려면 똑같이 EOF를 입력하면됩니다.
  • 이러한 부분을 Here-Document라고 하는데 자세한 내용은 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04에 나와있습니다.

$ cat << EOF
> This
> is
> multiline test
> EOF
This
is
multiline test
$


cat을 이용해 여러 줄을 파일로 생성하기

  • Here-DocumentRedirection의 응용입니다.
  • stdin을 cat 명령어로 받고 Redirection를 통해서 파일에 stdout의 내용을 출력합니다. 어려우면 그냥 아래처럼 사용하셔도 무방합니다!!
  • 개행문자를 포함해서 파일에 쓰고 싶을 때 아래처럼 사용합니다.
  • Redirection에 관해서는 Redirect와 Pipe의 차이를 참고하세요.

$ # 아래와 같습니다
$ cat << EOF > test.txt
> This
> is
> multiline file write
> EOF
$ cat test.txt
This
is
multiline file write
$


$ # 아래와 같습니다
$ cat > test_another.txt << EOF
> Another
> multiline text to file test
> EOF
$ cat test_another.txt
Another
multiline text to file test
$


참고자료

MailReminder 프로젝트 개발기


목차


개발 시작 이유

  • MailReminder라는 이름부터 즉흥적으로 지었는데… 일을 시작하고 살다보니까 도장비 입금이나 병원 신청같은 부분을 매달 알려줬으면 좋겠는데 단순한 일이라서 캘린더에는 추가하기 싫고 메일로 알림을 받으면 좋을거 같아서 개발을 시작하게 되었다.


목표

  • 최종적으로는 어떤 모습이 될지는 모르겠으나… 내가 원하는 날짜에 알림을 신청하면 메일로 알려주는 서비스를 나를 위해 만들고 싶다.
  • 추후 모습이 바뀔수도 있고 현재 내 요구사항은 등록한 사항을 원하는 날짜에 알려주자!
  • 스스로 애자일과 린 소프트웨어 개발론을 통해 개발할 예정! 물론, 나중에 개발 방법이 어떻게 바뀔지는 모르겠지만.. 우선 만들고 싶은 한 가지의 목표를 정하고 구현하고 불편한거 개선해서 추가하고 하는 방식으로 가보자


환경 및 구조

방법 설명

  • 메일을 보내주는 부분은 python을 이용해서 작성한다.
  • 리눅스에 있는 crontab을 이용해서 원하는 날짜에 메일을 보내도록 한다.
  • 메일을 보내주는 부분은 직접 smtp 서버를 만들고 도메인에 붙일수도 있지만… 빠른 개발을 위해서 우선 Google에 계정을 만들고 해당 계정으로 메일을 보내도록 했다.(최소한으로 필요한 부분을 제외하고 다른 부분들은 다 쓸 수 있는걸 가져다가 쓰자!)
  • 잘 보내졌는지 확인하기 위해 로그를 남겼습니다.(stdout으로 나오게 하고 파일로 redirection함)


코드 구현

공통

  • 계정 정보를 저장하는 account.json의 경우에는 개인 정보이니 .gitignore에 추가했다.


메인 구현 부분

reminder.py

import smtplib
from email.mime.text import MIMEText
import json
import datetime

def sendMail(sender_email, receiver_email, app_password ,msg):
    smtp = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    print(str(datetime.datetime.now()) + " : " + "Access Success")
    smtp.login(sender_email, app_password)
    print(str(datetime.datetime.now()) + " : " + "Login Success")
    msg = MIMEText(msg)
    msg['Subject'] = '리마인더'
    smtp.sendmail(sender_email, receiver_email, msg.as_string())
    print(str(datetime.datetime.now()) + " : " + "Sending Success")
    smtp.quit()

email=""
app_password=""
with open('/home/twpower/MailReminder/account.json') as account_json_file:
    account = json.load(account_json_file)
    email = account['email']
    app_password = account['app_password']
    print(str(datetime.datetime.now()) + " : " + "Parsing Success")

# 나한테 보내는 메일 정보는 없음... 개인정보라서
sendMail(email, '', app_password, "입금 or 예약")

crontab

# 쉘은 bash를 사용했고 환경 변수들을 다 가져왔습니다.(PATH를 포함!)
# 환경 변수를 가져와야 일반적인 쉘과 환경이 같아지며 python 경우에는 사용하는 인터프리터 path 정보가 거기에 담겨 있기 때문에 가져오는게 좋습니다.(처음에 안해줘서 자꾸 오류떴던...)
...
* 10 17 * * python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt
...


다음 목표

  • 우선 사용이 잘 되면 api를 통해서 on/off를 할 수 있는 기능을 만들어보고 싶다. 필요없을 때 서버에 들어가서 끄기는 귀찮으니…


참고자료