프로그래밍

Linux

바이오닉크로니클 2025. 1. 22. 17:17

디렉터리 확인없이 전체 삭제

rm -d -R nihonngo -f

디렉터리 내 파일 있는 경우에도 삭제

rm -r 디렉터리명

강제 삭제

rm -rf 디렉터리명

시스템 재부팅

sudo reboot

CLI에서 글자 빠르게 지우기

  • Ctrl + U: 커서부터 줄의 시작까지 지우기
  • Ctrl + K: 커서부터 줄의 끝까지 지우기
  • Ctrl + W: 커서 왼쪽의 한 단어 지우기
  • Ctrl + H: 커서 왼쪽의 한 글자 지우기 (백스페이스와 동일)

현재 줄 전체를 지우려면 ctrl + u를 사용한다.

linux 파일명 공백 처리

-rw-rw-r--. 1 ec2-user ec2-user 1589 Jul 13 15:33  나폴리탄.txt
-rw-rw-r--. 1 ec2-user ec2-user  758 Jul 13 15:33 '소녀의 일기장 패러디.txt'
-rw-rw-r--. 1 ec2-user ec2-user 1058 Jul 13 15:33 '소녀의 일기장 패러디2.txt'
-rw-rw-r--. 1 ec2-user ec2-user 1306 Jul 13 15:33 '소녀의 일기장.txt'

linux에선 명령어와의 혼동을 방지하기 위해 파일명에 공백이 들어가면 '나 "로 묶어야 한다.
그래서 파일명은 _를 붙이는 게 좋다.

파일 읽기

파일읽기는 큰 파일일수록 cat이나 vi보단 less가 좋다.
내부에서 검색어 검색, 페이지 이동, 줄번호 표시 등을 할 수 있다.

shift + page up, down으로 터미널 페이지 이동을 할 수 있다.

terminal에서 shift + 위아래 방향키로 1페이지씩 이동이 된다.
motaxterm에서도 마찬가지인데 ctrl + shift + 위아래 방향키로 첫, 마지막 페이지로 이동할 수도 있다.

디렉터리 재귀로 강제 삭제

sudo rm -d -R -f 202407_1

디렉터리 재귀 복사

cp -r

디렉터리 용량 확인

du -sh /home/urongrong/service

find 옵션

202406 포함된 것만 이동

find . -type f -name '*202406*' -exec mv {} /path/to/destination/ \;

find .: 현재 디렉터리(.)와 그 하위 디렉터리에서 파일을 찾는다.
-type f: 파일 타입이 일반 파일인 것만 검색한다.
-name: *202406*: 파일명에 202406이 포함된 파일을 검색한다. 와일드카드(*)를 써서 앞뒤에 다른 문자가 올 수 있음을 지정한다.
-exec mv {} /path/to/destination/ \;: 찾은 파일({})을 지정한 경로 /path/to/destination/로 이동한다. \;-exec 명령어의 종료를 나타낸다.

파일 타입 종류

설명
f 일반 파일(regular file)
d 디렉터리(directory)
l 심볼릭 링크(symbolic link)
c 문자 디바이스(character device)
b 블록 디바이스(block device)
s 소켓(socket)
p FIFO(이름 있는 파이프, named pipe)
- 일반 파일  
일반 파일은 텍스트 파일, 바이너리 파일, 실행 파일 등으로 일반적으로 쓰는 파일이다.  
  • 문자 디바이스
    문자 디바이스는 문자 단위로 데이터를 처리하는 디바이스 파일이다.
    데이터를 한 글자(1바이트)씩 순차적으로 읽거나 쓴다.
    입력과 출력이 연속적이고 순차적이다.
    주로 키보드, 마우스, 터미널 같은 입력/출력 장치에서 사용된다.

/dev/tty (터미널 디바이스)
/dev/input/mouse0 (마우스 디바이스)
/dev/console (콘솔 디바이스)

  • 블록 디바이스
    블록 디바이스는 데이터를 블록 단위로 처리하는 디바이스 파일이다.
    데이터를 고정된 크기의 블록 단위로 읽거나 쓴다.
    무작위 접근(Random Access)이 가능하며, 파일 시스템이나 저장 장치에서 사용된다.
    주로 하드디스크, SSD, USB 드라이브 같은 저장 매체에서 사용된다.

/dev/sda (SCSI 하드 디스크)
/dev/nvme0n1 (NVMe SSD)
/dev/loop0 (루프백 디바이스)

  • SCSI
    SCSI는 Small Computer System Interface의 약자이며 데이터 저장 장치를 연결하기 위한 표준이다.
    고속 데이터 전송이 가능하며 서버나 워크스테이션에서 주로 사용한다.
    일반적으로 하드 디스크나 SSD에서 사용되며 디스크 드라이브를 /dev/sda, /dev/sdb 등으로 식별한다.
    최신 SCSI 표준은 여러 병렬 작업을 지원하며 SAS(Serial Attached SCSI)와 같이 직렬 인터페이스를 사용한다.
  • /dev/sda: 첫 번째 SCSI 디스크
  • /dev/sdb: 두 번째 SCSI 디스크

대량의 데이터를 처리하는 서버 환경에서 주로 사용한다.

  • NVMe SSD
    NVMe는 Non-Volatile Memory Express의 약자로 초고속 저장 장치를 위한 프로토콜이다.
    기존의 SATA 방식 SSD보다 훨씬 빠른 속도를 제공한다.
    PCIe(Peripheral Component Interconnect Express) 인터페이스를 사용하여 데이터 전송 속도를 극대화한다.
    NVMe는 높은 IOPS(초당 입출력 작업 수)를 지원하여 데이터 액세스 속도가 빠르다.
  • 루프백 디바이스(Loopback Device)
    루프백 디바이스는 가상 블록 디바이스이다.
    실제 물리적인 디스크가 아닌 파일을 디스크처럼 사용하도록 만들어준다.
    주로 디스크 이미지 파일을 마운트하거나 테스트 환경을 구축할 때 사용된다.

ISO 파일을 마운트하여 파일 시스템처럼 접근할 수 있다.
시스템에서 /dev/loop0, /dev/loop1 등으로 표시된다.

  • 디스크 이미지 파일 생성
  • dd if=/dev/zero of=disk.img bs=1M count=100
  • 루프백 디바이스 연결
  • losetup /dev/loop0 disk.img
  • 마운트
  • mkfs.ext4 /dev/loop0 # 파일 시스템 생성 mount /dev/loop0 /mnt
  • FIFO(이름 있는 파이프, Named Pipe)
    프로세스 간 통신(IPC, Inter-Process Communication)을 위해 데이터를 한 방향으로만 전달하는 특수 파일이다.
    선입선출(First In, First Out) 방식으로 데이터를 처리한다.
    파일처럼 보이지만 실제론 메모리 상의 통신 채널이다.
    한 프로세스가 데이터를 쓰고, 다른 프로세스가 읽는다.
    일반 파이프(|)는 일시적이지만, FIFO는 이름을 가진 파일 형태로 존재한다.
  • FIFO 파일 생성
  • mkfifo my_pipe
  • 생성된 FIFO 파일
  • ls -l prw-r--r-- 1 user user 0 Jan 21 12:00 my_pipe
  • 프로세스 간 사용
  • echo "Hello" > my_pipe & # 데이터 쓰기 cat < my_pipe # 데이터 읽기

패턴 매칭으로 20240701~20240715까지 이동

find . -type f -regextype posix-extended -regex '.*2024070[1-9].*|.*2024071[0-5].*' -exec mv {} /data/work/202407 \;

find .
현재 디렉터리(.)와 그 하위 디렉터리를 검색한다.

-type f
검색 대상: 일반 파일만 검색한다.
디렉터리나 심볼릭 링크는 제외된다.

-regextype posix-extended
정규식의 POSIX Extended로 설정한다.
기본적으로 fine 명령에서 쓰는 정규식은 POSIX Basic 정규식을 따른다.
posix-extended를 사용하면 더 간단하고 유연한 정규식 표현식을 사용할 수 있다.

-regex '.*2024070[1-9].*|.*2024071[0-5].*'
정규식을 사용해 파일 이름 패턴을 지정한다.
'로 둘러싸인 문자열이 정규식 조건이다.
파일 이름이 아래 조건을 만족하면 검색 결과에 포함된다.
1. 2024070[1-9]
파일 이름에 20240701 ~ 20240709 패턴이 포함된 경우
2. 2024071[0-5]
파일 이름에 20240710 ~ 20240715 패턴이 포함된 경우

.*
정규식에서 임의의 문자열을 뜻한다. 파일 이름에 정규식 조건이 포함되면 검색된다.

|
정규식의 OR 조건으로 둘 중 하나라도 만족하면 파일을 찾는다.

-exec mv {} /data/work/202407 \;
찾은 파일을 이동시킨다.

-exec: find가 찾은 각 파일에 대해 지정된 명령을 실행한다.
mv: 파일 이동
{}: find가 찾은 파일 이름이 여기에 대입된다.
/data/work/202407: 파일을 이동시킬 목적지 디렉터리
\;: -exec 명령의 종료를 의미한다.


현재 디렉터리(.)와 하위 디렉터리에서 모든 일반 파일을 검색한다.
파일 이름이 20240701 ~ 20240715 패턴과 일치하는 경우에만 선택된다.
선택된 파일은 /data/work/202407 디렉터리로 이동된다.

시스템 접속 기록 확인

접속 로그

last

로그인 실패 로그

lastb

계정별 접속 로그

lastlog

한 번이라도 접속한 계정 접속기록 확인

lastlog | grep -v "Never"

현재 디렉터리 및 하위 디렉터리의 모든 파일 소유자, 그룹 변경

sudo chown -R urongrong:urongrong .

mv

mv 2407* 원본

따로 파일명을 주지 않으면 기존 파일명으로 이동한다.

ip 조회방법

ifconfig
ip addr show
hostname -I

내부 ip만 나온다. 서버가 라우터나 방화벽 뒤에 있을 때 NAT(Network Address Translation)를 통해 내부 IP 주소만 할당돼 있기 때문이다. 공인 IP(외부에서 접근 가능한 IP)는 라우터나 방화벽에서 할당하고, 서버 자체엔 내부 IP만 할당될 수 있다. 공인 IP를 확인하려면 외부 네트워크를 통해 확인하는 방법이 필요하다.

curl로 공인 IP를 확인할 수 있다.
curl ifconfig.me

포트 사용현황 확인

netstat -tuln | grep :3000

3000번 포트의 사용 현황을 확인한다.

  • -t: TCP 프로토콜 연결 표시
  • -u: UDP 프로토콜 연결 표시
  • -l: 현재 열려 있는 포트(수신 대기 중인 상태, Listening) 표시
  • -n: IP 주소와 포트를 숫자 형식으로 표시(도메인 이름이나 서비스 이름 대신 숫자로 표시)
  • -a: 모든 네트워크 연결과 대기 중인 포트 표시
  • grep :포트번호: 특정 포트번호 필터링
[urongrong@hallo nihonngo]$ netstat -tuln | grep :3000
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN 

kill 명령어 오류시

kill -9 2184

-bash: kill: (2184) - Operation not permitted`

권한이 없어 발생할 수 있다.

sudo kill -9 2184

메모리가 부족할 땐 top으로 프로세스 조회 후 불필요하게 메모리를 쓰는 프로세스를 종료시킨다.

ping과 telnet

네트워크 연결 상태를 확인할 때 ping과 telnet을 사용한다.

  1. ping
    네트워크 연결을 확인할 때 사용한다.

ping은 호스트(서버)와의 연결 여부 및 응답 속도를 확인하는 명령어이다.
ICMP(Internet Control Message Protocol)를 사용하여 네트워크 상태를 테스트한다.

  • 네트워크 연결 확인
  • 응답 속도 측정
    • 네트워크 지연(Latency)을 측정
  • 연결 안정성 확인
    • 패킷 손실 여부 및 네트워크 품질 확인
  • 기본 명령어
  • ping [호스트 또는 IP 주소] ping google.com
  • 출력 예시
  • ping google.com (142.250.190.14): 56 data bytes 64 bytes from 142.250.190.14: icmp_seq=0 ttl=115 time=15.6 ms 64 bytes from 142.250.190.14: icmp_seq=1 ttl=115 time=15.2 ms 64 bytes from 142.250.190.14: icmp_seq=2 ttl=115 time=15.4 ms
  • time: 응답 시간(밀리초 단위)
  • icmp_seq: 패킷 시퀀스 번호
  • ttl: 패킷의 유효 시간(수명, Time To Live)

그러나 방화벽에서 ICMP 트래픽을 차단하면 동작하지 않을 수 있다.
TCP/UDP 포트 상태 확인은 불가능하다.

  1. telnet
    TCP 포트의 연결을 확인할 때 쓴다.
    telnet은 특정 TCP 포트에 연결하여 서비스가 동작 중인지 확인한다.
    네트워크 연결 문제를 진단하고, 애플리케이션(서버)의 특정 포트가 열려 있는지 테스트한다.
  2. TCP 포트 상태 확인
    • 포트가 열려 있고, 서비스가 실행 중인지 확인
  3. 서비스 테스트
    • HTTP, SMTP, FTP 등의 서비스와 직접 통신 테스트
  4. 애플리케이션 디버깅
    • 서버가 요청을 정상적으로 처리하는지 확인
  • 명령어
  • telnet [호스트] [포트] telnet example.com 80
  • 포트 열린 경우
  • Trying 93.184.216.34... Connected to example.com. Escape character is '^]'.
  • 포트 닫힌 경우
  • Trying 93.184.216.34... telnet: Unable to connect to remote host: Connection refused

그러나 암호화가 지원되지 않고(기본적으로 평문으로 전송) UDP 기반 서비스 테스트가 불가하다.

  • ping과 telnet의 비교
특징 ping telnet
프로토콜 ICMP TCP
테스트 대상 호스트의 도달 가능 여부 특정 포트 상태 및 서비스 동작 여부
사용 목적 네트워크 연결 확인, 응답 속도 측정 포트 열림 확인, 서비스 테스트
한계 방화벽에 의해 차단될 수 있음 암호화 미지원, UDP 테스트 불가
사용 시나리오 서버가 네트워크에 연결되어 있는지 확인 웹 서버의 80번 포트가 열려 있는지 확인

ping은 네트워크 연결 상태와 응답 시간을 간단히 확인하고 싶을 때 사용하고, telnet은 특정 TCP 포트에서 서비스가 실행 중인지 확인하거나 직접 통신 테스트를 하고 싶을 때 사용한다.
네트워크 문제를 디버깅하기 위해 쓰는 것이다.

tar, gz 압축유형

zipfile.tar.gz

사용자 생성

sudo adduser urongrong

사용자 삭제(Red Hat 기반 시스템)

sudo userdel -r ulonglong

-r 옵션으로 홈 디렉토리와 메일 스풀을 같이 제거할 수 있다.

사용자에 다른 사용자 권한 부여

EC2 인스턴스에서 기본 사용자 ec2-user와 동일한 권한을 새로운 사용자에게 부여하려면, ec2-user가 속한 그룹에 새로운 사용자를 추가하면 된다.

ec2-user는 여러 그룹에 속해 있을 수 있다. 먼저 ec2-user의 그룹 목록을 확인고 해당 그룹에 새로운 사용자를 추가한다.

ec2-user가 속한 그룹 확인

groups ec2-user

출력예시

ec2-user : ec2-user wheel systemd-journal

이 예시에서 ec2-user는 ec2-user, wheel, systemd-journal 그룹에 속해 있다.

새로운 사용자에게 동일한 그룹 권한 부여

새로운 사용자를 각 그룹에 추가한다.

sudo usermod -aG ec2-user urongrong
sudo usermod -aG wheel urongrong
sudo usermod -aG systemd-journal urongrong

추가 확인

사용자가 그룹에 정상적으로 추가됐는지 확인하기 위해 urongrong의 그룹 목록을 확인한다.

groups urongrong

출력예시

urongrong : urongrong ec2-user wheel systemd-journal

이제 newuser는 ec2-user와 동일한 그룹 권한을 갖게 되어 ec2-user와 동일한 수준의 접근 권한을 갖는다.

이런 식으로 사용자가 다른 사용자와 동일한 권한을 가지도록 설정할 수 있다.

usermod 명령어의 -aG 옵션

usermod 명령어의 -aG 옵션은 새로운 사용자를 기존 그룹에 추가하는 데 사용된다.

-a (append): 현재 사용자가 속한 기존 그룹에 새로운 그룹을 추가한다. 이 옵션을 사용하지 않으면 사용자는 지정된 그룹에만 속하게 되며, 다른 그룹에서 제거된다.
-G (groups): 사용자를 추가할 그룹을 지정한다. 여러 그룹을 쉼표로 구분하여 지정할 수 있다.

  • urongrong을 ec2-user와 wheel 그룹에 추가
    sudo usermod -aG ec2-user,wheel urongrong

숨긴파일 보기

ll -a

디렉터리 이동

sudo mv /home/ec2-user/tools /home/urongrong/tools
sudo mv /home/ec2-user/japanese /home/urongrong/japanese
sudo mv /home/ec2-user/logs /home/urongrong/logs
sudo mv /home/ec2-user/modules /home/urongrong/modules

다른 사용자 디렉터리로도 옮길 수 있다.

password 없이 sudo 사용

sudo vi /etc/sudoers에서 사용권한을 준다.

urongrong ALL=(ALL) NOPASSWD:ALL

# Allow urongrong to run any command without password
주석은 이런 식으로 줄 수 있다.

맨 밑의 설정이 확정이기에 맨 아래쪽에 작성한다.

권한을 주고 나서 sudo를 실행하여 확인한다.
sudo whoami

이 설정을 하지 않으면 sudo를 쓸 때마다 root 패스워드를 입력해야 한다.

git 설치 확인 및 설치

sudo apt install git   # Debian/Ubuntu
sudo yum install git   # Red Hat/CentOS

git repository clone

git clone <repository_url>

설치된 패키지 리스트 확인

dnf list installed

패키지 삭제

sudo dnf remove golang

시스템 볼륨 확장하기

디스크와 파티션 확인

lsblk

파티션 크기 확장

sudo growpart /dev/xvda 1

파일 시스템 크기 확장(시스템 유형에 따라 다름)

sudo resize2fs /dev/xvda1 # ext2/ext3/ext4
sudo xfs_growfs /dev/xvda1 # XFS

파일 시스템 용량 확인

df -h

mount

[urongrong@hallo ~]$ df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             951M  1.1M  950M   1% /dev/shm
tmpfs             381M  5.3M  375M   2% /run
/dev/nvme0n1p1     60G   43G   18G  72% /
tmpfs             951M  196K  951M   1% /tmp
/dev/nvme0n1p128   10M  1.3M  8.7M  13% /boot/efi
tmpfs             191M     0  191M   0% /run/user/1002
tmpfs             191M     0  191M   0% /run/user/1001

df -h 출력 결과이다.
각 파일 시스템이 어떤 디렉터리에 연결(mounted) 되어 있는지 나타낸다.

환경변수 출력

echo $JAVA_OPTS
echo $CATALINA_OPTS

hostnamectl

hostnamectl

시스템의 호스트명, OS 버전, 커널 버전 등 상세 정보를 제공한다.

텍스트 파일 전체 외부 복사

vi에서 텍스트 파일 전체 외부 복사는 별도 도구를 설치해야 가능하고 less도 복사 기능이 제한돼서 cat으로 내용 출력한 뒤 복사하는 게 빠르다.

아니면 파일로 만들어서 그를 ftp로 가져오는 것이다.

시스템 현재 시간대 출력

timedatectl

Oracle 제거방법

# Oracle 관련 파일 및 디렉터리 제거
rm -rf /u01/app/oracle

# Oracle 관련 환경변수 제거
vi ~/.bash_profile

# Oracle 관련 항목 제거
sudo vi /etc/oratab

# Oracle 사용자 계정 및 그룹 삭제
sudo userdel -r oracle
sudo groupdel dba

File Descriptor

File Descriptor는 리눅스, 유닉스 계열 시스템에서 프로세스가 파일을 다룰 때 사용한다.
유닉스 시스템에선 일반적 정규 파일부터 디렉터리, 소켓, 파이프, 블록 디바이스, 캐릭터 디바이스 등 모든 객체를 파일로 관리한다. Java의 소켓 통신(HTTP, API, JDBC 커넥션 등)도 파일로 취급된다. 소켓을 열 때마다 File Descriptor가 증가하고, File Descriptor의 개수가 시스템 제한을 초과하면 Too many open files 오류가 발생한다.

File Descriptor 개수 확인

ulimit -n

File Descriptor 설정

vi /etc/security/limits.conf