728x90
반응형
Linux 시스템의 cacerts 파일은 Java 신뢰할 수 있는 인증서 저장소 (Java TrustStore) 입니다. 오래된 인증서를 제거하고 최신 인증서를 관리하는 것은 보안상 매우 중요합니다.

 

인증서 제거 절차

1. keytool 명령어 확인

Java TrustStore는 keytool로 관리합니다.
우선 keytool 경로와 Java 환경을 확인합니다.

which keytool
java -version

예시 TrustStore 경로:
/etc/alternatives/java_sdk/jre/lib/security/cacerts

2. 현재 저장된 인증서 목록 확인

sudo keytool -list -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit
  • 기본 패스워드: changeit (변경했으면 해당 패스워드 사용)
  • 주요 정보:
    • 별칭 (Alias)
    • 만료일
    • 인증기관 정보

3. 제거할 인증서 결정

  • 예전 인증서를 별칭(Alias) 기준으로 제거합니다.
  • 목록에서 예전 인증서를 찾고 별칭을 메모해 두세요.

4. 인증서 삭제 명령어

sudo keytool -delete -alias <alias_name> -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit
  • <alias_name>: 삭제할 인증서의 별칭
  • 예시:
sudo keytool -delete -alias old_cert -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit

5. 삭제 후 확인

sudo keytool -list -keystore /etc/alternatives/java_sdk/jre/lib/security/cacerts -storepass changeit

삭제된 인증서가 목록에서 사라졌는지 반드시 확인하세요.

📌 주의 사항

  • cacerts는 시스템 전역 Java 인증서 저장소입니다. 삭제 전 반드시 백업 하시기 바랍니다.
sudo cp /etc/alternatives/java_sdk/jre/lib/security/cacerts /etc/alternatives/java_sdk/jre/lib/security/cacerts.bak​
  • 패스워드를 변경했을 경우, changeit 대신 새 패스워드를 사용 하시기 바랍니다.
  • 일부 시스템에서는 경로가 다를 수 있습니다. 확인 후 정확한 경로 사용 필요.
728x90
반응형
728x90
반응형

 

START_DT START_TIME END_DT END_TIME
20250427 001003 20250427 001238
20250427 001003 20250427 001120
20250427 001003 20250427 001145
20250427 001500 20250427 005432

 

값중에서 START_TIME과 END_TIME의 차이를 초로 계산하는 방법

 

START_DT START_TIME END_DT END_TIME 차이 (초)
20250427 001003 20250427 001238 155
20250427 001003 20250427 001120 77
20250427 001003 20250427 001145 102
20250427 001500 20250427 005432 2372

 

Excel 함수로 변환 공식

만약 A1 셀에 021320처럼 숫자 형태로 입력되어 있다고 가정할 때, 이를 초(second)로 변환하는 공식은 다음과 같습니다:

=INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100)

설명

부분의미
INT(A1/10000) 시(hour) 추출
MOD(A1,10000)/100 분(minute) 추출
MOD(A1,100) 초(second) 추출
각각 시는 ×3600, 분은 ×60을 해서 모두 초로 변환 후 합산  

두 값의 초 차이 구하는 공식

예를 들어,

  • A1 = 021320
  • B1 = 021428
    이렇게 두 값이 있다고 하면, 두 값의 초 차이를 구하는 공식은:
=(INT(B1/10000)*3600 + INT(MOD(B1,10000)/100)*60 + MOD(B1,100)) 
- (INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100))

결과

  • 위 수식을 입력하면,
  • B1 - A1의 초 단위 차이가 바로 계산됩니다.

추가 팁

  • 결과를 분:초 형식으로 보고 싶으면 =TEXT(초값/86400,"[mm]:ss") 형식으로 변환할 수도 있습니다.
  • 예를 들어 위 공식 결과가 68초라면,
    =TEXT(68/86400,"[mm]:ss") 로 01:08처럼 표시할 수 있습니다.

결과를 시:분:초 (hh:mm:ss) 형식으로 변환

엑셀에서는 시간 = 초 / 86400 을 하면 시간 형식으로 바꿀 수 있습니다.
(하루 = 24시간 × 60분 × 60초 = 86400초)

=TEXT(
   ((INT(B1/10000)*3600 + INT(MOD(B1,10000)/100)*60 + MOD(B1,100)) 
   - (INT(A1/10000)*3600 + INT(MOD(A1,10000)/100)*60 + MOD(A1,100))) / 86400,
   "hh:mm:ss"
)

결과 예시

위 식을 적용하면 668초 → 00:11:08 로 출력됩니다.

추가 팁

  • TEXT(..., "hh:mm:ss")로 표시 형식을 지정하지 않으면 엑셀이 소수로 인식할 수 있으므로 반드시 TEXT로 감싸거나, 셀 서식을 **사용자 지정 → hh:mm:ss**로 설정하세요.
728x90
반응형
728x90
반응형

HTTP Request Smuggling (요청 스머글링)이란?

**HTTP 요청 스머글링(HTTP Request Smuggling, HRS)**이란,
**프론트엔드 서버(리버스 프록시, 로드 밸런서 등)**와 백엔드 서버(애플리케이션 서버)
HTTP 요청 해석 차이점을 악용하여 요청을 변조하거나 몰래 끼워 넣는 공격 기법을 의미합니다.

간단히 말하면,

"앞단 서버는 하나의 요청이라 생각했지만, 뒷단 서버는 두 개 이상의 요청으로 인식하여
공격자가 숨겨둔 악의적 요청이 몰래 처리되는 것"
이라고 할 수 있습니다.

어떻게 발생하는가?

HTTP 요청 본문의 길이를 명시하는 Content-Length 헤더와
요청을 여러 개로 구분하는 Transfer-Encoding: chunked 헤더의 해석 차이를 이용합니다.

  • 프론트 서버와 백엔드 서버가 서로 다르게 이 두 헤더를 해석하면,
  • 공격자가 숨긴 두 번째 요청이 정상 요청에 끼워 넣어져 처리될 수 있습니다.

예시 흐름

POST / HTTP/1.1
Host: example.com
Content-Length: 50
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: example.com
 
  • 프론트 서버는 Content-Length를 기준으로 해석하여 요청 완료라 판단하지만,
  • 백엔드 서버는 Transfer-Encoding을 기준으로 해석하여 뒤의 숨은 GET 요청을 별개로 처리할 수 있습니다.

주요 공격 결과

공격 효과설명
요청 가로채기 다른 사용자의 요청을 탈취할 수 있습니다.
세션 하이재킹 세션 토큰 탈취 가능.
캐시 포이즈닝 잘못된 응답을 캐시하여 불특정 다수에게 악성 응답을 제공할 수 있습니다.
비인가 요청 전송 관리자 페이지 접근, CSRF 보조 공격 등.

방어 및 대응 방법

대응 방법세부 설명
단일 길이 기준 강제화 Content-Length 또는 Transfer-Encoding 중 하나만 허용.
HTTP 요청 일관성 검사 서버 간 동일한 해석 기준 유지 (엄격한 RFC 준수).
최신 웹서버/프록시 업데이트 nginx, Apache, HAProxy 등의 보안 패치 적용.
WAF 규칙 강화 WAF(Web Application Firewall)에서 의심 요청 차단.
input validation 강화 HTTP 요청 헤더와 바디를 철저히 검증.

덧붙여

HTTP Request Smuggling은 2005년에 처음 발견되었으나,
2020년대 이후 클라우드 환경, API Gateway, Reverse Proxy 사용 증가로 인해 다시 부각되었습니다.
특히 Android 앱에서도 백엔드와 통신할 때 리버스 프록시를 거치는 경우, 서버 측 대응이 매우 중요합니다.

 

추가로

Android App 관점에서 HTTP Request Smuggling 대응 가이드

1. 앱 내부 네트워크 통신 라이브러리 설정 강화

Android 앱은 보통 OkHttp, Retrofit, HttpURLConnection 등을 통하여 서버와 통신합니다.
이를 사용하는 경우, 기본 설정만으로는 일부 우회 시도가 가능할 수도 있으므로, 아래를 꼭 지켜야 합니다.

OkHttp / Retrofit 대응

  • HTTP/1.1 또는 HTTP/2 명시적 사용 (HTTP/0.9, HTTP/1.0은 지원 차단)
  • Transfer-Encoding: chunked 사용 최소화
  • Content-Length 헤더의 일관성 확보 (명시적 지정 권장)
val client = OkHttpClient.Builder()
    .protocols(listOf(Protocol.HTTP_1_1, Protocol.HTTP_2))
    .build()
  • Interceptor 추가로 비정상 요청 방어
class HeaderValidationInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val headers = request.headers

        // 의심스러운 헤더 검증
        if (headers.names().any { it.equals("Transfer-Encoding", ignoreCase = true) }
            && headers.names().any { it.equals("Content-Length", ignoreCase = true) }) {
            throw IOException("Invalid HTTP headers detected: Smuggling risk.")
        }

        return chain.proceed(request)
    }
}

// 적용 예시
val safeClient = OkHttpClient.Builder()
    .addInterceptor(HeaderValidationInterceptor())
    .build()

 

2. 서버와 통신 시 HTTPS 강제 사용

  • 반드시 HTTPS 통신만 허용할 것.
  • 앱의 network_security_config.xml을 설정하여 **Cleartext Traffic(HTTP)**을 차단할 것.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
  • AndroidManifest.xml에도 반영
<application
    android:networkSecurityConfig="@xml/network_security_config"
    android:usesCleartextTraffic="false">
 

3. 서버 측 검증 동시 강화

비록 앱에서 요청을 조심하더라도,
**서버(백엔드)**가 최종적으로 요청을 검증하고 해석하므로 서버단에서도 반드시 다음을 해야 합니다 :

서버 측 조치설명
Proxy, LB 업데이트 nginx, HAProxy 등을 최신 버전으로 유지.
Content-Length/Transfer-Encoding 혼용 차단 둘 중 하나만 허용하거나, 둘 모두 존재할 경우 요청 거부.
Request size 제한 요청 본문 크기에 상한 설정 (예: 8KB 제한).
경계 테스트 수행 BurpSuite, OWASP ZAP 등으로 Smuggling 테스트.

4. 취약점 대응 주기적 점검

  • 앱과 서버 모두 대상으로 OWASP ASVS 4.0 기준을 활용하여 정기 점검을 수행할 것.
  • OWASP HTTP Request Smuggling Cheat Sheet를 참조하여 공격 패턴 업데이트 및 방어할 것.

HTTP Request Smuggling Cheat Sheet (OWASP)

맺음말

"애초에 요청이 올바르게 구성되도록 하고, 서버가 의심스러운 요청을 철벽같이 막아내는 것이
HTTP Request Smuggling을 완전히 차단하는 길"입니다.

 

Android 앱에서도 '안전한 요청 생성'은 매우 중요하니,
앱 단에서부터 안전한 통신을 기본으로 삼고, 서버와의 협력 체계를 단단히 다지는 것이 필수라 할수 있습니다.

728x90
반응형
728x90
반응형

jQuery 1.4에서 jQuery 3.5(또는 3.x 최신 버전)로 업그레이드하는 데 소요되는 시간은 웹 애플리케이션의 규모, jQuery 의존도, 사용자 정의 코드의 복잡도에 따라 달라집니다. 다음은 일반적인 상황에서의 추정과 주요 고려사항입니다.

예상 소요 시간

업무 범위작업 항목예상 소요 시간
사전 분석 및 계획 사용 중인 jQuery 기능 목록화, 호환성 확인 0.5 ~ 1일
라이브러리 교체 및 기본 테스트 jQuery 3.5로 교체, Migrate 플러그인 적용 0.5일
기능 점검 및 수정 비호환 API, deprecated 기능 수정 (예: .bind(), .size(), .live() 등) 1 ~ 3일
UI/UX 테스트 주요 브라우저 및 기기 호환성 점검 1 ~ 2일
최종 배포 및 리그레션 테스트 CI/CD 배포 및 회귀 테스트 0.5 ~ 1일

총 예상 기간: 약 3 ~ 7일 (기준: 중간 규모 단일 SPA 또는 jQuery 위주의 레거시 웹사이트 기준)


주요 고려사항

1. jQuery Migrate 플러그인 도입

  • jquery-migrate-3.4.1.js를 먼저 삽입하여 deprecated 기능을 경고로 확인
  • 콘솔 로그에서 호환성 경고를 통해 수정 대상 API 파악 가능

2. 대체 API 매핑

제거된 기능대체 방법
.size() .length
.bind() / .unbind() .on() / .off()
.live() .on() (동적 요소에 대한 이벤트 바인딩 시 주의)
.toggle() (2개 이상의 함수 인자) 커스텀 함수로 대체 필요

3. jQuery 플러그인 호환성

  • 사용하는 타사 플러그인이 jQuery 3.x와 호환되는지 확인
  • 오래된 플러그인은 최신 버전이나 다른 대안으로 교체 필요

  • 가능한 경우 jQuery 제거를 고려해도 좋습니다 (예: Vue, React, vanilla JS 대체).
  • 다수의 페이지에 공통으로 로딩되는 경우, 점진적 전환(모듈 단위)보다는 전면 교체가 효율적일 수 있습니다.
  • 레거시 시스템에서는 jQuery 1.x 코드 스타일이 많이 섞여 있어 예상보다 수정량이 많을 수 있습니다.
728x90
반응형
728x90
반응형

리눅스에서 지정한 날짜 이전에 변경된 파일을 찾으려면 find 명령어를 -newermt 옵션과 조합하여 사용할 수 있습니다.

예시: 2023년 12월 31일 이전에 변경된 파일 찾기

find /path/to/search -type f ! -newermt "2024-01-01"

이 명령어는 2024-01-01 보다 이전에 마지막으로 수정된 파일들을 찾습니다.
! -newermt는 지정한 날짜 이전이라는 의미입니다.

설명

  • /path/to/search: 검색할 디렉토리 (예: . 현재 디렉토리)
  • -type f: 파일만 찾음 (디렉토리는 제외)
  • -newermt "YYYY-MM-DD": 해당 날짜 이후 수정된 파일
  • ! -newermt "YYYY-MM-DD": 해당 날짜 이전 수정된 파일

예시 사용

# 현재 디렉토리에서 2024년 1월 1일 이전에 수정된 파일 찾기 
find . -type f ! -newermt "2024-01-01"​

날짜와 시간까지 지정하고 싶다면?

find . -type f ! -newermt "2024-01-01 15:00"​

 

필요하다면 특정 확장자나 이름 패턴도 추가할 수 있어요:

# .log 파일 중에서 2024년 1월 1일 이전에 수정된 것 
find . -type f -name "*.log" ! -newermt "2024-01-01"​
728x90
반응형
728x90
반응형

 

brew에서 Package 설치 방법

brew install tree

 

brew에서 Package 제거 방법

 

우선 설치된 목록 확인 - brew list

% brew list
==> Formulae
autoconf		graphite2	libslirp	mysql-client	python@3.9
automake		guile		libssh		ncurses		qemu
bdw-gc			harfbuzz	libssh2		nettle		qt@5
c-ares			icu4c@76	libtasn1	nghttp2		readline
ca-certificates		isl		libtiff		ninja		ruby
cairo			jansson		libtool		nmap		snappy
capstone		jemalloc	libunistring	oniguruma	socat
cask			jenv		libusb		openblas	sqlite
cmake			jmeter		libx11		openjdk		telnet
cocoapods		jpeg		libxau		openjpeg	tesseract
coreutils		jpeg-turbo	libxcb		openssl@1.1	tesseract-lang
dlib			jq		libxdmcp	openssl@3	tree
dtc			leptonica	libxext		p11-kit		tree-sitter
emacs			libarchive	libxrender	pango		unbound
fontconfig		libb2		libyaml		pcre		vde
freetype		libcbor		little-cms2	pcre2		webp
fribidi			libev		llvm		pipx		wget
gcc			libevent	lua		pixman		xorgproto
gdbm			libffi		lz4		pkg-config	xz
gettext			libfido2	lzo		protobuf	z3
giflib			libidn2		m4		protobuf@21	zlib
git			liblinear	maven		putty		zsh-syntax-highlighting
glib			libmpc		md4c		pyqt@5		zstd
gmp			libnghttp2	mpdecimal	python@3.11
gnutls			libomp		mpfr		python@3.12
gradle			libpng		mysql		python@3.13

==> Casks
anaconda	flutter		temurin		temurin17	temurin@11	temurin@8
chromedriver	ngrok		temurin11	temurin8	temurin@17

 

brew list를 통해서 나온 결과는 설치한 package 목록이 나타나게 되며, 설치된 종류로 Formulae, Casks 가 있습니다.

 

 

Formulae 는 Mac 용 패키지 매니저이며, 터미널에서 패키지를 설치합니다. 패키지를 다운로드하고 컴파일 하는 방법 (바이너리를 받아 설치시키는 방법도 가능함)

  • ex) brew install git, brew install python3

Casks 는 homebrew의 확장으로 Mac용 GUI 애플리케이션을 명령어로 설치합니다. formula와 유사하지만 컴파일이 아닌 단일 바이너리를 설치하는 방법

  • ex) brew cask install google-chrome

오픈소스의 경우 Formulae 비중이 높고 패키지 설치 파일이나 바이너리로 배포되는 앱의 경우 Cask를 이용하는 경우가 많습니다.

 

제거할 package 이름을 확인한 다음 brew uninstall 을 이용하여서 제거

brew uninstall tree

 

 

728x90
반응형
728x90
반응형

인증(Authentication)과 인가 (Authorization, 권한 부여) 비교 – 특징 및 차이점

인증과 인가(혹은 권한 부여) 무엇이 다를까요? 인증 단계에서는 사용자의 신원을 확인합니다. 인가 권한 부여 단계에서는 신원이 확인된 사용자에게 리소스에 액세스할 있는 권한을 부여합니다.

인증과 인가가 비슷하게 들릴 수도 있지만 IAM(Identity and Access Management) 환경에서는 명확히 구분되는 보안 프로세스입니다.

인증에 대한 정의

인증은 사용자의 신원을 검증하는 행위로서 보안 프로세스에서 번째 단계입니다

인증 프로세스는 다음과 같이 구성됩니다.

  • 비밀번호사용자 이름과 비밀번호는 가장 많이 사용되는 인증 요소입니다. 사용자가 데이터를 올바르게 입력하면 시스템은 아이덴티티가 유효하다고 판단하고 액세스를 허용합니다.
  • 일회용 . 단일 세션이나 트랜잭션에 한하여 액세스를 허용합니다.
  • 인증 액세스를 허용하는 외부 기관을 통해 보안 코드를 생성합니다.
  • 생체인식사용자가 시스템에 액세스하기 위해 지문이나 망막 스캔을 제출합니다

상황에 따라 인증 요소를 2가지 이상 성공적으로 확인해야만 시스템에 액세스할 있는 경우도 있습니다. 이러한 다중 요소 인증(MFA) 요건이 배포되어 비밀번호의 한계를 넘어 보안을 강화하는 경우도 많습니다.

인가 (권한 부여) 대한 정의

시스템 보안에서 인가란, 사용자에게 특정 리소스나 기능에 액세스할 있는 권한을 부여하는 프로세스를 말합니다. 용어는 흔히 액세스 제어나 클라이언트 권한을 서로 대체하여 사용되기도 합니다.

대표적으로, 서버에서 특정 파일을 다운로드할 있는 권한을 부여하거나, 개별 사용자에게 관리자 권한으로 애플리케이션에 액세스할 있는 권한을 부여하는 경우가 여기에 해당합니다.

보안 환경에서 권한 인증은 항상 인증 이후에 진행되어야 합니다. 사용자가 먼저 자신의 자격 증명을 입증하면 기업의 관리자가 해당 사용자에게 요청한 리소스에 액세스할 있는 권한을 부여합니다.

 

 

인증과 인가의 비교

인증과 인가는 로그인 프로세스에서 서로 다른 단계입니다. 따라서 IAM 솔루션을 성공적으로 구현하려면 둘의 차이점을 알고 있어야 합니다.

이를 비유적으로 설명해보겠습니다.

여기 가족이 휴가를 떠나 집에 홀로 남겨진 반려 동물을 보살피기 위해 누군가가 잠긴 문으로 다가가고 있습니다. 사람에게 필요한 것은 다음과 같습니다.

  • 열쇠 형태의 인증 필요합니다. 자격 증명을 정확하게 입력하는 사용자에 한해서 액세스가 허용되는 것처럼 현관 자물쇠에 맞는 열쇠를 가진 사람에게만 접근이 허용됩니다.
  • 출입 허가에 해당하는 인가 권한 부여가 필요합니다. 일단 안으로 들어가면 주방에 가서 반려 동물 사료가 보관된 찻장을 있는 권한 인증을 받게 됩니다. 하지만 침실에 들어가서 낮잠을 있는 권한은 없습니다

위의 예에서 인증과 권한 인증은 함께 작동합니다. 반려 동물 관리인은 집에 들어갈 있는 권한(인증) 있으며, 일단 내부로 입장하면 특정 영역에 접근할 있습니다(권한 인증).

  인증 (Authentication) 인가 (Authorization)
기능 자격 증명 확인 권한 허가/거부
진행 방식 비밀번호, 생체인식, 일회용 또는 보안 팀에서 관리하는 설정 사용
사용자가 있는가? 아니오
사용자가 직접 변경할 있는가? 부분적으로 가능 불가능 
데이터 전송 ID 토큰 사용 액세스 토큰 사용 

 

시스템도 동일한 방식으로 이러한 개념을 구현하므로 IAM 관리자는 가지 프로세스의 활용 방식에 대해 알고 있어야 합니다.

  • 인증선택한 인증 요건과 관련하여 적합한 자격 증명을 입력하는 직원에게 기업 시스템에 대한 액세스를 허용합니다.
  • 인가 (권한 부여). 부서별 파일에 액세스할 있는 권한을 부여하고, 필요할 경우 금융 정보 등의 기밀 데이터에 대한 액세스 권한도 갖습니다. 직원은 업무 수행에 필요한 파일에도 액세스할 있어야 합니다

인증과 인가의 차이점에 대해 알았다면 이제 프로세스를 확실하게 지원할 있는 IAM 솔루션을 구현해야 합니다. 이를 통해 기업의 데이터 유출을 막고 직원의 생산성을 더욱 높일 있습니다.

Okta 통한 권한 부여

Okta Lifecycle Management에서는 사용자 권한을 한눈에 확인하여 필요에 따라 시스템과 툴에 대한 액세스를 손쉽게 허용하거나 취소할 있습니다. 또한 Okta Adaptive MFA (Multi-factor Authentication, 다중 인증 요소)에서는 선택한 인증 요소를 통해 인프라를 안전하게 보호할 있습니다

예를 들어 기업 자격 증명과 음성 인식을 모두 사용해 인증에 성공하는 사용자에 한하여 생산 오더에 액세스하도록 허용할 있습니다

728x90
반응형
728x90
반응형

 

tail 명령어를 이용해 Tomcat 로그(catalina.out)를 실시간으로 모니터링하면서 별도 파일로 저장하는 방법입니다.

1. tail -f를 사용하여 로그 저장

가장 간단한 방법은 tail -f를 사용하여 로그를 저장하는 것입니다.

실행 명령어 (기본)

tail -f /path/to/tomcat/logs/catalina.out > /path/to/logs/my_tail.log​
  • tail -f: 로그를 실시간 모니터링
  • >: 출력 내용을 새로운 파일로 저장
  • 단점: 이 방식은 Ctrl + C로 종료하면 로그 저장도 멈춥니다.

2. tee를 사용하여 파일과 화면에 동시에 출력

tee 명령을 사용하면 로그를 파일에 저장하면서 동시에 터미널에 출력할 수 있습니다.

파일과 터미널 동시 출력

tail -f /path/to/tomcat/logs/catalina.out | tee -a /path/to/logs/my_tail.log​
  • tee -a: 파일에 추가(-a: append 모드)

장점

  • 로그를 실시간 확인하면서 저장 가능
  • 중간에 Ctrl + C로 종료해도 파일이 유지됨

3. nohup을 사용하여 백그라운드 실행

터미널을 닫아도 로그 저장이 계속되도록 하려면 nohup을 사용할 수 있습니다.

터미널 종료 후에도 로그 저장 유지

nohup tail -f /path/to/tomcat/logs/catalina.out > /path/to/logs/my_tail.log 2>&1 &​
  • nohup: 터미널 종료 후에도 실행 유지
  • 2>&1: 표준 에러 출력도 포함
  • &: 백그라운드 실행

백그라운드 프로세스 확인 및 종료

ps aux | grep tail
kill -9 <PID>  # 특정 프로세스 종료​

 

 

4. screen 또는 tmux를 사용하여 안정적인 로그 저장

만약 원격 서버에서 로그를 장시간 저장해야 한다면, screen 또는 tmux를 사용하는 것이 좋습니다.

screen을 이용한 로그 저장

screen -S tail_log
tail -f /path/to/tomcat/logs/catalina.out > /path/to/logs/my_tail.log​
  • Ctrl + A, D: 세션을 백그라운드로 보내기
  • 다시 접속: screen -r tail_log

5. cron을 이용한 로그 자동 저장 및 관리

일정 시간마다 로그를 저장하고 싶다면 cron을 사용하면 됩니다.

매일 로그 저장 (예: 00:00마다 실행)

crontab -e​

 

추가할 내용:

0 0 * * * tail -n 1000 /path/to/tomcat/logs/catalina.out > /path/to/logs/catalina_$(date +\%F).log​
  • 매일 자정(0 0 * * *)에 최근 1000줄을 새로운 파일로 저장
  • 날짜별(catalina_YYYY-MM-DD.log)로 저장됨

최종 정리 (추천 방법)

방법설명명령어
기본 로그 저장 로그를 파일로 저장 (터미널 닫으면 중단됨) tail -f catalina.out > my_tail.log
화면 + 파일 저장 실시간 확인하면서 저장 `tail -f catalina.out
터미널 종료 후에도 실행 백그라운드 실행 nohup tail -f catalina.out > my_tail.log 2>&1 &
원격 서버에서 사용 screen을 활용하여 안정적 실행 screen -S tail_log + tail -f catalina.out > my_tail.log
자동 로그 저장 cron으로 일정 시간마다 저장 crontab -e

이제 상황에 맞게 tail 로그를 별도로 저장할 수 있습니다! 🚀

728x90
반응형
728x90
반응형

1. sed 사용 (빠르고 간편)

sed -n '1000,$p' catalina.out > new_output.out
  • 1000,$p: 1000번째 줄부터 끝까지 출력 ($는 마지막 줄 의미)
  • > new_output.out: 결과를 new_output.out 파일에 저장

장점: 빠르고 간단하며 대용량 파일에도 적합
단점: 원본 파일이 너무 크면 속도가 느릴 수도 있음

2. tail 사용 (끝에서 특정 줄을 기준으로 복사)

tail -n +1000 catalina.out > new_output.out
  • -n +1000: 1000번째 줄부터 끝까지 출력
  • > new_output.out: 새로운 파일에 저장

장점: 속도가 빠르며 메모리 사용량이 적음
단점: tail 명령이 특정 시스템에서 동작 방식이 다를 수도 있음

3. awk 사용 (유연한 처리 가능)

awk 'NR>=1000' catalina.out > new_output.out
  • NR>=1000: 1000번째 줄부터 끝까지 출력

장점: 조건을 추가하여 더 세밀한 조정 가능 (예: 특정 패턴 이후부터 복사)
단점: sed보다는 약간 느릴 수 있음

4. Python 스크립트 사용 (복잡한 조건 적용 가능)

with open("catalina.out", "r") as infile, open("new_output.out", "w") as outfile:
    for i, line in enumerate(infile, start=1):
        if i >= 1000:
            outfile.write(line)
  • enumerate()를 사용하여 1000번째 줄부터 출력
  • Python을 사용하면 정규식 필터링도 가능

💡 장점: 복잡한 조건을 적용 가능 (예: 특정 문자열 이후부터 복사)
💡 단점: 스크립트를 실행해야 해서 번거로울 수 있음

추천 방법

  • 빠르게 처리하고 싶다면 → sed 또는 tail
  • 유연한 조건이 필요하다면 → awk
  • 복잡한 패턴 분석이 필요하다면 → Python

어떤 방법이든, 특정 라인부터 원하는 대로 catalina.out을 복사할 수 있습니다! 

728x90
반응형
728x90
반응형

 

MySQL 백업 파일(.sql.gz)을 복원하려면 먼저 압축을 풀고 mysql 명령어를 사용해야 합니다.

방법 1: 압축을 풀면서 바로 복원

.gz 파일을 압축 해제 없이 직접 MySQL로 복원할 수 있습니다.

gunzip -c backup.sql.gz | mysql -u [username] -p [database_name]

설명

  • gunzip -c backup.sql.gz: 압축 해제된 내용을 표준 출력(stdout)으로 보냄.
  • | mysql -u [username] -p [database_name]: 해제된 SQL을 바로 MySQL로 복원.
  • -p 입력 후 비밀번호를 입력해야 합니다.

예제

gunzip -c mybackup.sql.gz | mysql -u root -p mydatabase
  • mybackup.sql.gz의 내용을 mydatabase에 복원.

 

방법 2: 압축을 먼저 풀고 복원

.gz 압축을 먼저 풀고 .sql 파일을 복원하는 방법입니다.

1. 압축 해제

gunzip backup.sql.gz
  • backup.sql.gz → backup.sql로 압축 해제됨.

2. MySQL로 복원

mysql -u [username] -p [database_name] < backup.sql

💡 예제

mysql -u root -p mydatabase < backup.sql

 

방법 3: zcat을 사용한 직접 복원

Linux에서 zcat을 활용하면 압축을 풀면서 즉시 복원할 수 있습니다.

zcat backup.sql.gz | mysql -u [username] -p [database_name]

💡 예제

zcat mybackup.sql.gz | mysql -u root -p mydatabase

추가 옵션

1. 복원 진행 상태 보기

기본적으로 mysql 명령어로 복원하면 진행 상태가 보이지 않지만, 다음과 같이 하면 진행 상황을 확인할 수 있습니다.

gunzip -c backup.sql.gz | pv | mysql -u [username] -p [database_name]
  • pv 명령어는 데이터 처리 속도 및 진행률을 표시합니다.
  • 설치 필요: sudo apt install pv (Ubuntu) 또는 sudo yum install pv (CentOS)

2. 특정 테이블만 복원

.gz 파일에서 특정 테이블만 복원하려면 압축 해제 후 수동 편집해야 합니다.

gunzip -c backup.sql.gz | grep -i 'INSERT INTO table_name' | mysql -u [username] -p [database_name]
  • grep을 활용하여 특정 테이블만 필터링할 수도 있음.

 

복원 전 확인해야 할 사항

1. 데이터베이스가 존재하는지 확인

mysql -u root -p -e "SHOW DATABASES;"
  • 데이터베이스가 없으면 먼저 생성:
mysql -u root -p -e "CREATE DATABASE mydatabase;"

 

2. 백업 파일 크기 확인

ls -lh backup.sql.gz
  • 너무 큰 경우 screen이나 nohup을 사용하여 백그라운드에서 실행 가능.

3. 기존 데이터 백업 복구 전에 현재 데이터를 백업하는 것이 안전합니다.

mysqldump -u root -p mydatabase > mydatabase_backup.sql

 

 

결론

방법명령어

압축 풀면서 복원 `gunzip -c backup.sql.gz
압축 해제 후 복원 gunzip backup.sql.gz → mysql -u root -p mydatabase < backup.sql
zcat 활용 `zcat backup.sql.gz
진행률 표시 (pv) `gunzip -c backup.sql.gz

가장 빠른 방법은 gunzip -c 또는 zcat을 사용한 실시간 복원입니다.
하지만 데이터 크기에 따라 미리 gunzip으로 압축을 풀고 복원하는 방법이 더 안정적일 수 있습니다. 

728x90
반응형

+ Recent posts