리눅스의 장수한 배포판 중 하나인 데비안(Debian)에서 패키지 관리 툴로 사용하는 apt 사용법에 대해 알아봅시다.

참고로 ‘데비안(Debian)’ 이란 이름은 1993년 배포판을 만든 비운의 프로그래머 이안 머독(Ian Murdock: 2015년 42세로 사망)의 ‘ian’과 프로젝트 시작 당시 그의 여자친구인 데브라 린(Debra Lynn)의 ‘Deb’를 합쳐서 만들었답니다.

이안은 여자 친구와 1993년 결혼했고 2008년 이혼했다고 하니 여자친구 -> 前 여자친구(現 와이프) -> 前 와이프 순을 밟았네요

‘데비안’이란 이름이 헤르만 헤세(출판시 작가명 ‘에밀 싱클레어’)의 소설 데미안(Demian)과 간혹 헷갈리는데 전혀 상관없습니다.


리눅스 파일 캐릭터셋 포스팅(http://www.erider.co.kr/125)에서 잠시 언급했던 패키지 관리자중 apt 사용법에 대해 알아 보려고 합니다.

리눅스/유닉스의 주요 패키지 관리자를 다시 한번 소개하면 다음과 같습니다.

데비안 : apt-get (Advanced Packaging Tool)
페도라(redhat 계열, CentOS) : yum, rpm
아치 리눅스 : pacman
MAC OS : homebrew, MacPorts



apt는 Advanced Packaging Tool의 약자입니다.
이름만 들어도 패키지 매니저 툴이라는걸 알 수 있죠

apt의 패키지 목록은 인터넷에 있는 리포지토리(repository, 저장소)에 저장되어 있는데 여기서 파일을 가져오거나 검색할 수 있습니다.


 

 

 

패키지 리스트의 최신 정보를 내 pc로 가져오는 명령이 있습니다.

sudo apt-get update 

입니다.


 

 

 

대부분 패키지 파일을 설치하기 전에 그런 패키지가 있는지 검색을 해보는데
이때 사용하는 명령이 apt-cache 입니다.

Mysql 과 관련된 패키지를 검색해보고 싶으면

apt-cache search mysql

을 입력하면 됩니다.

 

 

 

 

원하는 패키지명을 찾았다면 다면 이제 설치를 해보도록 합시다.
‘mysql’ 이라는 패키지명을 찾았고 이를 설치하려면

sudo apt-get install mysql

을 입력하면 된다.

패키지의 설치는 슈퍼유저만 가능하기에 sudo 명령으로 슈퍼유저 권한으로 실행한다.
혹시 패키지 설치 중 종속성과 관련된 사항은 패키지 관리자가 알아서 설치해준다. 그래서 패키지 매니저를 사용하는 이유이기도 하다.

 


 

한번에 여러 패키지를 설치하고 싶을 때는 한칸 띄우고 계속 적으면 됩니다.

sudo apt-get install mysql php apache

이런 식으로 적으면 됩니다.



 

설치한 패키지를 삭제하고 싶을 때는 어떻게 할까요?

sudo apt-get remove mysql

이라고 하면 된다.


 

 

그런데 삭제와 관련 명령이 하나 더 있습니다.

sudo apt-get purge mysql

라는 것입니다.


 

remove와 purge의 차이설정 파일을 같이 제거할 것인가 안 할 것인가의 차이다.
Remove는 설정파일을 남겨두고 purge는 모든 것을 깨끗이 삭제한다.

 


 

필요없는 파일을 알아서 삭제해주는 명령도 있습니다.

sudo apt-get autoclean

을 하면 더 이상 필요없는 파일들을 삭제한다.

 


 

가끔 종속성이 바뀌어 더 이상 필요없는 패키지를 제거하는 명령도 있습니다.

sudo apt-get autoremove

명령이다.

 


 

이미 설치된 패키지들이 버전업이 되었을 때 이를 한번에 버전을 올리는 명령도 있습니다.

sudo apt-get upgrade

입니다.

 


 

그렇다면 나는 특정 패키지만 버전을 올리겠다 할 경우는 어떻게 할까요?

sudo apt-get install mysql

입니다.


 

처음 설치하는 명령과 동일하죠?
버전업이 되었으면 재설치하고 이미 최신 버전이면 업그레이드 할 필요가 없다고 하고 종료됩니다.



 

그리고 컴파일 설치 시 특정 파일이 필요한데 이 파일이 어떤 패키지에 들어 있는지 몰라 패키지를 설치할 수 없을 때 파일을 찾을 수 있는 있는 apt-file 명령도 있습니다.

 


Apt-file 을 사용하기 위해서 별도로 설치를 해야 한다.

sudo apt-get install apt-file

로 패키지를 설치한다.



 

sudo apt-file update

저장소를 업데이트 한다.



 

apt-file -l search evince

로 파일이 어느 패키지에 있는지 검색하여 설치하면 된다. (sudo 가 안 붙은 이유는 일반 검색은 슈퍼유저 권한이 필요없기 때문이다)



 

이중 내가 설치하지 않은 목록을 보고 싶으면

apt-file list evince

를 입력하면 된다.


 

리눅스, 유닉스에서는 명령어 사용법에 대해 모를 때는 ‘man 명령어’를 입력하면 아주 자세한 설명과 함께 사용법을 알 수 있습니다. 단, 영어로 너무 자세히 나와서 읽기 싫어지는 것이 문제죠.
이럴때는 ‘명령어 -h’ 또는 ‘명령어 -help’ 또는 ‘명령어 --help’ 정도 입력해보면 간단한 사용법과 옵션 설명을 볼 수 있습니다.


패키지 관리 그렇게 어렵지 않죠?
윈도우에서 클릭하는 것에 비하면 조금 어렵게 느껴지지만 몇 번 해보면 어렵지 않습니다.

검색엔진에 'curl'을 입력했더니 '컬'에 대해서 많이 나옵니다만,

프로그램에서 말하는것은 'C URL(시 유알엘: Client Uniform Resource Locator)' 입니다.


한마디로 표현하면 '인터넷으로 접근 가능한 주소에서 데이터를 보내고 받는 것' 입니다.


특징으로

- open software이고 commad line tool 또는 libCURL을 이용 할 수 있습니다.

- LinuxWindow에서 사용 가능합니다.

- 모든 브라우저에서 사용 가능합니다.

- 다음 프로토콜을 지원합니다. 

   FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE

-  뿐만아니라 

   SSL, HTTP POST, HTTP PUT, FTP uploading, 

   HTTP form기반의 upload, proxies, cookies, user+password 인증도 제공합니다.


이라이더의 주 사용 용도는 웹페이지를 가져와서 가공하여 필요한 데이터만 추출하는 용도와 반대로 웹페이지에 GET/POST 방식의 데이터를 보내는 용도로 사용하고 있습니다.

그외 ftp로 파일도 전송할 수 있고 쿠키로 로그인도 처리할 수 있고 셀에서 못하는게 없습니다.


curl 옵션을 살펴 볼까요


curl -X POST -H "header..." -H "header..." -d "data..." http://www.example.com/curl/test 


옵션 설명

-X : 사용할 Method (Ex: GET, POST)

-H : 전송시 헤더 (EX: -H "Content-Type: application/json")
      여러개의 헤더가 필요 할때에는 헤더 하나당 -H 옵션 하나씩 붙여서 전송.

-d : body에 들어갈 데이터 추가하는 부분

마지막으로 보내야 할 곳의 url


ex) 실제 명령어

curl -X POST -H "header..." -H "header..." -d "{\"uid\"=\"test\"}" http://www.ttmart.co.kr/curl/test


HTTP 요청(GET)

curl http://ttmart.co.kr/


HTTP 요청(POST)

curl -X POST -d "<data>" http://ttmart.co.kr

curl -X POST -d "{\"uid\"=\"test\"}" http://www.ttmart.co.kr


한글일 때는 urlencode 하여 전송

curl -X POST -d "uid=%C6%BC%C6%BC%B8%B6%C6%AE&password=test"}" http://www.ttmart.co.kr


urlencode 하기 싫으면 --data-urlencode 옵션 사용

curl --data-urlencode "id=티티마트" http://ttmart.co.kr


HTTP authentication

curl -u <id>:<password> http://www.panlab.co.kr/


파일 전송(POST)

curl -X POST -d@<filename> http://www.panlab.co.kr/post


PUT

curl --upload-file uploadfile.zip http://www.panlab.co.kr/post


JSON 전송

curl -X POST http://www.panlab.co.kr/json/ -d@eridercokr.json -H "Content-Type: application/json"


모든 과정을 파일(eridercokr_dump.txt)로 저장하고 싶을 때

curl --trace-ascii eridercokr_dump.txt http://www.panlab.co.kr


여기에 올리는 글을 초보자를 위한 자세한 설명이 아니라 자주 사용하는 명령을 간략하게 적어 놓은 것이다.

별도의 설명이 없는 한 배포판은 CentOS를 기초로 하고 있다. 자세한 설명이나 사용법은 리눅스 책이나 다른 블로그 포스팅을 참조하기 바란다.


리눅스는 기본적으로 명령어 뒤에 각종 옵션들을 붙이다보니 긴 명령문이 되어 버린다.

그래서 윈도우즈나 맥OS 같은 GUI 환경에서 작업하는게 부러울 때는 리눅스에 그놈(GNOME: GNU Network Object Model Environment)을 사용하기도 한다.

그런데 그놈(욕이 아니라 이름이다)에 익숙하지 않아서 그런지 느리고 할 수 있는게 제한적이라 답답하다.

그래서 요즘은 처음부터 리눅스의 한 종류인 유분투(Ubuntu)를 설치하는 사용자가 많아 지고 있다.


'유분투'는 컴퓨터 OS의 이름이기도 하지만 

남아프리카 반투어에서 유래된 말로 '네가 있어 내가 있다' 또는 '함께 있어 내가 있다' 라는 뜻이지만

'사람들간의 관계와 헌신을 강조한 전통적 사상으로 평화운동의 사상적 뿌리'이기도 하다.

워낙 많은 의미가 함축되어 있는 말이라 딱 한마디로 정의하기가 힘든 심오한 뜻으로 '故 넬슨 만델라 대통령'이 자주 강조한 말이기도 하다.


다시 원점으로 돌아와서 리눅스에서 환경설정을 약간의 GUI(GUI라 부르기 민망하지만)로 할 수 있는 명령이 있다. 

system-config-securitylevel


그런데 리눅스는 어디까지나 명령어를 직접 치는 맛에 사용한다.


이제 방화벽(firewall)으로 많이 사용하는 iptables 사용법을 알아 보자.


설치

yum -y install iptables

chkconfig iptables on


시작

service iptables start


centos에 기본 설치 했을 때 설치 경로입니다.

/etc/sysconfig/iptables


당연한 얘기겠지만 실치 경로는 리눅스 배포판과 소스 설치 시 옵션과 rpm, yum 등 패키지 툴에 따라 다릅니다.

그런 변수는 설치한 분들이 더 잘 알테니 무시하고 기본 설치 시만 얘기하도록 하겠습니다.


설정은 두가지 방법이 있습니다.

1) iptables 명령으로 직접 설정하고 저장하는 방법과

2) 설정파일을 열어서 편집하는 방법입니다.


1) 설정 명령 후 저장

룰 추가

iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8020 -j ACCEPT


저장 및 적용

/etc/init.d/iptables save 

/etc/init.d/iptables restart


확인

/etc/init.d/iptables -L -n



2) 설정 파일을 열어서 편집하는 방법은 다음처럼 하면 됩니다.

파일 편집 후 저장

vi /etc/sysconfig/iptables-config


적용

/etc/init.d/iptables restart



힘들게 설정한 것을 백업해야 해둬야겠죠. 

백업 명령

iptables-save > 백업할파일명


설정을 백업 했으면 복구도 해야겠죠. 

복구 명령

iptables-restore < 백업한파일명


iptables 확인 옵션


iptables -L : 리스트 확인

iptables -n : PORT를 이름이 아닌 숫자로 표현

iptables -v : 자세한 출력(인터페이스 장비도 출력됨)


설정파일을 편집해서 방화벽의 특정 포트를 오픈해보도록 하겠습니다.

오픈할 포트는 개발 서버에서 많이 사용하는 21(FTP), 22(SSH), 80(WEB), 8080(WEB), 139(Netbios), 443(ssl), 445(smb), 3306(MySql), 3690(svn) 입니다.



vi /etc/sysconfig/iptables

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 139 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited


주의 : 방화벽 설정은 순서대로 적용 되니 꼭 reject 이전에 accept 가 와야 합니다.


설정 파일을 저장했으면 방화벽 다시 시작해야겠죠.

/etc/init.d/iptables restart 


우리는 이메일을 읽을 때 대부분 PC에 메일 클라이언트 프로그램을 설치해 이용한다.  이를 메일 사용자 에이전트 (MUA: Mail User Agent)라고 부른다.

이라이더는 회사 PC에서는 MS의 오피스에 같이 들어 있는 상용 프로그램인 '아웃룩 (outlook)' 을 이용한다.  무료 프로그램인 '아웃룩 익스프레스 (outlook Express)' 와는 다른 프로그램이다. 

개인적으로는 노트북인 맥북 프로에서 맥OS에 포함되어 있는 'mail' 프로그램을 이용하지만 발송인 부분에 한글 인코딩 버그가 좀 있어 적당히 무시하고 본다.


아웃룩은 이메일 읽기 뿐만 아니라 간단한 에디터를 통해 메일을 쉽게 써서 발송할 수 있고 메일 서버로 MS의 익스체인지 서버(Exchange server) 를 사용하면 일정 관리를 할 수 있을 뿐만 아니라 푸시 서비스(스마트폰에서는 실시간으로 푸시가 오기 때문에 강력하다)도 받을 수 있다.


이런 익스체인지 서버와 아웃룩을 구입하려면 비용이 많이 들기에 어느정도 규모가 있는 회사에서나 사용하지 개인이 사용하기에는 무리가 있다.

그래서 개인들은 주로 네이버나 다음(한메일) 같은 무료로 계정을 주면서 웹으로 접근하여 확인하는 웹메일 서비스를 사용할 것이다.  무료이지만 기능은 막강하다.


시대가 변하고 모바일 기기가 발전하면 간단한 이메일 읽기, 쓰기는 PC에서 스마트폰으로 넘어 가면서 스마트폰 OS에 기본 탑재되어 있는 '메일' 앱을 많이 사용한다.  그런데 메일 서버로 exchange server를 사용한다면 푸시(push) 기능을 제대로 지원해주는 MS의 'outlook' 앱을 사용할 것이다. (참고로 '아웃룩'은 PC 버전은 유료, 스마트폰 버전은 안드로이드, 아이폰 상관없이 무료이다)



이렇게 편한 프로그램들을 두고 개발자라면 가끔 서버에 접속해서 메일을 확인해야 할 때가 발생한다.

이럴때 메일을 확인하는 명령을 알아보도록 하자.

메일 접속 명령어

mail -u 메일계정


접속에 성공 했다면 프롬프트에서 다음 명령을 입력하여 원하는 작업을 진행하면 된다.


t 메일번호 : 메일 읽기


h : 메세지 리스트 출력

h : 메일박스 첫 리스트 출력

h 2 : 2번부터 출력


n : 다음 메일


e 메일번호 : ex명령 모드로 메일 편집


f 메일번호 : 지정된 리스트 출력

f 1-3


d 메일번호 : 메일 삭제

d 1-3


s 메일번호 : 지정된 메일을 파일로 저장

s 1 mail.txt


u 메일번호 : 삭제된 메일 복구

u 1 : (q를 실행하기 전까지 가능)


R 메일번호 : 해당 번호 메일 보낸 사람에게 담방 메일 보내기


r 메일번호 : 지정된 메일에 대해 모든 참조자를 포함하여 답변 보냄


pre 메일번호 : make messages go back to /usr/spool/mail


m 유저 리스트 : 원하는 유저에게 메일을 보냄


q : mail 모드에서 모든 상태를 저장후 종료

mail 모드에서 한번 읽었던 메일은 q명령으로 빠져나갈 경우 메일박스에서 삭제되고 mbox 파일로 저장됨


x : mail 초기 상태로 돌려 놓고 나감


! : 쉘 명령을 실행

!pwd : pwd 명령을 실행


cd 디렉토리 : 디렉토리 이동


 

리눅스에서 파일 캐릭터셋을 확인해야 할때가 있죠
file --mime-encoding 파일명

예)
file  --mime-encoding test_erider.co.kr.php
test_erider.co.kr.php: utf-8

 

파일의 character set 을 변경해야 할때가 있죠.
이렇때 iconv 를 사용합니다.

당연한 얘기지만 iconv 가 설치되어 있어야 실행이 되겠죠.
설치가 안되어 있다면 소스 설치도 좋지만 리눅스 배포판에 맞는 rpm, yum 등의 패키지 관리자를 사용하는게 편합니다.

배포판별 주요 패키지 매니저 (사용법은 조금씩 다르지만 기본 모토는 동일하다)


데비안 : apt-get (Advanced Packaging Tool)

페도라(redhat 계열, CentOS) : yum, rpm

아치 리눅스 : pacman

MAC OS : homebrew, MacPorts


유닉스를 사용하는 매킨토시는 MacPorts 를 쓰다가 요즘은 homebrew 패키지 관리자를 많이 사용합니다.

패키지 관리자 사용법은 간단하니 각자 자신에게 맞는 것을 익혀두기 바랍니다.


 

사용법
iconv [<옵션> ...] [<파일> ...]
옵션
-f 인코딩 이름, --from-code=<인코딩 이름> : 원 문서 인코딩 형식
-t 인코딩 이름, --to-code=<인코딩 이름> : 출력 인코딩 형식

-l, --list : 알려진 모든 문자셋 코드를 열거
-c : 출력에서 잘못된 문자를 제외합니다.
-o, --output=FILE : 출력 파일
-s, --silent : 경고를 표시하지 않음
 --verbose : 진행 정보를 상세히 표시
-?, --help : 도움말 리스트를 표시
--usage : 간락한 사용법을 표시
-V, --version : 프로그램 버전 표시

 

utf8 형식의 텍스트 파일을 euckr로 변경시
iconv -f UTF-8 -t eucKR test_utf8.php > test_euckr.php

 

파일의 charset 변환을 위해 iconv 를 사용한다고 했죠.
그런데 txt 파일이 한개가 아니고 여러개일때 일일이 파일명을 적을 수는 없겠죠
이럴때 다음과 같이 쉘스크립트로 처리하여 한번에 변경 합니다.

#!/bin/bash
for f in *.txt; do
  echo $f
  iconv -c -f cp949 -t utf-8 $f -o 1$f
done

 

iconv 가 캐릭터셋 변경에 만능이것 같지만, 간혹 iconv 버전에 따라 변환이 불가능한 문자를 무시하라고 해도 아무련 경고도 없이 변환 불가능한 문자 이전까지 변환되는 문제가 발생하기도 합니다.

그러니 특수한 문자가 많이 들어가 있다면 iconv 로 변환 후 꼭 이상이 없는지 확인을 해볼것을 권합니다.

리눅스의 명령어 자주 안쓰다보니 옵션을 까먹을 때가 많아서 적어 둡니다.


find 명령으로 특정 경로 하위 디렉토리에서 파일 찾기


find /경로 -type f -exec grep '찾을파일이름' {} /dev/null \;

예) find /home -type f -exec grep 'erider.co.kr.gzip' {} /dev/null \;


locate 명령으로 파일 찾기


find /경로 -type f -exec grep '찾을파일이름' {} /dev/null \;

예) find /home -type f -exec grep 'erider.co.kr.gzip' {} /dev/null \;


간단한 파일 용량과 디렉토리 개수와 파일 개수를 알아보는 명령어 입니다.

현재 경로부터 하위 디렉터리까지의 파일 용량을 표시

$ du -hs 


현재 디렉터리 내의 디렉터리 개수

$ ls -l | grep ^d | wc -l 


현재 디렉터리 내의 파일 개수

$ ls -l | grep ^- | wc -l 


참고로 하위 디렉터리를 포함하려면 ls -Rl 옵션을 이용하면 됩니다. 


+ Recent posts