📌 vi 편집기 📌

https://djkeh.github.io/articles/A-new-linux-security-vulnerability-releaved-on-vim-and-nvim-kor/

vim 패키지는 기본적으로 vim-minimal 패키지가 설치되어 있다.
[root@localhost ~]# rpm -qa | grep vim
vim-minimal-8.0.1763-16.el8_5.13.x86_64
vim의 확장판을 사용하기 위해서는 vim을 설치한다.
[root@localhost ~]# yum -y install vim
[root@localhost ~]# rpm -qa | grep vim
vim-minimal-8.0.1763-16.el8_5.13.x86_64
vim-common-8.0.1763-19.el8_6.4.x86_64
vim-enhanced-8.0.1763-19.el8_6.4.x86_64
vim-filesystem-8.0.1763-19.el8_6.4.noarch
vi를 vim으로 사용하기 위한 임시적 설정
[root@localhost ~]# alias vi=vim
vi를 vim으로 사용하기 위한 영구적 설정
[root@localhost ~]# vi .bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim' <-- 추가
[root@localhost ~]# vi /etc/vimrc
:
:(생략)
" =================
" 새로운 설정 추가
" =================
" set nu: 번호
" set ai: 자동 들여쓰기
" set ai: C언어 자동 들여쓰기
" set sw: 들여쓰기 내어쓰기 간격
" set ts: 탭 크기
" set bg: 배경색
" set expandtab: 탭을 공백으로 변경
" set cursorline: 커서 라인
set nu
set ai
set ci
set sw=4
set ts=4
set bg=dark
set expandtab
set cursorline
실습> vi 자동 설정 스크립트
[root@localhost ~]# vi vimrc.sh
#!/bin/sh
#프로그램 파일명: vimrc.sh
#프로그램 설명: vi 설정 추가하기
#추가되는 파일: $HOME/.bashrc, /etc/bashrc
echo alias vi=\'vim\' >> $HOME/.bashrc
cat << EOF >> /etc/vimrc
" =================
" 새로운 설정 추가
" =================
" set nu: 번호
" set ai: 자동 들여쓰기
" set ai: C언어 자동 들여쓰기
" set sw: 들여쓰기 내어쓰기 간격
" set ts: 탭 크기
" set bg: 배경색
" set expandtab: 탭을 공백으로 변경
" set cursorline: 커서 라인
set nu
set ai
set ci
set sw=4
set ts=4
set bg=dark
set expandtab
set cursorline
EOF
[root@localhost ~]# chmod 755 vimrc.sh
[root@localhost ~]# ./vimrc.sh
[root@localhost ~]# dnf -y install python39
[root@localhost ~]# vi 1.py
""
파일명: 1.py
"""
print("Hello Python!")
[root@localhost ~]# ln -s /bin/python3 /bin/python
[root@localhost ~]# python 1.py
Hello Python!
[root@localhost ~]# python3 1.py
Hello Python!
[root@localhost ~]# vi 1.py
"""
파일명: 1.py
"""
print("Hello Python!") # 커서를 위치하고 o 를 누른다.
print("Hello Rocky Linux!") # 추가하고 ESC -> ZZ(단축키로 저장 후 종료)
[root@localhost ~]# cat -n 1.py
1 """
2 파일명: 1.py
3 """
4 print("Hello Python!")
5 print("Hello Rocky Linux!")
3번 라인으로 이동
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
""" <-- 여기로 이동한다.
print("Hello Python!")
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
""" <-- o 를 누른다.
<-- 커서 위치
print("Hello Python!")
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
""" <-- o 를 누른다.
for a in [1,2,3,4,5]: <-- 코드를 적고 ESC를 눌러서 입력모드 -> 명령모드로 변경된다.
print("Hello Python!")
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]: <-- j 를 눌러서 밑에 라인으로 커서를 이동한다.
print("Hello Python!")
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!") <-- 커서 위치 I(대문자 아이)를 누른다.
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!") <-- 커서 위치는 첫 번째 컬럼에 위치한다.
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!") <-- ts=4, expandtab의 설정에 의해서 탭을 눌러서 공백 4를 삽입하고 ESC 를 누른다.
print("Hello Rocky Linux!")
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!") <-- +를 눌러서 다음 행의 첫 번째 컬럼으로 이동한다.
print("Hello Rocky Linux!") <-- 커서 위치
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!")
print("Hello Rocky Linux!") <-- . 을 눌러서 마지막을 반복(탭 삽입)한다.
[root@localhost ~]# vi +3 1.py
"""
파일명: 1.py
"""
for a in [1,2,3,4,5]:
print("Hello Python!")
print("Hello Rocky Linux!") <-- . 을 눌러서 마지막을 반복(탭 삽입)한다.
만들어진 파일을 실행한다.
[root@localhost ~]# python 1.py
Hello Python!
Hello Rocky Linux!
Hello Python!
Hello Rocky Linux!
Hello Python!
Hello Rocky Linux!
Hello Python!
Hello Rocky Linux!
Hello Python!
Hello Rocky Linux!
실습> vi 명령어 연습하기
!!! 주의 !!!
오른쪽 방향키를 사용하면 안된다.
[root@localhost ~]# cp /etc/DIR_COLORS .
[root@localhost ~]# wc -l DIR_COLORS
211 DIR_COLORS
[root@localhost ~]# vi DIR_COLORS
^
|
k
<-- h l -->
j
|
v
w, W: 단어 이동 (앞으로)
b, B: 단어 이동 (뒤로)
숫자w, 숫자W: 숫자만큼 앞으로 이동
숫자b, 숫자B: 숫자만큼 뒤로 이동
숫자는 숫자만큼 반복이다.
6j: 여섯칸 밑으로 이동
x: 삭제(Del 키와 동일)
X: 삭제(<-- 키와 동일)
3x: 3글자 삭제
5X: 커서 왼쪽의 5글자 삭제
u: 취소
Ctrl + r: 되돌리기
G: 문서의 끝으로 이동
gg: 문서의 처음으로 이동
숫자G: 숫자 라인으로 이동
숫자gg: 숫자 라인으로 이동
10G: 10번 라인으로 이동
3gg: 3번 라인으로 이동
yy, Y: 한 줄 복사
p: 커서의 다음으로 붙여넣기
P: 커서의 이전으로 붙여넣기
dd: 한 줄 삭제
d<이동키>: 이동키 만큼 삭제
dw: 한 단어 삭제(공백 포함)
dj: 커서가 있는 위치에서 아랫줄까지 삭제(2줄 삭제)
d$: 커서가 있는 위치에서 오른쪽 끝까지 삭제
d0: 커서가 있는 위치에서 처음까지 삭제
ggdG: 문서 전체 삭제
Gd1G: 문서 전체 삭제
실습> 레지스터
vi 레지스터는
vi에서 관리하는 메모리인 저장 공간을 의미한다.
레지스터 확인하기
:reg
:help reg
레지스터 등록하기
Shift + V로 블럭을 잡고 > "문자 > y
레지스터 사용하기
"문자 > p or P
COLOR tty
~ <-- 현재 커서 위치
"a > dd
:reg
--- 레지스터 ---
"" COLOR tty^J
"a COLOR tty^J
[root@localhost ~]# off. <-- 이 라인에 커서를 위치한다.
dd
:reg
--- 레지스터 ---
"" # off.^J
"a COLOR tty^J
붙여넣기(p, P)를 하면
[root@localhost ~]# off.
"a 저장된 COLOR tty를 넣고 싶다면
"ap or "aP
실습> vi 옵션
vi 옵션은 엄청 많이 있고 내용이 방대하다.
다 알 필요는 없고 중요한 것 몇가지만 알면 된다.
:set: 현재 설정된 옵션 확인
:set all: 모든 옵션 확인
옵션 설정의 두 가지
첫 번째: 옵션=값 <-- 여러 개의 값이 올 수 있다.
두 번째: 옵션, no옵션 <-- 토글(On/Off)
:set sw=4
:set nu[mber], :set nonu
실습> 검색
검색할 때 주로 사용하는 옵션
ignorecase, ic: 대소문자 구분하지 않고 검색할 때 사용
noignorecase, noic 대소문자 구분하고 검색할 때 사용
한번 찾은 문자들은 vim을 종료해도 다음에 다시 하이라이팅이 되어 있다.
그래서 검색 후에 :nohl 로 끄거나 /아무문자 로 하이라이팅된 문자들을 꺼주는 것이 좋다.
1G
:set ic
/copyright
?term : 커서 위치에서 위로 term을 검색한다.
n
n
n
N
N
N
/term : 커서 위치에서 아래로 term을 검색한다.
n
n
n
N
N
N
하이라이팅이 된 부분을 해제할 때 두가지가 있는데
첫 번째: /없는문자를쓴다.
첫 번째: :nohl
:set ai
:set nohlsearch
/term
n
n
n
:set hlsearch
/term
n
n
n
실습> 단어 교체
r : 한 문자 교체 ex)ra
문자 치환
ex모드에서 실행한다.
형식 :
:범위 s/찾을단어/바꿀단어/옵션
범위 :
범위의 값이 없다면 : 현재 라인을 의미 ex) :.s/tty/TTY
생략 : 현재 라인을 의미 ex) :s/tty/TTY
. : 현재 라인을 의미 ex) :.s/tty/TTY
시작숫자 : 시작숫자에 적힌 라인을 의미 ex) 33s/TERM/term <-- 변경 후 :nohl 로 하이라이팅을 Off한다.
시작숫자,끝숫자 : 시작숫자 ~ 끝숫자 ex) :24,30s/TERM/term > :nohl
% : 문서 전체를 의미 ex) :%s/TERM/term/gc
옵션 :
g :
한 라인에 동일한 단어가 여러 개 존재해도 모두 변경
옵션에 g 가 없다면 처음 매칭되는 단어만 변경
c : 물어보는 창이 뜬다.
(y/n/a/q/l/^E/^Y)
y : 변경함
n : 변경하지 않음
a : 모두 변경함
q : 종료
l : 변경 후 종료
^Y : 화면을 위로 스크롤 (Ctrl + Y)
^E : 화면을 아래로 스크롤 (Ctrl + E)
실습> 단어 치환하기
전체 문서에서 TERM -> term 변경한다.
한 라인에 TERM이 2개 이상 존재해도 모두 변경한다.
옵션을 이용해서 변경사항을 사용자에게 물어보도록 한다.
%: 문서 전체에서
s: 치환한다.
/TERM: TERM 단어를
/term: term 으로 변경한다.
/g: 한 라인에 2개 이상 존재해도 변경한다.
/c: 물어본다.
:% s/TERM/term/gc
전체 문서에서 TERM -> term 변경한다.
한 라인에 TERM이 2개 이상 존재해도 모두 변경한다.
변경사항을 사용자에게 물어보지 않고 변경한다.
%: 문서 전체에서
s: 치환한다.
/TERM: TERM 단어를
/term: term 으로 변경한다.
/g: 한 라인에 2개 이상 존재해도 변경한다.
:% s/TERM/term/g
범위가 생략되면 현재 라인을 의미한다.
:s/TERM/term/
:s/TERM/term/g
:s/TERM/term/gc
범위가 지정되면 커서의 위치하고 상관없이 30 ~ 35라인까지 TERM을 term으로 변경한다.
:30,35s/TERM/term/g
실습> 범위를 이용해서 삭제/복사/이동
1 ~ 5번 라인까지 삭제한다.
:1,5 d
전체 문서를 삭제한다.
:% d
1 ~ 5번 라인까지 13+1번 라인에 복사한다.
-copy는 라인이 하나 증가된다.
:1,5 copy 13
1 ~ 5번 라인까지 13+1번 라인에 이동한다.
:1,5 move 13
실습> 쉘 명령어
vi 편집기를 사용하다가 잠시 명령어를 사용하기 위해서 셸(쉘)을 사용하고자 한다면
:!bash, :!sh 을 사용한다.
:!pwd
:!ls
:!bash
[root@localhost ~]# ls
[root@localhost ~]# pwd
[root@localhost ~]# exit
<-- vi 편집기로 이동된다.
실습> 현재 문서에 추가하기
/etc/hosts 파일을 현재 커서에 불러들인다.
:r /etc/hosts
pwd 명령어의 결과를 현재 커서에 불러들인다.
:r !pwd
문서를 열었다.
문서를 수정하지 않았다.
저장 o: :wq
저장 x: :q
문서를 수정했다.
종료하고 싶을 때
저장 o: :wq
저장 x: :q!
실습> vim 연습
'>>> 정답 <<<'
1. /etc/DIR_COLORS /root 디렉터리에 복사
cp /etc/DIR_COLORS ~
cp /etc/DIR_COLORS .
cp /etc/DIR_COLORS /root
cp /etc/DIR_COLORS DIR_COLORS
cp /etc/DIR_COLORS ~/DIR_COLORS
cp /etc/DIR_COLORS ./DIR_COLORS
cp /etc/DIR_COLORS /root/DIR_COLORS
2. vi로 /root/DIR_COLORS 파일을 열면서 30번라인으로 이동
vi +30 DIR_COLORS
3. 커서를 200번 라인으로 이동
200G, 200gg, :200
4. 200번 라인부터 5라인을 복사한 후 문서의 제일 마지막 라인에 붙여넣기
:200,204 copy 211
5YGp
현재 문서에서 라인 번호를 표시(On -> Off, Off -> On)
:set nonu
:set nu
100번 라인으로 이동
100G, 100gg, :100
수정모드로 edit 문자열 입력
-R > edit
7번에서 작업했던 내용 취소
u, U
10번 라인으로 이동
10G, 10gg, :10
현재 커서를 기준으로 오른쪽으로 5개의 문자 삭제
5dw, d5w
현재 커서를 기준으로 위쪽으로 TERM 문자열 검색
?TERM
저장하지 않고 종료
:q!
실습> 스왑파일 테스트
vi 에서 파일을 열면 임시파일(swap)이 생긴다.
스왑파일 형식 : .파일명.swp
/etc/services -> /etc/.services.swp
1. 스왑파일 확인
/dev/pts0# tty
/dev/pts/0
/dev/pts0# ls -a .DIR
ls: cannot access '.DIR': No such file or directory
2. 파일 열기
/dev/pts/0# vi DIR_COLORS
3. 스왑파일 확인
/dev/pts1# tty
/dev/pts/1
/dev/pts1# ls -a .DIR*
.DIR_COLORS.swp
4. 파일 열기
/dev/pts1# vi DIR_COLORS
E325: 주목
Found a swap file by the name ".DIR_COLORS.swp"
소유자: root 날짜: Thu Jan 5 17:41:12 2023
파일 이름: ~root/DIR_COLORS
수정: 예
사용자 이름: root 호스트 이름: rocky9apm.linuxmaster.net
프로세스 ID: 37422 (아직 실행중)
While opening file "DIR_COLORS"
날짜: Thu Jan 5 17:20:51 2023
(1) 다른 프로그램이 같은 파일을 고치고 있는중일 수 있습니다.
만약 그렇다면 같은 파일을 두 개의 프로그램에서 고치지 않도록
조심하시기 바랍니다. 종료하세요. 계속하시려면 주의하세요.
(2) 이 파일을 고치다가 죽었었습니다.
만약 그렇다면 ":recover" 혹은 "vim -r DIR_COLORS"
을 사용하여 복구하십시오 (":help recovery" 참고).
이미 복구하셨었다면 스왑파일 ".DIR_COLORS.swp"
을(를) 지우셔야 이 메시지가 사라집니다.
스왑 파일 ".DIR_COLORS.swp"이 이미 존재합니다!
읽기 전용으로 열기([O]), 그냥 고치기((E)), 복구((R)), 끝내기((Q)), 버리기((A)): q
5. 파일 종료
/dev/pts/0# vi DIR_COLORS
:
:
:q <-- 종료가 되면서 .DIR_COLORS.swp 파일은 삭제된다.
실습> 웹서버 보안
1. 웹서버 설치
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
2. 웹문서 작성
[root@localhost ~]# cd /var/www/html/
[root@localhost ~]# vi index.html
1 <?
2 $db = "localhost";
3 $user = "root";
4 $pass = "P@ssw0rd";
5 ?>
3. 스왑파일 접근
http://200.200.200.26/.index.html.swp
b0VIM 8.0'��c@���rootrocky9apm.linuxmaster.net/var/www/html/index.html 3210#"!
Utpad��������?>user = "root";$db = "localhost";