Linux 휴지통 trash-cli
안녕하세요, 윈도우의 휴지통 기능을 구현할 수 있는 명령어 ‘trash-cli’에 대해 알아보겠습니다.
리눅스에서 삭제는 보통 rm -(r)f 명령어로 진행합니다. 윈도우와 다르게 터미널 명령어이므로 눈에 직접 보이는 아이콘을 눌러서 삭제하는 것과 경로를 입력하여 삭제하는 것에는 이용 시 많은 차이가 있습니다.
‘리눅스에서 휴지통을 구현할 수 없을까’라는 생각은 이미 똑똑한 사람들이 백만년 전에 해서 기능을 구현해두었습니다.
편하게 사용하기만 하면 됩니다. 참 쉽지요.
리눅스 휴지통은 바로 ‘trash-cli’ 명령어입니다. 테스트를 위해 rocky linux 9 서버를 가져왔습니다.
|
목차는 크게 아래 세 가지로 분류하였습니다. 필요한 부분만 잘라 보셔도 됩니다.
- 설치
- 사용 방법
- FTP 서버 활용 방법
참고로 IDCHOWTO에 trash-cli 관련 다른 게시글이 있으니, 함께 보아도 유익할 것 같습니다.
👉 바로가기
debian 계열 설명은 아래 링크를 참고 바랍니다.
👉 https://manpages.debian.org/testing/trash-cli/trash.1.en.html
1. 설치
epel-release를 추가하여 설치하면 번거롭게 python3, git 등을 설치하고 추가로 진행하는 일이 없어집니다.
dnf install epel-release -y && dnf install trash-cli -y
2. 사용 방법
trash-* 명령어로 삭제 시 기본 휴지통 경로는 ‘~/.local/share/Trash/’ 입니다.
|
실제 삭제된 파일은 files에 쌓이고 info에는 파일 복원을 위한 메타데이터로 ① 원래 파일의 경로와 ② 삭제 시각 데이터가 쌓입니다.
예시로 파일을 하나 생성하고 삭제해보면 아래와 같이 파일은 이동되고 데이터는 기록되는 걸 알 수 있습니다.
|
사용가능한 명령어는 다섯가지가 설치됩니다.
trash-empty | trash-list | trash-put | trash-restore | trash-rm
하나씩 살펴보겠습니다.
-
trash-empty (휴지통 비우기)
usage: trash-empty [-h] [–version] [–trash-dir TRASH_DIR] [–all-users] [-i] [-f] [days] Purge trashed files. positional arguments: |
–trash-dir TRASH_DIR | 특정 휴지통 비우기 |
–all-users | (root 권한 실행 필요) 모든 유저의 휴지통 비우기 |
-i (interactive) | 삭제 전 사용자에게 묻기 |
-f | 강제 실행 |
days | 특정 일이 지난 파일 삭제 (ex. trash-empty 30) |
-
trash-list (휴지통 파일 목록 출력)
usage: trash-list [-h] [–version] [–trash-dir TRASH_DIRS] List trashed files |
–trash-dir TRASH_DIRS | 특정 휴지통 파일만 출력 |
-
trash-put (휴지통에 버리기)
Usage: trash-put [OPTION]… FILE… Put files in trash Options: |
-f | 강제 실행 (삭제할 파일이 없어도 무시하고 진행) |
-i | 삭제 전 사용자에게 묻기 |
–trash-dir=TRASHDIR | 보관할 휴지통 지정 |
-v | 삭제 과정을 출력 |
-
trash-restore (휴지통 파일 복원)
usage: trash-restore [-h] [–sort {date,path,none}] [–version] [path] Restores from trash chosen file positional arguments: optional arguments: |
path | 입력한 경로 기준으로 복원 가능한 파일 목록 출력 |
–sort {date,path,none} |
복원할 파일 정렬 기준 설정 date = 삭제된 날짜 순 정렬 (기본값) path = 원본 경로 이름 순 none = 정렬 기준이 없어 내부 순서대로 나열 |
trash-restore 명령어를 입력하면 path 인자가 없을 경우 현재 경로 기준으로 복원가능한 파일 목록이 출력되고, path 인자가 있는 경우 해당 경로 기준으로 복원 가능한 파일 목록이 출력됩니다.
|
path 경로에 맞게 출력되는 목록은 당연히 메타 데이터에 쌓인 파일의 원본 경로와 일치하며, 복원 경로에 동일한 이름이 있는 경우 덮어쓰기 되니 주의 바랍니다.
-
trash-rm (패턴과 일치하는 휴지통 파일 완전삭제)
Usage: trash-rm PATTERN |
pattern | 삭제할 파일명을 지정하는 패턴(예: 와일드카드 *, 정규표현식 등) |
3. FTP 서버 활용 방법
리눅스 서버 운영 시 개인적으로 삭제 로그 찾기 가장 번거로운 건 바로 FTP를 이용한 파일 삭제입니다.
FTP 계정의 접속 가능한 폴더와 파일 권한을 이용하여 삭제를 방지할 수 있겠지만, 이러면 외주 업체나 다른 개발사 작업자들이 작업할 때 지속적으로 권한을 손대는 작업을 해야하니 이또한 번거롭습니다.
어떻게 대체하는 게 좋을까 고민하다가 떠오른 것이 특정 작업이 실행될 때 마다 동작하는 inotify나 audit과 결합하면 좋은 시너지를 낼 것 같습니다.
-
audit 데몬 모니터링 설정
# audit 데몬 동작 systemctl enable auditd –now
# 임시 룰 셋 저장 auditctl -w /home -p wa -k ftp_delete // 본 룰셋은 테스트용으로 옛 문법을 사용한 임시 룰 셋이므로 영구 등록을 별도로 하셔야 실 서비스 환경에서 안정적으로 모니터링이 가능합니다.
# FTP 에서 삭제 후 로그 확인 ausearch -k ftp_delete -sc unlink -ts today -i |
잘 동작합니다. 필요한 부분을 스크립트로 따오도록 해서 로그로 저장하면 모니터링에 좋은 참고자료가 될 것 같습니다.
이제 inotify로 삭제 시 로깅되도록 해보겠습니다.
-
inotify 모니터링 설정
# 패키지 설치 dnf install -y inotify-tools
# 스크립트 생성 vi /root/watch.sh === #!/bin/bash LOG_DATE=$(date +%Y-%m-%d) if [[ ! -f “$LOG_FILE” ]]; then inotifywait -m -r -e delete -e delete_self -e move –format ‘%e|%w%f’ “$WATCH_DIR” | while read event; do if [[ “$action” == *DELETE* || “$action” == *MOVED_FROM* ]]; then done === chmod +x /root/watch.sh
# 서비스 데몬으로 등록 vi /etc/systemd/system/watch-delete.service === [Unit] [Service] [Install] === systemctl daemon-reload systemctl enable –now watch-delete.service |
FTP로 파일을 생성 후 삭제해보았습니다.
|
이제 마지막으로 일반 사용자 중 특정 사용자의 remove 명령어를 후킹해보겠습니다.
rm
명령어 입력 시 rm
가 아닌 trash-put
으로 휴지통에 버리도록 변경하겠습니다.
-
rm
명령어trash-put
(으)로 대체
# rm 위치 확인 root) which rm 일반사용자) which rm 동일) cat ~/.bashrc | grep PATH 동일) echo $PATH
# rm 대체할 파일 생성 vi /usr/local/bin/rm === #!/bin/bash # 사용자 확인 # trash-cli 로 삭제 === chmod +x /usr/local/bin/rm |
# root 사용자로 삭제 시 # 일반 사용자로 삭제 시 |
이 부분은 후킹한 것이기 때문에 inotify나 audit으로 만든 모니터링에 잡히지 않습니다.
따라서 만일 로깅을 원한다면 별도로 스크립트에 로그를 추가해줘야 합니다.
로그 설정 추가 시에는 일반 사용자도 권한이 있는 디렉터리로 지정하도록 해야 합니다.
감사합니다.