umask - 새로운 파일이나 디렉토리에 대한 허가권 지정 명령어 - chmod와 반대로 해당 그룹 및 다른 사용자들에게 쓰기 권한을 박탈하는 것 - 일반 파일의 경우 666, 디렉토리인 경우 777에서 umask 값을 뺀 값으로 허가권 지정 - .profile, .cshrc, .bashrc, .login과 같은 사용자 프로파일에서 설정 umask 디렉토리 허가권 파일 허가권 002 775 664 007 770 660 020 757 646 070 705 604 022 755 644 모든 사용자에서 적용할 umask 값은 /etc/login.defs 에서 UMASK 값을 설정함으로써 정할 수 있다. [출처] [시스템 보안] umask를 이용한 파일 접근 권한 |작성자 햄볶ayo
Linux&Unix
- umask 2011.07.26
- 메모리 맵 - mmap(), munmap(), msync() 2011.07.26
- svn diff를 vimdiff로 보는법 2011.03.31
- kernel 2.6 initrd mount 하기 2011.03.15
- mount -o loop 옵션 2011.03.14
- ioperm / inb / outb 2011.02.22
- [펌]vim 폴딩 기억하기 2011.02.09
- [펌]vim 폴딩 2011.02.09
- [펌] ftp 명령어 2011.01.31
- FTP 접속 스크립트 예제 2011.01.28
umask
메모리 맵 - mmap(), munmap(), msync()
* 메모리 맵 - mmap() <파일 혹은 디바이스를 메모리와 대응> ; 파일(리눅스에서는 디바이스도 파일로 처리하므로 디바이스도 메모리 맵으로 연결 가능)을 처리하기 위해서는 보통 저수준으로는 파일 디스크립터 * 특징 1. 생성된 메모리 맵을 포인터를 이용하여 쉽게 사용 가능하다. 2. 파일로 연결하여 사용시 메모리-파일 사이의 동기화가 편하다. 3. IPC(프로세스간 통신)로 활용 가능하다. 4. 대용량의 데이터를 사용할 시 성능이 향상된다. * 주의점 - 메모리 맵은 바로 파일의 처리하는게 아니라 가상 메모리로 활용되는 페이지에 맵핑하는 방식이다. 그러므로 파일과 해당 메모리 맵이 된 페이지가 다른 공간이다. 그러므로 커널에 의해 여유 시간에 동기화(둘의 데이터가 같아지는..)가 될 때까지 서로 다른 데이터를 가질 수 있다. 그러므로 동기화에 대한 주의를 할 필요가 있다. <개발자가 직접 커널에 동기화를 명령 할 수 있는 함수도 있다. - fsync()> IPC로 사용 할 때에도 프로세스간 동기화에 대한 주의도 필요하다. * 2가지 방식 1. 공유 메모리 맵 방식 (Shred Memory-Map) ; 메모리 맵 변경 시 원본 파일과 데이터가 동기화가 되는 방식 2. 복사 메모리 맵 방식 (Private Memory-Map) ; 처음 메모리 맵에 매핑 될때 파일의 내용을 읽어와서 복사하고 그 이후 동기화 하지 않는 방식. * 메모리 맵 생성 함수 - mmap() void* mmap(void *state, size_t length, int prot, int flags, int fd, ott_t offset); - void *state ; 할당받기 원하는 메모리 주소. 보통 0을 써서 커널이 적합한 공간을 임의로 할당해 주소를 받을 수 있고, 직접 입력하여 사용해도된다. 하지만 직접 입력하는 경우 해당 시스템의 페이지 (배수)단위로 주소 값을 설정해줘야 한다. - size_t length ; 메모리 맵을 할 크기. 바이트 단위로 설정한다. - int prot ; 메모리 보호 메커니즘. 플래그 형식이므로 비트 연산으로 복수 속성으로 지정 가능하다. + PROT_EXEC; 해당 페이지 실행 가능. + PROT_READ; 해당 페이지 읽기 가능. + PROT_WRITE; 해당 페이지 쓰기 가능. + PROT_NONE; 해당 페이지 접근 불가. => 매핑할 파일 디스크립터와 속성이 같아야한다. - int flags + MAP_SHARED; 공유 메모리 맵 방식. + MAP_PRIVATE; 복사 메모리 맵 방식. + MAP_FIXED ; 메모리 시작 번지 지정시 사용. =>MAP_SHARED/MAP_PRIVATE 둘 중에 한개만 지정해야된다. - int fd ; 메모리 맵 방식을 사용할 파일 디스크립터.(파일 혹은 디바이스) - ott_t offset ; 해당 파일 디스크립터에서 메모리 맵을 시작할 오프셋 값. + return value ; 메모리 맵핑이 이루어진 가상 메모리 주소. 실패시 MAP_FAILED가 발생하고 errno에 해당 상황에 대한 값이 설정된다. * 메모리 맵 해제 - munmap() ; 메모리 맵을 사용하고 자원을 해제 할 때 사용한다. int munmap(void *start, size_t length); - void *start ; 메모리 맵핑이 시작된 주소. mmap()의 반환 값을 넣으면된다. - size_t length ; 메모리 맵을 한 길이. mmap() 사용시 size_t length 인자와 크기를 주면된다. + return value ;성공 0, 실패 -1 * 메모리 맵과 파일의 동기화 - fsync() ; 메모리 맵에 데이터를 갱신해도 바로 파일과 동기화가 이루어지는 것은 아니다. 커널이 여유 있을 때 동기화를 수행한다. 그러므로 개발자가 직접 동기화를 보장하고 싶을 때 사용한다. 그리고 munmap()을 하여 메모리 맵을 해제 할때에도 동기화를 해주면 데이터가 보장된다. int msync(void *start, size_t length, int flags); - void *start ; mmap()를 통해 리턴 받은 메모리 맵의 시작 주소. - size_t length ; 동기화를 할 길이. 시작 주소로 부터 길이를 지정하면 된다. - int flags + MS_ASYNC ; 비동기 방식. 동기화(Memory->File)하라는 명령만 내리고 결과에 관계 없이 바로 리턴. 그렇기 때문에 동기화가 된 건지 알수 없다. + MS_SYNC ; 동기 방식. 동기화(Memory->File)가 될때까지 블럭 상태로 대기한다. + MS_INVALIDATE ; 현재 메모리 맵을 무효화하고 파일의 데이터로 갱신. 즉 File->Memory =================================================================================== ... #define MMAP_FULENAME "test_mmap" #define MMAP_SIZE 64 ... int main() { int fd; char *p_mmap; //메모리 맵으로 사용할 데이터 타입 ... fd = open(MMAP_FILENAME, O_RDWR|O_CREAT, 0664); ... p_mmap = (char*)mmap((void*)0, MMAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); //공유 메모리 방식을 사용한다. 읽기/쓰기 가능 ... //memcpy(); 등으로 메모리 맵 데이터 갱신. ... msync(p_mmap, MAP_SIZE, MS_SYNC); ... munmap(p_mmap); return 0; } => 메모리 맵 할 파일 이름만 같으면 IPC도 된다.
svn diff를 vimdiff로 보는법
출처 : http://kldp.org/node/52160
svn diff a.c
를 하면 vimdiff로 바로 보이게 하려면.
1. 적당한 디렉토리에 vimdiff.sh를 만들고 PATH를 걸어준다
$ more ~/bin/vimdiff.sh
#!/bin/sh
while test $# -gt 2; do shift; done
vimdiff $@
2. vimdiff.sh를 실행 가능으로 만든다.
$ chmod a+x ~/bin/vimdiff.sh
3. svn 설정 파일에 diff-cmd 값을 지정한다.
$ cat ~/.subversion/config | grep diff-cmd
diff-cmd = vimdiff.sh
[출처] svn diff를 vimdiff로 바로 보는 법|작성자 파이
kernel 2.6 initrd mount 하기
mount -o loop 옵션
파일을 블럭 디바이스 처럼 엑세스 할 수 있게 해주는 가상의 장치라고 되어 있다.
ioperm / inb / outb
I/O port에 접근하기 위해 필요한 루틴들은 /usr/include/asm/io.h에 모두 포함되어 있으므로 단순히 C프로그램에서 #include 를 포함하기만 하면 된다. 다른 라이브러리는 필요없다.
그리고 gcc로 컴파일할 때 최적화 옵션(gcc -O1 혹은 그 이상)을 잊지 말아야 한다.
또한 디버깅을 위해서는 디버거 옵션(gcc -g)을 넣는 것도 중요하다.
정리하자면 컴파일할 때는 다음의 옵션을 꼭 넣는다.
% gcc -g -O2 ...
Linux에서는 어떤 port에 접근하려고 할 때 프로그램에 접근 권한을 주어야 한다.
이런 기능은 ioperm()이라는 함수에 의해서 이루어진다.
ioperm()은 unistd.h에 선언되어 있으므로 사용하려면 이를 포함해야 한다.
문법은 ioperm(from, num, turn_on)으로 from은 접근 권한을 주는 첫 번째 포트번호이고, num은 from으로부터 연속되는 포트의 갯수이다.
예를 들어, ioperm(0x300, 5, 1)이면 0x300 포트부터 0x304번 포트까지의 접근 권한을 주는 것이다.
turn_on에 Boolean으로 1을 주면 허가, 0을 주면 접근을 금지 시킨다.
ioperm이라는 함수는 프로그램이 root의 권한을 가지고 있어야 실행된다. 그리고 ioperm 에서 접근허가 된 포트라도 프로그램이 끝나면 자동적으로 접근금지가 되므로 굳이 ioperm( , ,0)을 줄 필요는 없다.
ioperm()은 0x000부터 0x3FF 까지의 포트에만 접근할 수 있게 한다.
더 높은 포트에 접근하려고 하면 iopl()이라는 함수를 사용하여야 한다.
iopl()은 모든 포트에 대한 접근허가를 단 한번에 준다.
그러므로 조심하여야 한다. 잘못된 포트로의 접근은 켬퓨터에 치명적인 문제를 일으킬 수 있다.
포트에 실질적으로 값을 쓰고 읽는 기능을 주는 함수는 inb()/outb()이다.
원하는 포트(port)에서 한 바이트(8bit)를 읽기 위해서는 inb(port)를, 쓰기 위해서는 outb(value, port)를 사용하는 데 value는 주고자 하는 값이다.
두 바이트씩 즉 16bit씩 읽고 쓰기 위해서는 inw(port)/outw(value, port)를 사용하는데, 이는 실질적으로 port로 지정한 포트와 그 다음 포트를 합쳐서 읽고 쓰는 것이다.
또한 32bit씩 읽고자 한다면 inl(port)/outl(value, port)를 사용하며 이는 지정된 port 에서 연속적으로 이어서 4포트를 한꺼번에 읽고 쓰는 것이다.
포트를 읽고 쓸 때는 근사적으로 1microsecond(백만분의 1초)가 소요된다.
또한 포트에 접근한 후에 값을 읽고 쓰는 것을 보다 확실히 하기 위해서 약간의 delay시간을 줄 수 있는 데, 이에 쓰이는 함수는 inb_p()/outb_p()와 같이 함수 끝에 _p를 붙이는 것이다.
이는 pause를 의미하며, delay시간은 io.h에 정의되어 있는 매크로를 사용하여 조종되어질 수 있고, 초기치는 약 4 microsecond 이다.
이를 바꾸는 방법은 #define REALLY_SLOW_IO (value) 이므로 이를 이용하면 된다.
그런데 이 pause시간을 정하는 매크로는 0x80포트를 통하여 이루어 지므로 이에 대한 접근권한을 주는 것을 잊지 말아야 한다.
출처 : http://gnudevel.tistory.com/33http://gnudevel.tistory.com/33
[펌]vim 폴딩 기억하기
폴딩을 걸어 놓은 상태에서 다음에 파일을 열 때도 기존에 해 놨던 폴딩을 보고 싶으면,
명령행에 :mkview을 입력해서 폴딩 상태를 저장한다.
다시 읽어오고 싶으면, :loadview을 사용해서 폴딩정보를 로드하도록 한다.
[펌]vim 폴딩
vim의ㅣ 폴딩 기능이 유용할 것 같긴 한데..
저장하고 다시 열면 접었던 것들이 다 날아가서
실제로 사용하기가 힘들었죠.
오래 헤멘 끝에 마침내 영구적으로 폴딩 기능을
사용할 수 있는 방법을 알아냈습니다.
먼저 foldmarker에 대해 아셔야 합니다.
이름 그대로 폴딩을 위한 마커입니다.
"{{{", "}}}"을 접고자 하는 라인 위 아래에 넣어줍니다.
그냥 넣으면 안되니 라인 주석으로 "//" 감싸줍니다.
-------------
//{{{ function foobar(str1, str2)
/**
* foobar
*
*/
function foobar(str1, str2)
{
}
//}}}
//{{{ function barfoo(str)
------------
이런 식으로 넣고 :set fdm=marker 하면 자동으로
{{{, }}}로 감싼 부분이 폴딩됩니다.
외국 소스를 보다보면 위와 같은 코딩 관습이 종종
발견되는데 역시 다 이유가 있는 거였더군요. :)
이번엔 보너스팁입니다.
.vimrc 에 fdm=marker를 추가하셔도 되고,
소스 파일에 vim에서만 인식되는 다음 주석을
처음이나 끝에 추가하시면 됩니다.
-----------
/*
* vim60: ts=4 sw=4 fdm=marker
*/
-----------
출처 : http://kltp.kldp.net/stories.php?story=02/11/16/6893604
[펌] ftp 명령어
ftp> ! [command] 잠시 셸로 빠져나간다. 셸을 종료하면 다시ftp로 돌아간다. ?, help ftp> ? [command-name] help 내용을 본다. ?만 입력하면 모든 명령어 목록이 출력되며, 명령어를 파라미터로 주면 해당 명령어의help 내용을 출력한다. account ftp> account [passwd] remote 서버로account 정보를 보낸다. append ftp> append [local-file [remote-file]] remote 서버에 파일이 존재할 경우 이어붙인다. remote-file 명을 입력하지 않으면local-file 명으로 지정된다. ascii ftp> type ascii 전송 모드를ascii로 설정한다. binary, image ftp> type [binary/image] 전송 모드를binary로 설정한다. bell ftp> bell [on/off] 명령어 실행 완료 시 삐 소리 출력 여부 설정한다. bye, quit ftp 연결을 끊고 종료한다. case mget 명령 시의 원격 서버 파일명 대소문자 구분을 설정(on/off toggle, default: off) (on이면) remote 서버의 파일들을mget으로 가져올 때, 대소문자 구분없이 모두 소문자로 가져온다. cd ftp> cd [remote-directory] 서버의 디렉토리를 변경 cdup 서버의 디렉토리를 한단계 전으로 변경(cd .. 와 동일) chmod ftp> chmod [mode remote-file] 파일의 권한을 변경 close, disconnect ftp 연결을 끊는다. ftp 연결만 끊으며ftp를 종료하지는 않는다. 정의한 매크로는 모두 삭제된다. cr 텍스트 파일 전송시 엔터코드(Carriage Return) 유무를 조정. (on/off toogle, default: on) delete ftp> delete [remote-file] remote 파일을 삭제한다. 빈 디렉토리도 삭제할 수 있다. debug 디버깅 모드를 설정한다. (on/off toggle 및debug 레벨 설정) dir, ls ftp> dir [remote-directory] [local-file]] 디렉토리를 출력한다. local 파일을 파라미터로 줄 경우, dir 명령의 결과를 파일로 저장할 수 있다. form 파일 전송 포맷을 설정한다. (non-print 포맷만 지원) get, recv ftp> get [remote-file [local-file]] remote 파일을local 서버로 전송받는다. local 파일명을 파라미터로 줄 경우, 전송받은 파일의 파일명을 지정할 수 있다. glob local 파일이름의 메타문자 확장을 설정한다. (on/off toggle, default: on) hash 1024 바이트 전송 시마다'#' 기호를 출력한다. hash 기능 사용 시 퍼포먼스 저하 idle ftp> idle [seconds] remote 서버 연결의 비활성화 시간을 설정/확인한다. 초 단위로 파라미터를 줄 경우, 비활성화 시간을 설정하며, 파라미터가 없는 경우 현재 설정 상태를 출력한다. 설정된 시간이 지나면ftp 접속이 끊어진다. (30~7200초 설정 가능) lcd ftp> lcd [local-directory] local 디렉토리를 변경한다. 파라미터로 주어진 디렉토리로local 디렉토리를 변경하며, 파리미터가 없는 경우local home 디렉토리로 변경 macdef ftp> macdef [macro-name] 매크로를 정의 명령어 실행 후 다음 라인부터의 내용이 매크로로 저장 빈 라인(내용없이 엔터 입력)이 입력되면 매크로 저장이 종료 최대4096개의 문자로 된16개의 매크로를 정의할 수 있으며, 정의된 매크로는close 명령어로 종료될 때까지 유지 $ ftp> $ [macro-name] 매크로를 실행한다. macdef 명령어로 먼저 매크로를 정의해 놓은 후, 해당 매크로를 실행 반복적인 작업이나 일괄작업 등에 쓰임 mdelete ftp> mdelete [remote-files] 다수의 파일을 삭제한다. mdir ftp> mdir [remote-files local-file] 다수의 디렉토리/파일의 출력 결과를local 파일로 저장한다. mls ftp> mls [remote-files local-file] 다수의 디렉토리/파일의 간단한 출력 결과를local 파일로 저장한다. mget ftp> mget [remote-files] 다수의remote 파일을 전송받는다. mkdir ftp> mkdir [directory-name] 서버에 디렉토리를 생성한다. mode 파일 전송 모드를 설정한다. 제공되는 모드는stream 뿐이다. modtime ftp> modtime [remote-file] 파일의 최종 수정시각을 출력한다. mput ftp> mput [local-files] 다수의local 파일을 서버로 전송한다. newer ftp> newer [remote-file [local-file]] 파일을get 하되, local 파일보다 나중인 경우에만 가져온다. local 파일이 없는 경우 그냥get 한다. nlist ftp> nlist [remote-directory] [local-file] 디렉토리의 파일 목록을 출력한다. 디렉토리명을 지정할 수 있으며, 지정하지 않으면 현재 디렉토리가 출력된다. open ftp> open [server-host] [port-number]] 서버에 접속한다. ftp 접속이 끊어졌을 경우ftp를 종료하지 않고open 명령어로 재접속 가능 prompt multiple 명령어 실행 시 응답 여부를 설정한다. (on/off toggle, default: on) off로 설정할 경우, multiple 명령어(mget, mput 등) 실행시y/n 선택없이 강제로 진행된다. (모두y) sendport data 연결을 위해PORT 명령어 사용 여부를 설정한다. (on/off toggle, default: on) off로 설정할 경우 명령어 실행에delay가 생길 수 있다. passive passive 모드 설정을 변경한다. (on/off toggle, default: off) put, send ftp> put [local-file] [remote-file]] 서버로local 파일을 전송한다. 파일명을 파라미터로 줄 경우, remote 서버로 전송되는 파일명을 지정할 수 있다. pwd 서버의 현재 디렉토리를 출력한다. reget ftp> reget [file-name] 파일의 끝에 이어서get 한다. 파일을get 하던 중 중지된 경우, 처음부터 다시 받지 않고reget 명령어를 이용해 이어받을 수 있다. rstatus ftp> rstatus [file-name] 서버의 상태를 출력한다. rhelp ftp> rhelp [command-name] 서버로부터help 정보를 얻어온다. ftp 프로그램 상의 명령어가 아닌 순수ftp 프로토콜의 명령어에 대한help 정보이다. rename ftp> rename [from-name [to-name]] 서버의 파일, 디렉토리의 이름을 변경한다. rmdir ftp> rmdir [directory-name] 빈디렉토리를 삭제한다. runique local 파일의unique 저장 설정을 변경한다. (on/off toggle, default: off) 만약remote 파일을get/mget으로 가져올 때, local 서버에 같은 이름의 파일이 존재하는 경우 해당off로 설정되어있으면 덮어씌기하고, on으로 설정되어있으면 파일명 끝에.1 과 같이 숫자 붙는다. size ftp> size [file-name] 파일의 사이즈를 출력한다. status 현재ftp 접속 상태 정보를 출력한다. struct ftp> struct [struct-name] 파일 전송struct를 설정한다. system 서버의OS 타입을 출력한다. tenex 파일 전송 모드를tenex로 설정한다. type ftp> type [type-name] 파일 전송 모드를 설정 umask ftp> umask [newmask] 서버의umask를 설정 verbose verbose 모드를 설정한다. (on/off toggle, default: on) on일 경우, 파일 전송 완료 시 전송 통계 내역(전송size, 소요시간, 초당 속도 등)을 출력한다.
출처 : http://blog.bntpidc.com/60109402564
FTP 접속 스크립트 예제
ftp_cmd 파일
verbose
open 접속할주소
user ID PASSWORD
bi
ha
cd 디렉토리
put 업로드할파일
bye
접속할주소 : 접속 할 ftp 서버 주소
ID : 접속 할 ftp 서버의 계정명
PASSWORD : 계정에 대한 패스워드
디렉토리 : 작업할 디렉토리
위와 같이 파일을 만든 후
$ ftp -n < ftp_cmd
명령을 내리면 저 명령들이 순차적으로 실행된다.