레이블이 LINUX COMMAND인 게시물을 표시합니다. 모든 게시물 표시
레이블이 LINUX COMMAND인 게시물을 표시합니다. 모든 게시물 표시

2010년 3월 5일 금요일

FIND

/ 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
find . -prune ...

- 퍼미션이 777 인 파일 찾기
find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
find / -perm -2 -print | xargs chmod o-w
또는
find / -perm -2 -exec chmod o-w {} ; -print | xargs ls -l | more

- 사용자이름과 그룹이름이 없는 파일 찾기
find / ( -nouser -o -nogroup ) -print | more

- 빈 파일(크기가 0 인 파일) 찾기
find / -empty -print | more
또는
find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
find . -type d ...

- root 권한으로 실행되는 파일 찾기
find / ( -user root -a -perm +4000 ) -print | xargs ls -l | more

- 다른 파일시스템은 검색하지 않기
find / -xdev ...

- 파일 이름에 공백이 들어간 파일 찾기
find / -name "* *" -print

- 숨겨진(hidden) 파일을 찾기
find / -name ".*" -print | more

- *.bak 파일을 찾아 지우기
find / -name "*.bak" -exec rm -rf {} ;
find -name ".git" | xargs rm -rf
find -name ".svn" | xargs rm -rf

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} ;

2009년 10월 22일 목요일

10 - 리눅스 Open SSH

SSH(Secure SHell)
관리의 목적으로 만들어진 보안로그인 쉘이다.

telnet 과 ftp 와 유사하나 보안이 우수하다. ssh 중에도 전혀 다른 개념의 protocol1 과 protocol2 가 있는데 protocol1은 스니핑이 가능하다. 따라서 protocol1 과 protocol2 를 같이사용하면 안된다.
* ssh 는 상용이고 openssh 는 배포판이다
Open SSH 서버설치 구성 요소

openssh-4.0p1-3.i386.rpm
openssh-server-4.0p1-3.i386.rpm
설치 후
# rpm -ql openssh-server-4.0p1-3
로 패키지가 설치한 파일들의 경로 및 이름을 확인할 수 있다.

그중에
/etc/rc.d/init.d/sshd   서버 실행 스크립트(path 경로에 없으므로 절대경로를 지정해서 실행해야함, # echo $PATH 엔터 패스경로 확인)
/etc/ssh/sshd_config  서버 설정 파일(서버설정파일은 rpm패키지로 설치시에는 대개 /etc/서비스와유사한이름의 디렉터리 안에 설정파일이 생성된다.)
/usr/sbin/sshd     서버 프로그램(스크립트가 읽혀지면서 이파일을 실행시킴)
이 3개지 파일이 특히 중요하다. 다른파일들도 중요 함.
서버 운용
# /etc/rc.d/init.d/sshd [옵션]

start 시작
stop 종료
restart 종료 후 시작
status 상태표시
# ps -axf   계층적인 구조로 프로그램동작 출력
# netstat -atunp   현재 네트워크 연결상태를 보여줌
a all
t  tcp
u udp
n numeric
p program
# who   현재 접속중인 tty또는, pts 원격지를 표시하고 접속한 사용자가 누구인지 정보를 출력
서버 접속

최초 접속시 접속자의 홈디렉터리의 .shh라는 숨은 디렉터리에 known_hosts 라는 파일안에 개인키를 받음

# ssh serverIP
접속한 서버의 쉘이 뜨면서 모든작업이 가능
단, 종료명령이나 랜카드 초기화시키는 명령은 하지 말것
# ssh [사용자ID]@serverIP
사용자로 접속 가능 (접속하려는 서버에 사용자 계정이 있어야함)
사용자로 접속후
* # su root 또는 # su - root 슈퍼유저 모드로 접속해서 root와 같은 작업을 할 수 있음
# scp [원본경로] [복사할위치의경로]
내컴의 디렉터리는 /어디/어디/어디
서버의 디렉터리는 serverIP:/어디/어디 이렇게 표시한다.
# sftp [server IP]

09 - 리눅스 네트워크 설정, FTP, RPM

네트워크 설정

# ifconfig
랜카드의 상태 확인 및 설정

# ifconfig [장치명]

장치의 상태를 출력
# ifconfig [장치명] down
장치의 상태 초기화(장치에 gw주소가 포함되어 있으면 같이 초기화 됨)


# ifconfig [장치명] [IP주소] netmask [넷마스크주소] broadcast [브로드캐스트주소] up
랜카드 설정


# route add default gw [IP대역에대한 게이트웨이주소]
게이트웨이주소 설정


# route del gw [게이트웨이주소]
게이트웨이주소삭제


# route del default gw [게이트웨이주소]
게이트웨이주소삭제


# echo "nameserver [네임서버주소]" > /etc/resolv.conf
네임서버의 주소를 /etc/resolv.conf 로 보냄
네임서보주소를 설정하지 않으면 URL 입력시 접속 할 수 없음


# ping www.yahoo.com
PING www.yahoo-ht2.akadns.net (209.131.36.158) 56(84) bytes of data.
64 bytes from f1.www.vip.sp1.yahoo.com (209.131.36.158) : icmp_seq=0 ttl=128 time=148 ms
64 bytes from f1.www.vip.sp1.yahoo.com (209.131.36.158) : icmp_seq=1 ttl=128 time=148 ms
...
ping 으로 접속이 잘 되었는지 확인

209.131.36.158 는 DNS서버에서 얻은 www.yahoo.com 의 IP주소
64 bytes = 56bytes의 임의의 값 + 8bytes
64 bytes를 해당서버에 보내고 다시 돌려받는 time=148 ms시간을 확인하여 통신이 잘되는지 확인할 수 있다.
ttl 값은 해당 서버의 OS를 알아볼 수 있는 방법이었는데 관리자가 보안을 위해 변경을 하기때문에 알 수 없다.
ttl 값이 1씩 줄어 들면서 0이 될 때까지 목적지에 도달하지 못하면 현재 위치한 곳의 주소를 출발지로하여 다시 되돌려 보냄. 이러한 방식으로 루핑을 방지한다.

# traceroute [목적지IP 혹은 도메인주소]

목적지까지 어떠한 경로를 거쳐서 가는지 확인
* VMware에서는 확인할 수 없다.

# nslookup [도메인주소]
해당 도메인의 IP주소를 확인
FTP
# ftp ftp.superuser.co.kr

Name : ftp 또는 anonymous (익명계정)
Password : 엔터
ftp> hash
다운로드시 #으로 다운받은양 표시 여부, 초기값은off
ftp> prompt
다운로드시 다운로드 확인 여부, 초기값은 on
ftp> lcd /tmp
로컬영역의 디렉터리변경(다운로드 받을 위치지정)
ftp> mget openssh*
현재디렉터리의 opensh로 시작하는 파일 다운로드
ftp> quit
ftp 종료

RPM
rpm packages 는 설치/관리는 쉬우나 보안에 취약하다.
반면, source package는 설/관리는 어려워도 보안 우수하다.

openssh-4.0p1-3.1386.rpm 를 설치하면 openssh-4.0p1-3 로 설치된다.
openssh-4.0p1-3.1386.rpm 설치할 패키지명
openssh-4.0p1-3      설치된 패키지명

-i    버전 확인 안하고 같은이름의 패키지 존재여부 확인후 설치(install)
-U    버전 확인후 상위버전이면 설치(Upgrade)
  -v    설치결과를 보여줌
  -h    진행상태를 # 로 표시
  --nodeps 설치에 필요한 파일이 모두있을 때 설치순서 무시하고 진행(의존성 무시)
  --force  기존 설치파일에 덮어 씌우기
# rpm ivh [설치할패키지명] --nodeps
패키지를 의존성무시하고 설치하며 설치결과와 진행상태를 보여줌
-e    제거(erase)
# rpm -e [설치된패키지명] --nodeps
의존성을 무시하고 패키지 삭제
-q  관리
  -a  설치된 패키지의 리스트
  -c  특정 패키지의 설정파일
  -l  특정패키지가 설치한 파일들의 위치 및 이름 확인
  -f  특정파일의 속해있는 패키지 확인

# rmp -qc [설치된패키지명(i386.rpm은 뺀 앞부분)]
# rmp -ql [설치된패키지명(i386.rpm은 뺀 앞부분)]
# rmp -qf [특정파일의경로]

2009년 10월 18일 일요일

08 - 리눅스 setuid, setgid, stickybit, 소유자 그룹 변경

setuid (4000)

 지정한 파일이 실행시점부터 끝날때까지 지정한 파일의 uid 의 소유권을 갖게 됨.
지정한 파일에 실행권한이 있을경우 rwx => rws
지정한 파일에 실행권한이 없을경우 rw- => rwS 실행안됨

ex)
# chmod 4755 /etc/passwd
$ passwd
- 이 시점부터 설정한 실행이 끝날때까지 uid의 소유를 갖음
주의! 위험한 시도
$ more /etc/shadow

/etc/shadow: Permission denied


# ls -l /bin/more -rwxr-xr-x 1 root root 30316 2008-09-25 22:08 /bin/more

# sudo chmod 4755 /bin/more
# ls -l /bin/more
-rwsr-xr-x 1 root root 30316 2008-09-25 22:08 /bin/more
$ more /etc/shadow
// 접근가능
setgid (2000)

 지정한 파일이 실행 시점부터 끝날때까지 실행한파일의 gid 의 소유권을 갖게됨
지정한 파일에 실행권한이 있을경우 rwx => rws
지정한 파일에 실행권한이 없을경우 rw- => rwS 실행안됨

ex)
# find / -perm +4000 2 > /dev/null
검색경로: /
검색데이터: -perm +4000
어떻게: 2(출력?)
방향: > (왼쪽에서 오른쪽으로 보내라)
어디로: dev/null(쓰레기통?)
=> setuid 정보 보안설정 해줘야함
stickybit

rwx rwx rwx (777)
=> 이러한 디렉터리의 권한은 디렉터리내에 혼돈을 일으키게 된다.
user, group, other 의 구분없이 디렉터리내에 파일들을 마음데로 삭제할 수 있기 때문이다.

그래서 stickybit를 사용한다.
# chmod 1777 /tmp
rwx rwx rwt (1777)
=> 디렉터리내에서 other의 권한이 자신이 생성한 파일및디렉터리에 대해선 막강하나, 타인의해서 생성된 파일및디렉터리에 대해서는 권한이 없다. 단지 관람만 할 수 있을 뿐이다.

게시판과 비슷한 계념이다.          stickybit(1777일때)
게시판에서 글의 작성은 모두 할 수있다.   => 파일및디렉터리 생성은 모두 가능
게시판에서 글의 수정은 작성자만 할 수있다. => 파일및디렉터리 수정은 작성자만 가능
게시판에서 글의 삭제는 작성자만 할 수있다. => 파일및디렉터리 삭제는 작성자만 가능
게시판에서 글의 보기는 모두 할 수있다.   => 파일및디렉터리 관람은 모두 가능
(단, 관리자(해당 디렉터리의 소유자)는 모든 권한이 있다.)

stickybit를 사용하게 되면 group의 권한은 무시되고 user 와 other 의 권한만 인식을 한다.

chown

파일및디렉터리의 소유권자와 해당그룹을 바꿈
chown 바꿀소유자 파일및디렉터리        소유자만 변경
chown :바꿀그룹명 파일및디렉터리        그룹만 변경
chown 바꿀소유자:바꿀그룹명 파일및디렉터리   소유자와 그룹 모두 변경

2009년 10월 15일 목요일

07 - 리눅스 로그인 과정, 수동 계정 생성, 허가권과 소유권

계정 로그인 과정
/sbin/mingetty 에 의해서 로그인 폼이 나타난다.
/etc/inittab 의
'1 : 2345 : respawn : /sbin/mingetty tty1' 중
respawn 에 의해서 프로세스가 실행되었다가 죽어도 다시 살아나게 한다(절대 죽일 수 없음).


login :     계정 입력(아무 값이나 넣어도 다음 과정으로 넘어감)
password :  패스워드 입력


 입력된 계정명은 /etc/passwd 에서 존재 여부 확인하고, 존재 한다면 입력된 암호를 MD5로 변경을 해서 /etc/shadow 와 비교한다.
 맞으면 /bin/bash (/etc/passwd 의 7번 필드(쉘)) 를 실행하고 틀리면 다시 로그인 폼을 띄운다.
(입력된 계정명이 없을때에도 로그인폼을 다시 띄운다.)


수동으로 계정 만들기
/etc/passwd 에 아래와 같은 정보를 입력하고 저장.
계정명 : X : UID : GID : comment : home_dir : shell
/etc/group 에 아래와 같은 정보를 입력하고 저장.
그룹명 : X : GID :
/etc/shadow 에 아래와 같은 정보를 입력하고 저장.
계정명 : $1$xxxxxxxx$~ : 최종암호변경일수(1970년1월1일기준) : 암호변경 최소일수 : 암호변경 유예기간 : 암호변경 경고일수 : 계정정지 사용여부 : 만기일사용여부 : 예약
* 여기서 $1$xxxxxxxx$~ 이것은
# perl -e 'print crypt("1234","\$1\솔트값\$"),"\n"' 해서 1234가 솔트값에 의해서 변경된 암호를 적어야함.
ex)
coderillla@localhost:~$ perl -e 'print crypt("1234","\$1\SaltValue\$"),"\n"'
$1CH2LCw5hraY => "1234" 라는 패스워드가 "SaltValue" 와 융화되어 만들어진 암호화된 값(?)
사용자 홈디렉터리의 뼈대 구성

# cp /etc/skel /home_dir
 이제 다른 터미널로 이동해서 만든계정명으로 로그인하면 로긴이 되는데 root로 사용자의 홈디렉터리를 만들었을 경우에는 만든 계정의 홈디렉터리 소유권을 변경해주어야 한다.

PS : ) 수동으로 계정 생성하는 것은 비추이다.  root 권한의 파일들을 수정하는 작업을 수행함으로써 자칫 잘못하다간 다른 계정의 정보를 날려 버릴 위험이 있다.

허가권 부여 및 제거

# chmod u(ser),+(추가)rwx,g(roup)-(삭제)rwx,o(rder)=(유지)rwx 파일경로
ex) # chmod u+rw-x,g+r-wx,o-rwx /etc/passwd
위 방식 보다 절대모드 권장한다.
rwx(421)rwx(421)rwx(421) = 777
rw-(420)r--(400)---(000) = 640
ex) # chmod 640 /etc/passwd
권한 테스트 디렉터리 / 파일
디렉터리
r - 디렉터리정보출력
w - 디렉터리내에서 파일을 쓰거나 삭제
x - 디렉터리진입

일반 파일
해당폴더의 권한이 rwx 일때
r - 파일을 출력한다. /삭제, 이동, 복사/
w - 출력한 파일을 입력(편집) 한다. /삭제, 이동/

실행 파일
해당디렉터리의 권한이 rwx 일때
r - 삭제, 이동, 복사
w - 삭제, 이동
x - 삭제, 이동, 실행

06 - 리눅스 사용자 계정 관리

/etc/default/useradd (계정생성시 기본값을 설정하는 파일)
GROUP=100
HOME=/home   홈디렉터리 경로
INACTIVE=-1    계정정지 사용여부 (-1사용안함, 0사용, 1기간연장)
EXPIRE=      만기일 사용여부(-1사용안함, 0사용)
SHELL=/bin/bash 사용할 쉘
SKEL=/etc/skel  홈디렉터리의 뼈대가 되는 파일
/etc/login.defs (계정생성시 기본값을 설정하는 파일)
MAIL_DIR /var/spool/mail  메일이 보내지는 경로
PASS_MAX_DAYS 99999   암호변경 유예기간, 입력된수일 동안 암호변경없이 사용가능
PASS_MIN_DAYS  0     암호변경 최소일수, 입력된수일 마다 변경가능
PASS_MIN_LEN   5    최소한 암호의 길이
PASS_WARN_AGE 7     암호변경 경고일수, 입력된수일 전에 경고
UID_MIN   500       최소 UID
UID_MAX  6000       최대 UID
GID_MIN   500       최소 GID
GID_MAX  60000      최대 GID
CREATE_HOME  YES    홈디렉터리 생성여부
UMASK   076      사용자 디렉토리 생성시 UMASK 값을 설정한다. 701로 생성된다.
/etc/shadow (계정생성시 계정 정보가 추가되는 파일)
계정명 : $!$xxxxxxxx$~ : 최종암호변경일수(1970년1월1일기준) : 암호변경 최소일수 : 암호변경 유예기간 : 암호변경 경고일수 : 계정정지 사용여부 : 만기일사용여부 : 예약
chfn 사용자 comment 변경 명령
: 이름,회사,회사폰,집폰 :
-f   fullname
-o  office
-p  office phone
-h  home phone

# chfn 계정명

계정암호를 입력하고 문답식으로 변경

# chfn 옵션 변경내용 계정명

계정암호를 입력하면 선택한 옵션의 정보만 변경

/etc/group

그룹에관한 정보가있다.
# groupadd 그룹명
-g  그룹의 고유ID지정
ex) groupadd -g 707 그룹명  UID값으로 707을 갖는 그룹명을 생성
* 현존하는 그룹은 생성 불가
# groupdel 그룹명
지정한 그룹을 삭제 함.
*사용자가 포함되어있는 그룹은 삭제 불가
# groupmod 그룹명
지정한 그룹의 속성을 변경 함.
-g  그룹의 고유ID변경
-n  그룹명 변경
ex) groupmod -g 변경값 그룹명
* 변경할 GID값이 다른 그룹의 GID값으로 존재하면 변경불가

 useradd 기본값으로 계정을 생성하면 계정명과같은 그룹명이 생기는데 이 때,
userdel -r 계정명을 하면 그룹정보도 같이 지워진다.
 하지만 기본값으로 계정을 생성하고 그룹에관한 정보를 조금이라도 수정하면, 이 때는 그룹과 계정을 별도로 관리해야한다.
 즉, useradd 로 기본값으로 계정을 만들고 groupmod 로 기본값으로 생성된 그룹의 GID를 변경해도 /etc/passwd 는 변경된 것을 인식하지 않는다.
 usermod 로 변경된 GID 값을 수정해줘야한다. (/etc/passwd의 GID값이 /etc/group 의 GID값과 같고
/etc/passwd의 계정명이 /etc/group 의 그룹명과 같으면 userdel 했을때 해당 계정명의 계정정보와 그룹정보가 삭제됨)

# groups
현재 접속한 계정의 그룹 정보 혹은 지정한 계정의 그룹 정보를 표시
계정명 : 소속그룹

02 - 리눅스 기본 명령어 1: init. shutdown, reboot, pwd, cd, ls, cp, mkdir, touch





03 - 리눅스 기본 명령어 2: alias, cat, more, head, tail














































05 - 리눅스 사용자 추가

리눅스는 서버 등등의 서비스를 목적으로 하는 운영체제이기 때문에 계정생성이 필요하다.


계정을 생성하게되면
/etc/passwd
/etc/group
/etc/shadow
3개 파일에 계정명에 대한 정보가 추가되고
/home/계정명
으로 계정에대한 사용자 홈디렉터리가 1개 생성된다.

# useradd 계정명
위처럼 별개의 옵션없이 계정을 생성하게 되면 기본값으로 계정이 생성된다.

"/etc/passwd" 의 내용은 다음과 같으며,
계정명 : X : UID : GID : comment : home_dir : shell
기본값은 다음과 같다.
계정명:X:[이전에 생성된UID+1]:[UID와 동일]:[NULL]:[/home/계정명]:/bin/bash

기본값의 정보는
/etc/defualt/useradd
/etc/login.defs
위 두 파일과
/etc/skel
이라는 디렉터리가 갖고 있다.


레드햇 - UID/GID
0     관리자 계정/그룹
1~499  시스템관리계정/그룹
500~6만 일반사용자계정/그룹


다른OS - UID/GID

0     관리자 계정/그룹
1~99   시스템관리계정/그룹
100~   일반사용자계정/그룹
[옵션]
-u  uid(시스템이 판단하기위한 정보)
-g  gid(시스템이 판단하기위한 정보)GID는 사전에 등록된 값만을 지정할수있다.(새로운gid생성불가)
-c  설명
-d  홈디렉터리
-s  쉘
* 옵션은 다중 사용가능하다.
ex) # useradd -u 500 -c "test1" -d /home/test1 -s /bin/bash 계정명
# passwd

# passwd [엔터]  현재 접속중인 계정의 패스워드 변경
# passwd 계정명  지정한 계정의 패스워드 변경

root의 권한으로 패스워드를 최초로 입력할때는 조건없이 패스워드 지정이 가능하다. (경고메세지만나옴)
그러나, 일반 사용자가 암호를 입력할때는 다음 조건이 맞아야한다.
  • 길이제한 (7자이상)
  • 간단한단어는 사용불가
  • 등록된패스워드 사용불가
  • 이전 패스워드 사용불가

# useradd

#userdel 계정명  계정에 관련된 파일의 정보만을 지운다. (홈디렉터리의 내용은 지우지않음)
#userdel -r 계정명  계정에 관련된 모든 정보를 지운다. (홈디렉터리의 내용도 지움)



# cat /etc/passwd | grep test

/etc/passwd라는 파일을 불러와서 test가 검색된 라인만 출력한다.



#finger 계정명1 계정명2 계정명3


계정에대한 정보를 출력한다.

04 - 리눅스 기본 명령어 3: vi

VI editor

ctrl+z 최소화
# jobs 현재 작업중인 목록 표시
# fg 작업번호 작업번호 작업

대기/명령모드, 편집/추가모드, 라인입력 모드가 있으며, 모든명령은 대기/명령 모드에서 이루어진다.
[Esc]키를 이용하여 대기/명령 모드로 갈 수 있다.


[삽입 명령]
a  append 현재 커서에서 추가
i   insert 현재 커서에서 삽입
o  open? 현재커서에서 아래로 행을 열고 입력
A  APPEND 현재 커서가있는 행의 맨뒤에 추가
I   INSERT 현재 커서가있는 행의 맨처음에 삽입
O  OPEN? 현재 커서에서 위로 행을 열고 입력

[파일관련]
:e  열기
:q  종료
:q!  강제 종료(저장 안됨)
:w  저장
:wq  저장후 종료(:x, ZZ)
:wq!  강제 저장후 종료(관리자만 사용가능)

[커서이동 및 화면이동]
hjkl  좌하상우
e  다음단어의 마지막으로 이동
숫자+G   커서를 숫자에 해당하는 행으로 이동

Enter  커서를 다음라인의 첨으로
-    커서를 이전라인의 끝으로

0  커서를 해당라인의 첨으로
$  커서를 해당라인의 끝으로

H  커서를 화면의 처음 HEAD
L  커서를 화면의 마지막LAST

ctrl+f 다음 화면으로 이동forword
ctrl+b이전 화면으로 이동b a c k

G  문서의 끝으로 이동
gg  문서의 첨으로 이동

[삭제(잘라내기)]
x     커서가 위치한 1 character 삭제(잘라내기)
dw    커서가 위치한 1 word 삭제(잘라내기)
dd    커서가 위치한 1 line 삭제(잘라내기)
숫자dd  입력한 숫자만큼의 line 삭제(잘라내기)
D     커서의 위치 부터 라인의 끝까지 삭제(잘라내기)

[복사]
yw   커서가 위치한 1 word 복사
yy   커서가 위치한 1 line 복사
숫자yy 커서가 위치한 곳에서부터 숫자만큼의 line 복사

[붙여넣기]
p   단어는 커서가 위치한 뒤에, 1개라인 이상은 커서가 위치한 아래에
P   단어는 커서가 위치한 앞에, 1개라인 이상은 커서가 위치한 위에

[바꾸기]
r   커서에 있는 1 character replace
R   REPLACE 모드로 전환
s   커서에 있는 1 character 삭제후 입력모드로 전환
S   커서에 있는 STRING 삭제후 입력모드로 전환

[검색]
/  검색어 검색어를 내림차순으로 검색
?  검색어 검색어를 오름차순으로 검색
n  해당검색기능의 흐름에맞게 계속 검색 (/검색어 사용후 n 하면 내림차순으로 계속검색)
N  해당검색기능의 역방향으로 계속 검색 (/검색어 사용후 N 하면 내림차순의역방향(오름차순)으로 계속검색)
g/검색어/s//대체어/g
검색어를 대체어로 바꿔라

처음에 g는 세로 행의 global
마지막 g는 가로 행의 global

앞뒤에 g가있으니 모는 검색어가 대체어로 바뀐다.

[반복 및 취소]
.   이전명령 반복
u   이전명령 취소

[기타]
:set nu   행의 행번호 출력
:set nonu  해제
:set ts=숫자 탭의 간격설정(기본값 8)영구적으로 변하게 하려면 vi설정파일을 변경해야함
:! bash   잠시쉘로이동
[쉘상에서 명령]
vi -r 복구가능한 파일 보기
vi -r filename 파일복구
set -o vi [esc]키 입력후 쉘상에서 vi의 명령어 사용가능
VIM editor
visual기능이 있음
:vs   화면 분할(기본 세로)
ctrl+w+n 가로 분할
ctrl+ww 분할된 파일로 커서를 이동
:nohl  검색기능사용으로 표시된 검색어 헤드라인 해제

치환은 아래 사이트 참조
http://mwultong.blogspot.com/2006/09/vim-vi-gvim-find-and-replace.html