원문 : http://www.ischo.net -- 조인상 // 시스템 엔지니어

Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++



아래와 같은 오류가 발생하면, 99.9% /etc/mail/local-host-names 설정이 잘못되어 있기 때문이다.

  ----- The following addresses had permanent fatal errors -----
<center@center.co.kr>
  (reason: 553 5.3.5 system config error)

  ----- Transcript of session follows -----
553 5.3.5 217.129.242.1. config error: mail loops back to me (MX problem?)
554 5.3.5 Local configuration error


local-host-names 파일에 center.co.kr 도메인 이름을 추가하고,

sendmail 데몬을 다시 시작하면, 메일을 받을 수 있다.

물론, center.co.kr 도메인에 대한 MX 레코드가 해당 메일 서버로 지정되어 있어야만 한다.

 

출처 : https://ischo.net/bd_sun/757

출처 : http://coffeenix.net/board_view.php?bd_code=1678

제  목 : find명령에서 특정 디렉토리 제외하고 찾기(exclude)
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2009.7.3(금)

find 명령을 할 때, 특정 디렉토리 제외하고 find하는 방법은 없느냐고 주위분이 물어오셨다. 
개인적으로는 find에서 특정 디렉토리를 exclude하는 것 대신에 디렉토리를 나열하는 방법을 사용했다. 그러나 디렉토리 갯수가 많고, 같은 depth의 디렉토리가 아니고 하위 특정 디렉토리 몇개를 exclude해야한다면? 옵션을 활용할 수 밖에 없을 것이다.

man페이지를 확인해보니 -prune옵션이 있다. -prune 옵션은 찾아낸 것이 디렉토리이면 그 디렉토리내에는 find하지 않는다.

 
-name pattern
       ... 생략 ...
       To ignore a directory and the files under it, use -prune; see an example in the description of -wholename.

-prune If -depth is not given, true; if the file is a directory, do not descend into it.
       If -depth is given, false; no effect.
 



1. 예제로 살펴보기

[예제 1] 2009가 포함된 파일을 찾는다. 단 파일명이 디렉토리에 해당되면 해당 디렉토리 이하는 찾지 않는다.

find (전체 보기)
./
./check/check_list_2008_12.php
./check/check_list_2009_05.php
./check/check_list_2009_06.php
./2007_10_mobile
./2008_01_highlight
./2008_01_highlight/view.pl
./2008_01_highlight/view.sh
./2009_03_MSIE8
./2009_03_MSIE8/get_MSIE8.sh
./2009_05_apache
./2009_05_game
./2009_05_game/2009_05.log
find . -name "*2009*" -prune
./check/check_list_2009_05.php
./check/check_list_2009_06.php
./2009_03_MSIE8
./2009_05_apache
./2009_05_game

./2009_05_game/ 디렉토리 이하에 2009_05.log 파일이 있지만, -prune옵션으로 해당 디렉토리 이하는 찾지 않았다.

[예제 2] ./foo/bar 디렉토리는 제외하고, *.txt 파일을 찾아라.

find . ! \( -path './foo/bar' -prune \) -name "*.txt"
find . ! \( -type d -path './foo/bar' -prune \) -name "*.txt" (보다 정확한 표현)

[예제 3] ./foo/bar 디렉토리와 ./coffeenix/temp 디렉토리는 제외하고, *.bak 파일을 찾아라.

find . ! \( \( -path './foo/bar' -o -path './coffeenix/temp' \) -prune \) -name "*.bak"
find . ! \( \( -type d -path './foo/bar' -o -path './coffeenix/temp' \) -prune \) -name "*.bak" (보다 정확한 표현)

[예제 4] ./2008로 시작하는 디렉토리는 제외하고, .*.bak 파일을 찾아라.

find . ! \( -path './2008*' -prune \) -name "*.bak"
find . ! \( -type d -path './2008*' -prune \) -name "*.bak" (보다 정확한 표현)

-path 대신 -wholename 옵션을 사용해도 된다.

 
-path pattern
      See -wholename.   The predicate -path is also supported by HP-UX find.

-wholename pattern
      File name matches shell pattern pattern.  The metacharacters do not treat `/' or `.' specially; so, for example,
                find . -wholename './sr*sc'
      will  print  an entry for a directory called './src/misc' (if one exists).  To ignore a whole directory tree, use -prune rather
      than checking every file in the tree.  For example, to skip the directory `src/emacs' and all files and directories  under  it,
      and print the names of the other files found, do something like this:
                find . -wholename './src/emacs' -prune -o -print
 



2. 참고자료

* find manpage
  http://unixhelp.ed.ac.uk/CGI/man-cgi?find

* 유용한 find 명령어 예 모음 (2003, 글 좋은진호)
  http://coffeenix.net/board_view.php?bd_code=36

DNS 관련 포트 설정시 TCP 53번, UDP 53번을 허용해야 한다.
(다시 말해 네임서버 소프트웨어는 TCP도 지원을 할 필요가 있다)

[RFC1123 - 6.1.3.2]
DNS resolvers and recursive servers MUST support UDP, and SHOULD
support TCP, for sending (non-zone-transfer) queries.
https://tools.ietf.org/html/rfc1123#section-6.1.3.2

의무 사항은 아니나 권장이 되는 사항이다.

일반적인 DNS 질의는 UDP를 통해 이루어진다.
DNS 질의과정이 TCP를 쓰는 경우는 다음과 같다.

1. Zone-Transfer(AXFR/IXFR)

Master-Slave 구성시 Zone Transfer가 이루어지는데, 이때는 TCP를 사용하여 Zone File을 주고받는다.
전체 복사인 AXFR, 증분 복사인 IXFR 모두 TCP를 사용한다.

(BIND9 Zone-Transfer 로그)

2. 메시지가 512byte를 초과하는 경우

DNS 메시지에는 UDP 사용시 512byte 제한이 있다.

일반적인 DNS 메시지가 512byte를 초과하는 경우는 거의 없으나,
DNSSEC, IPv6 등에서 512byte를 초과하는 일이 종종 발생한다.

특히, NSEC3 레코드 등은 거의 필수적으로 512byte를 초과한다.


서버에서 주려는 응답이 512byte를 초과하는 경우,
TC Flag를 이용하여 DNS 질의자와 응답자는 TCP를 통해 질의 응답을 진행하게 된다.

(NSEC3 레코드는 사실상 512바이트를 초과할 수 밖에 없다)

요즘은 EDNS0 메커니즘에 의해,
EDNS0을 지원하는 조합이라면 512byte 이상의 UDP 메시지를 보낼 수 있다.
(권장되는 EDNS Payload는 512~4096byte이다)

하지만, 모든 클라이언트가 EDNS0을 지원하는 것은 아니며,
일부 오래된 방화벽이나 네트워크 정책 등에 의하여 512byte가 넘는 UDP 질의응답이 차단될 수도 있다.

[출처] https://dev.dwer.kr/2020/03/dns-tcp.html

EPEL 활성화 : yum install epel-release
관련 패키지 : yum install ntfs-3g ntfsprogs

리눅스 NTFS 포맷

mkntfs -f -L [사용할 볼륨 레이블 명] -v 장치명
ex) mkntfs -f -L BackupFile -v /dev/sdb1

-f : 빠른 포맷(= --fast) 동일한 기능 옵션으로 -Q(= --quick)를 사용 할 수 있음
-L : 볼륨 레이블명 설정(= --label)
-v : 자세한작업 수행 정보 출력(= --verbose)

리눅스 NTFS 마운트

mount -t ntfs-3g /dev/sdb1 /backup -o force,locale=ko_KR.euckr (시스템 로케일 설정과는 무관)
-o force,locale=ko_KR.euckr 옵션 미 적용 시 한글 인식이 안되어 한글 폴더, 파일 생성이 불가능하다.

리눅스 서버는 /etc/machine-id 라는 파일이 있다. 해당 파일은 machine의 고유 아이디값을 랜덤하게 생성하여 저장된 것으로 32글자로 된 16바이트/128비트 의 UUID값이다.

 machine-id는 dbus 또는 systemd 동작에 관련되어 있으며 /etc/machine-id 는 기본적으로 /var/lib/dbus/machine-id 에 심볼릭 링크되어있는 경우도 있다.

일단 해당 파일이 없는경우 어떤 문제가 일어나는지 알아보자

[    2.680252] systemd[1]: Inserted module 'ip_tables'
[    3.751916] systemd-journald[665]: Failed to get machine id: No such file or directory
[    3.755044] systemd-journald[677]: Failed to get machine id: No such file or directory
[    3.757980] systemd-journald[678]: Failed to get machine id: No such file or directory
[    3.760862] systemd-journald[679]: Failed to get machine id: No such file or directory
[    3.763454] systemd-journald[680]: Failed to get machine id: No such file or directory
[    4.023763] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:26] Failed to replace specifiers: /run/log/journal/%m
[    4.023804] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:28] Failed to replace specifiers: /run/log/journal/%m
[    4.023838] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:29] Failed to replace specifiers: /run/log/journal/%m
[    4.023873] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:32] Failed to replace specifiers: /var/log/journal/%m
[    4.023910] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:33] Failed to replace specifiers: /var/log/journal/%m/system.journal
[    4.031224] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:37] Failed to replace specifiers: /var/log/journal/%m
[    4.031259] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:38] Failed to replace specifiers: /var/log/journal/%m
[    4.031292] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:39] Failed to replace specifiers: /var/log/journal/%m/system.journal

시스템의 dmesg내용을 보면 위와같은 항목이 나타나게 된다. 이것은 systemd가 부팅시 machine-id 를 읽어 관련 동작을 초기화하는데 있어 machine-id값이 없어서 나는 오류메시지 이다.
파일이 없으면 자동으로 생성하면 되는게 아닌가 싶은데 일단 파일이 없는경우 자동생성되지 않고 위와같이 오류메세지가 나타난다.

또한 이 오류로 인해 systemd 관련 로그가 생성되지 않는다. 즉 대부분의 /var/log/에 쌓이는 로그들이 정상적으로 기록되지 않는다.

해결법

위 증세를 해결하기 위해서는 반드시 /etc/machine-id라는 파일이 존재하여야 한다.
두가지 방법이 있는데 아래를 참조하면 된다.

  • systemd-machine-id-setup 이용하는 방법
rm -f /etc/machine-id /var/lib/dbus/machine-id
systemd-machine-id-setup
  • dbus-uuidgen 사용법
rm -f /etc/machine-id /var/lib/dbus/machine-id
dbus-uuidgen --ensure=/etc/machine-id
dbus-uuidgen --ensure

시스템 재부팅 할 것~!

출처 : https://atl.kr/dokuwiki/doku.php/machine-id

  • 리눅스 history 날짜/시간 적용 방법

history에 날짜/시간을 적용하는 방법 자체도 매우 쉽고, 사용 하다보면 history에 날짜/시간이 적용되지 않아 history를 추적하기 힘든 상황이 발생할 수 있기 때문에 되도록 history에는 날짜와 시간을 적용하여 사용하는것이 좋습니다.

아래와 같이 /etc/profile 파일을 vi 편집기로 열은 후 맨 마지막 줄에 HISTTIMEFORMAT="[%Y-%m-%d_%H:%M:%S]  " 를 넣어주면 끝 입니다.

vi /etc/profile

# 맨 마지막 줄로 이동하여 아래 내용 기입
HISTTIMEFORMAT="[%Y-%m-%d_%H:%M:%S]  "
:wq

또는 아래와 같이 한줄로 간단하게 적용할 수 있습니다.

echo "HISTTIMEFORMAT=\"[%Y-%m-%d_%H:%M:%S]  \"" >> /etc/profile

적용 후 원격터미널을 로그아웃 후 재접속한 뒤 history 명령을 실행하면 입력했던 명령어 앞에 날짜와 시간이 나오는 것을
확인할 수 있다.

출처 : https://nirsa.tistory.com/234

리눅스 sendmail "unable to qualify my own domain name (YOUTHOSTNAME) unknown; sleeping for retry" 발생 시

보통 서버의 호스트네임을 localhost 말고 다른걸로 변경하여 사용할 때 발생 하는데, 서비스 시작이 굉장히 느리게 되거나 안되는 경우가 안되기도 합니다.

"unable to qualify my own domain name (YOUTHOSTNAME) unknown; sleeping for retry" 에러가 발생하면 hosts 파일에 127.0.0.1으로 서버의 호스트 네임을 작성 해주시면 됩니다.

hostname이 antamis 일 경우

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  antamis
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

 

출처 : https://nirsa.tistory.com/315

서버에서 파일명이 깨지는 경우 인코딩 변경으로 문제를 해결할 수 있는 명령어이다.
이종간의 OS (예 : 윈도우와 MAC) 에서 주로 발생하는데
윈도우는 EUC-KR이 기본 인코딩이고 MAC은 UTF-8이 기본 인코딩이라 MAC에서 FTP등을 통해 한글파일이나 폴더를
업로드할 경우 인코딩이 깨진채로 업로드된다.
이런 경우 convmv라는 유용한 명령어가 있는데 명령어가 없다면 아래 명령어로 설치한다.
(CentOS 또는 RockyLinux) yum install convmv

폴더로 들어가서 처리를 할 경우 아래와 같이 명령어를 선택하면 해당 폴더에 있는 euc-kr 인코딩이 utf-8 인코딩 방식으로 바뀐다.

[EUC-KR → UTF-8]

convmv -f euc-kr -t utf-8 ./*.* --notest

[UTF-8 → EUC-KR]

convmv -f utf-8 -t euc-kr ./*.* --notest

여기서 --notest 를 입력하지 않을 경우 인코딩 방식은 바뀌지 않고,  어떻게 변경되는지만 확인할 수 있다.

참고로 현재 위치에서 하위 디렉토리까지 포함하여 인코딩 방식을 변경하기 위해서는 -r 옵션을 추가하면 된다.

convmv -f euc-kr -t utf-8 ./*.* -r --notest

특정파일 1개만 변경할 때는 아래와 같이 처리한다.

convmv --notest --replace -r -f euc-kr -t utf-8 FileName

--replace 옵션은 동일한 파일명으로 덮어쓰기 하고 싶을 때 추가

터미널에서 인터넷 속도 측정이 하고 싶어서 조사해본 내용 정리.

설치

https://www.speedtest.net/ko/apps/cli

sudo apt-get install speedtest로 설치하면 서버 목록이 10개밖에 안 되는 비공식 버전을 받게 된다. 그러므로 다음과 같이 설치하자.

혹시 이미 비공식 버전을 설치했다면, 위 공식사이트 링크의 주석을 따라 삭제하는 절차를 밟도록 하자.

[맥OS]

brew tap teamookla/speedtest
brew update
brew install speedtest --force

[리눅스 데비안(우분투) 계열]

curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt-get install speedtest

[리눅스 레드햇 계열]

curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash
sudo yum install speedtest

실행 방법은 간단하다. 실행하고 yes를 입력해 라이센스에 동의한다.

speedtest

결과

   Speedtest by Ookla

      Server: Ookla - Seoul (id: 5249)
         ISP: Lg Powercomm
Idle Latency:    10.36 ms   (jitter: 0.64ms, low: 9.57ms, high: 11.03ms)
    Download:   876.93 Mbps (data used: 797.8 MB)                                                   
                 77.18 ms   (jitter: 7.83ms, low: 8.93ms, high: 133.85ms)
      Upload:   866.89 Mbps (data used: 725.8 MB)                                                   
                  8.80 ms   (jitter: 0.54ms, low: 7.42ms, high: 10.87ms)
 Packet Loss:     0.0%
  Result URL: https://www.speedtest.net/result/c/c0c219c5-eeea-471d-8f99-188844c7a165

출처 : https://velog.io/@jay6768/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%86%8D%EB%8F%84-%EC%B8%A1%EC%A0%95-speedtest-cli

ls -l 출력 시 날짜 변경( 12월  2009 -> 2009-07-01 08:35 )

변경 전

[root@wooseob ~]# ls -l
-rw------- 1 root root  1104 12월 17 03:22 anaconda-ks.cfg
-rw-r--r-- 1 root root 25690 12월 17 03:22 install.log
-rw-r--r-- 1 root root  4508 12월 17 03:21 install.log.syslog

# alias ls='ls --color=auto --time-style=long-iso'          날짜표시 변경하는 명령어

변경 후

[root@wooseob ~]# ls -l
-rw------- 1 root root  1104 2012-12-17 03:22 anaconda-ks.cfg
-rw-r--r-- 1 root root 25690 2012-12-17 03:22 install.log
-rw-r--r-- 1 root root  4508 2012-12-17 03:21 install.log.syslog

 

개인 사용자(~/.bashrc 기재)

[root@wooseob ~]# vi ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ls='ls --color=auto --time-style=long-iso'       -  추가 입력

전체 사용자 적용 시

[root@wooseob ~]# vi /etc/bashrc
# /etc/bashrc

# System wide functions and aliases
# Environment stuff goes in /etc/profile

alias ls='ls --color=auto --time-style=long-iso'        -  추가 입력

출처 : https://faq.hostway.co.kr/Linux_ETC/4495