터미널·서버 실무 · Part 6

권한·환경·편집

서버에서 권한 오류를 풀고 파일을 직접 고치기

작성 기준2026년 7월

이 파트에서 다루는 내용

파일 권한소유권과 sudo환경변수와 PATHvi 생존 명령
01

권한 오류는 세 종류의 대상과 세 종류의 행위로 읽습니다

Permission denied 는 서버에서 가장 자주 만나는 오류입니다. 리눅스 권한은 복잡해 보이지만 구조는 단순합니다. 누가(소유자·그룹·기타) 무엇을(읽기·쓰기·실행) 할 수 있는지를 정한 것입니다.

실행 권한 누락
흔한 원인

스크립트가 Permission denied 로 안 돌면 실행 권한이 없는 경우가 많습니다. chmod +x 로 부여합니다. 복사나 전송 과정에서 권한이 빠지는 일이 잦습니다.

비밀 파일은 좁게
보안

키나 인증서 파일은 소유자만 읽도록 600 으로 둡니다. 권한이 너무 열려 있으면 일부 프로그램은 아예 사용을 거부합니다.

777 은 피합니다
안티패턴

권한 오류를 chmod 777 로 막 여는 것은 위험합니다. 누구나 쓰고 실행할 수 있게 되어 보안 구멍이 됩니다. 필요한 권한만 정확히 줍니다.

ls -l app.sh파일의 권한과 소유자 확인
chmod +x deploy.sh실행 권한 부여. 스크립트가 안 돌 때 자주 씀
chmod 644 app.conf소유자 읽기·쓰기, 나머지 읽기로 설정
chmod 600 secret.key소유자만 읽기·쓰기. 비밀 파일에 권장
권한 표시 읽는 법bash
ls -l app.sh
-rwxr-xr--  1 deploy  app  1024  app.sh
│└┬┘└┬┘└┬┘    └──┬─┘  └┬┘
│ │  │  │        │     └ 그룹: app
│ │  │  │        └────── 소유자: deploy
│ │  │  └ 기타 사용자 권한: r-- (읽기만)
│ │  └─── 그룹 권한: r-x (읽기·실행)
│ └────── 소유자 권한: rwx (읽기·쓰기·실행)
└──────── 파일 종류: - 파일, d 디렉터리

# r=읽기(4) w=쓰기(2) x=실행(1)
# rwx = 4+2+1 = 7,  r-x = 4+0+1 = 5,  r-- = 4

숫자 표기는 각 권한을 더한 값입니다. 755 는 소유자 rwx(7), 그룹·기타 r-x(5)를 뜻합니다. 자주 쓰는 조합만 익히면 됩니다.

02

소유권과 관리자 권한

권한과 별개로 파일에는 소유자가 있습니다. 애플리케이션이 특정 사용자로 실행되는데 파일 소유자가 다르면 접근하지 못합니다.

관리자 권한이 필요한 작업은 sudo 로 실행합니다. 다만 sudo 는 무엇이든 할 수 있어 신중해야 합니다.

실행 사용자 확인
권한 불일치

애플리케이션이 어떤 사용자로 도는지와 파일 소유자가 맞는지 봅니다. Docker 코스의 비root 실행과 이어집니다. 소유자가 다르면 로그를 못 쓰거나 파일을 못 읽습니다.

sudo 는 최소한으로
주의

sudo 로 실행한 명령은 시스템 전체를 바꿀 수 있습니다. 특히 sudo rm 은 보호된 파일까지 지웁니다. 정말 필요한 명령에만 붙입니다.

root 로 만든 파일
함정

sudo 로 만든 파일은 소유자가 root 가 됩니다. 이후 일반 사용자로 실행되는 애플리케이션이 그 파일을 못 건드려 문제가 생깁니다.

chown deploy:app app.jar파일의 소유자와 그룹 변경
chown -R deploy:app logs/디렉터리 안 전체 소유권 변경
sudo systemctl restart app관리자 권한으로 서비스 재시작
whoami지금 어떤 사용자로 작업 중인지 확인
id현재 사용자의 그룹까지 확인
03

환경변수와 PATH가 실행을 좌우합니다

명령을 쳤는데 command not found 가 나거나, 애플리케이션이 설정을 못 읽는 문제는 대개 환경변수 때문입니다.

환경변수는 프로그램이 참조하는 값이고, 그중 PATH 는 명령을 어디서 찾을지 정합니다. Spring Boot 코스에서 비밀정보를 환경변수로 주입한 것도 같은 개념입니다.

command not found
PATH 문제

설치했는데 명령을 못 찾으면 PATH 에 그 위치가 없는 것입니다. which 로 실제 위치를 확인하고 PATH 를 점검합니다.

설정이 사라지는 이유
지속성

export 로 설정한 값은 그 셸에서만 유효합니다. 터미널을 닫거나 서비스가 재시작되면 사라집니다. 계속 쓰려면 프로파일 파일이나 서비스 설정에 넣어야 합니다.

버전이 여러 개일 때
which 로 확인

자바처럼 여러 버전이 깔린 경우, 실제로 어느 것이 실행되는지 which 와 환경변수로 확인합니다. 예상과 다른 버전이 도는 문제를 잡습니다.

echo $PATH명령을 찾는 경로 목록 확인
echo $JAVA_HOME특정 환경변수 값 확인
env현재 설정된 모든 환경변수 출력
export APP_ENV=prod환경변수 설정. 현재 셸에서만 유효
which java실제 실행되는 명령의 위치 확인
04

vi 생존 명령만 알면 서버에서 파일을 고칠 수 있습니다

원격 서버에는 그래픽 편집기가 없습니다. 설정 파일 한 줄을 고치려면 터미널 편집기를 써야 하고, 거의 모든 서버에 vi 가 깔려 있습니다.

vi 는 처음에 당황스럽습니다. 입력 모드와 명령 모드가 나뉘어 있어, 모르면 글자도 못 치고 나가지도 못합니다. 하지만 생존에 필요한 명령은 몇 개뿐입니다.

못 나갈 때
가장 흔한 당황

Esc 를 몇 번 누른 뒤 :q! 를 입력하면 변경을 버리고 나옵니다. 이것만 알아도 파일을 망칠 걱정 없이 vi 를 열어 볼 수 있습니다.

고치기 전 백업
안전 습관

설정 파일을 vi 로 고치기 전에 cp 로 .bak 사본을 만듭니다. 잘못 저장해도 되돌릴 수 있습니다. 트랙 A에서 강조한 습관과 같습니다.

실수로 저장했다면
복구

백업이 있으면 사본으로 되돌립니다. 없으면 u 로 실행 취소를 반복해 되돌립니다. 그래서 열기 전 백업이 중요합니다.

vi 생존 명령text
vi app.conf        # 파일 열기

# vi 는 두 가지 모드가 있습니다
#  - 명령 모드: 이동·삭제·저장 (열면 이 상태)
#  - 입력 모드: 글자 입력

i                  # 입력 모드로 (커서 위치부터 입력)
Esc                # 다시 명령 모드로

# 명령 모드에서
dd                 # 현재 줄 삭제
u                  # 실행 취소
/localhost         # localhost 검색 (n 으로 다음)

# 저장하고 나가기 (명령 모드에서 : 입력)
:w                 # 저장
:q                 # 나가기
:wq                # 저장하고 나가기
:q!                # 저장하지 않고 강제로 나가기

가장 중요한 것은 Esc 와 :q! 입니다. 무언가 잘못됐을 때 Esc 를 누르고 :q! 로 나오면, 저장하지 않은 채 안전하게 빠져나올 수 있습니다.

실무 기준

vi 를 능숙하게 다룰 필요는 없습니다. 열고, 한 줄 고치고, 저장하고, 안전하게 나오는 것만 되면 서버 작업 대부분을 처리할 수 있습니다. 나머지는 필요할 때 하나씩 익혀도 늦지 않습니다.

체크

이 파트 완료 기준