검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Reclaim Deleted Files and Repair Filesystems on Linux

1. e2fsck로 Ext2/3/4 파일시스템 검사
  이미 이전에도 많이 했지만 복습차원에서 또 갑니다. 가장 중요한 것은 e2fsck가 언마운트된 파일시스템만 검사할 수 있다는 겁니다. 검사 대상이 마운트된 상태라면 관리자 계정으로 아래 명령어를 사용하여 런 레벨을 1로 바꿉니다.
init 1
  런 레벨을 1로 바꿨으면 검사할 파일시스템을 언마운트합니다. 참고로 이왕이면 Knoppix나 Puppy Linux 같은 라이브 배포판을 이용해서 부팅 후 검사하는 것이 더 안전하긴 합니다.

  umount 명령어로 언마운트를 한 후 e2fsck 명령어로 검사를 합니다. 아래는 대상이 sdb1 장치라고 가정했을 때의 모습입니다.
umount /dev/sdb1
e2fsck -y /dev/sdb1
  e2fsck의 -y 옵션은 모든 질문에 yes로 대답하는 옵션입니다. 검사가 끝나면 한 번 더 검사를 실시하여 남은 에러가 없는지 확인합니다.


2. 프로세스가 사용 중인 상태에서 삭제한 파일 복구
  파일이 복구가 가능한 이유는 파일이라는 것이 실제로는 디스크에 있는 아이노드에 대한 링크일 뿐이기 때문입니다. 이 아이노드는 파일에 대한 모든 정보를 담고 있습니다. 파일을 지우면 실제로는 아이노드에 대한 링크만 끊어지기 때문에 데이터를 찾을 수 없게 될 뿐입니다. 실제 아이노드 자체는 디스크에 남는다는 것이죠. 단, 그냥 영구적으로 남는 게 아니라 일시적으로 남는 겁니다. 정확히는 어떤 프로세스가 지운 파일을 여전히 열고 있어서 해당 아이노드에 대해 쓰기가 불가능한 동안만 온전히 남게 됩니다. 그러므로 지금 소개하는 방법에는 시간 제한이 있으며 그 시간은 길 수도 있고 짧을 수도 있습니다. 이 복구의 핵심은 /proc 디렉토리입니다. 시스템에 있는 모든 프로세스는 /proc 디렉토리 내에 디렉토리를 하나씩 보유하고 있습니다. 'ls /proc' 명령을 실행해보면 숫자로 된 디렉토리들을 볼 수 있습니다. 이 숫자는 실행 중인 프로그램의 프로세스 ID(PID)들입니다. ps 명령어를 사용하면 원하는 프로그램의 PID를 확인할 수 있습니다.

  /proc 내에서 원하는 프로세스의 디렉토리를 찾았다면 그곳으로부터 데이터를 가져와 복구할 수 있습니다. 이를 시연하기 위해 test_file이라는 파일을 만들어 복구해보겠습니다. 먼저 아래의 명령어로 파일을 만듭니다.
echo "this is my test file" > ~/test_file
  이제 less 명령어로 이 파일을 출력시키고 프로그램이 끝나지 않은 상태에서 파일을 지우겠습니다.
  1. 'less test_file' 명령어로 파일 출력.
  2. 이 상태에서 Ctrl-z를 눌러 프로그램을 일시중단.
  3. 'rm ~/test_file' 명령어로 파일 삭제.
  4. 'lsof | grep test_file' 명령어로 아래와 같은 정보를 검색.
    less 14675 zombie 4r REG 8,1 21 5127399 /home/zombie/test_file (deleted)
  5. 출력 결과 중 PID(2번째 열)와 파일 디스크립터(4번째 열)이다.
  6. 이제 아래와 같은 방법으로 파일을 복구한다.
    cp /proc/14675/fd/4 ~/recovered_file
  위 복구 과정이 끝나면 파일의 내용이 원래 파일과 같은지 실제로 확인해보는 것이 좋습니다.


3. Scalpel을 이용한 복구
  Scalpel이란 툴을 이용하면 특정 확장자를 가진 파일을 지정하여 해당 확장자를 가진 파일을 더 쉽게 복구할 수 있습니다. 먼저 설치가 필요한데 우분투 10.10 데스크탑을 기준으로 터미널에서 아래의 명령어를 통해 설치가 가능합니다.
sudo apt-get install scalpel
  설치 후 /etc/scalpel/scalpel.conf 라는 파일이 생기는데 파일 내용을 보면 확장자들을 볼 수 있습니다. 이 중 복구 대상으로 삼고 싶은 확장자 앞에 있는 주석을 지웁니다. 저장 후 나와서 복구할 파일을 저장할 디렉토리를 하나 만듭니다. 여기에서는 ~/RECOVERED 디렉토리를 해당 디렉토리로 삼겠습니다. 이제 아래와 같이 명령어를 실행합니다.
sudo scalpel /dev/sd1 -o ~/RECOVERED
  작업이 완료될 때까지 상당한 시간이 소요될 겁니다. 작업이 끝나고 디렉토리로 가보면 지정한 각 확장자별로 서브디렉토리가 생기고 그 안에 복구된 파일이 있는 것을 확인할 수 있습니다.


2011/02/01 15:24 2011/02/01 15:24
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : The best way to move data

  오늘은 잉여력 돋는 글을 납치해왔습니다. 원격으로 데이터를 옮기는 아래의 방법들 중 어떤 방법이 가장 효율적인가를 실험한 글입니다.
  • scp
  • tar+ssh
  • rsync+ssh
  • tar+netcat
  실험에는 와이파이를 통해 공유기를 거쳐 내부 네트워크로 연결된 두 노트북이 사용됐습니다. SSH와 관련해 한 컴퓨터의 CPU(센트리노 1.5 GHZ)가 성능이 좋지 않아 보틀넥 현상을 일으킬 가능성이 있습니다. 두 노트북이 사용하는 IP는 다음과 같습니다.
  • laptop1: centrino 1500 — ip 192.168.0.10
  • laptop2: Intel Core2 Duo CPU 2.20GHz — ip 192.168.0.2

대역폭 실험
  이 논재는 각 방법끼리 속도를 비교하는 내용이기 때문에 네트워크 속도 자체가 중요한 건 아니지만 일단 네트워크로 전송을 하므로 iperf 명령어를 통해 네트워크 대역폭을 확인하는 모습입니다.
클라이언트
# iperf -c 192.168.0.2

서버
# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40530
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-12.1 sec  3.47 MBytes  2.40 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40531
[  4]  0.0-12.7 sec  3.94 MBytes  2.61 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40536
[  4]  0.0-12.3 sec  3.99 MBytes  2.73 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40538
[  4]  0.0-11.4 sec  3.65 MBytes  2.68 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40540
[  4]  0.0-19.5 sec  4.01 MBytes  1.72 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40541
[  4]  0.0-11.3 sec  3.67 MBytes  2.71 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 40545
[  4]  0.0-11.5 sec  3.82 MBytes  2.78 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 37802
[  4]  0.0-10.2 sec   888 KBytes   715 Kbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 37812
[  4]  0.0-12.4 sec  1.59 MBytes  1.08 Mbits/sec
[  4] local 192.168.0.2 port 5001 connected with 192.168.0.10 port 37814
[  4]  0.0-11.9 sec  3.88 MBytes  2.74 Mbits/sec
  10번 테스트해서 나온 값의 평균은 대략 2.2 Mbps입니다. 이제 본격적으로 실험을 해봅니다.

첫 번째 실험
  실험의 내용은 /var/lib/dpkg 내의 7105 파일(61 MB)을 랩탑1에서 랩탑2로 옮기는 내용입니다. 아래는 scp, rsync+ssh, tar+ssh 실험을 위한 스크립트입니다.
#!/bin/bash
 
for i in `seq 1 10`; do time scp -qrp /var/lib/dpkg 192.168.0.2:/test/copy/; \
ssh 192.168.0.2 rm -fr /test/copy/dpkg; done
 
echo "End scp"
 
for i in `seq 1 10`; do time rsync -ae ssh /var/lib/dpkg 192.168.0.2:/test/copy/; \
ssh 192.168.0.2 rm -fr /test/copy/dpkg; done
 
echo "End rsync+ssh"
 
for i in `seq 1 10`; do time tar -cf - /var/lib/dpkg |ssh 192.168.0.2 tar -C /test/copy/ -xf - ; \
ssh 192.168.0.2 "rm -fr /test/copy/*"; done

echo "End tar+ssh"
  netcat의 경우 아래의 방법을 사용합니다.
수신측(랩탑2)
# nc -l -p 7000 | tar x

송신측(랩탑1)
# cd /var/lib/dpkg
# time tar cf - * | nc 192.168.0.2 7000
  아래는 방법당 10회씩 실험한 결과입니다.

사용자 삽입 이미지
  초록색은 가장 잘 나온 기록으로 매 방법당 2개씩 있으며 빨간색은 가장 못 나온 기록으로 역시 방법당 2개씩 있습니다. 이 기록들(4개)을 제외하고 산출한 각 방법별 평균 시간은 아래와 같습니다.
  • scp: 246초
  • rsync+ssh: 130초
  • tar+ssh: 149초
  • tar+netcat: 131초

두 번째 실험
  실험자는 tar+ssh가 가장 빠를 것이라 생각했기 때문에 결과가 마음에 안 들었는지 기가비트로 연결된 두 서버에서 같은 실험을 또 했습니다. 그런데...그것이 실제로 일어나고 말았습니다.

사용자 삽입 이미지
  netcat은 시간 측정에 뭔가 문제가 생겨 결과가 제대로 나오지 않았다고 합니다. 일단 결과로는 tar+ssh가 rsync+ssh를 근소한 차이로 이겼습니다.

결론
  사실 글쓴이는 netcat > tar+ssh > rsync+ssh > scp 순으로 속도가 나오길 기대했다고 합니다. 다른 블로그에도 이와 비슷한 테스트가 있었으며 그곳의 결과에서는 자신의 예상과 거의 일치한 결과가 나왔다고 합니다. 아래는 글쓴이의 결론입니다.
  1. scp는 최악.
  2. 네트워크와 컴퓨터에 따라 rsync와 tar의 결과에 차이가 있을 수 있다.
  3. 네트워크가 빠를 경우 tar+ssh가 좀 더 성능이 좋다. 글쓴이의 예상으로는 암호화를 끄고 netcat을 사용하면 ssh와 비교해서 좀 더 빠를 것 같다.
  4. rsync는 증분 방식으로 이 일을 처리할 수 있기 때문에 여러 번 작업을 반복할 경우(예를 들어 같은 날 두 대상끼리 여러 번 동기화를 할 경우) 사용성(Usability) 측면에서 다른 방법보다 월등한 장점을 지닌다.
2011/01/11 13:54 2011/01/11 13:54
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : 20 Popular Command-Line Tips for Linux


X 윈도우에서 커맨드 라인을 통해 스크린샷 찍기
  ImageMagick라는 패키지에 있는 import라는 툴을 사용하여 아래의 명령어로 창 하나의 스크린샷을 찍을 수 있습니다.
import filename.png
  하나의 테두리를 포함하여 창을 찍을 때는 아래의 명령어를 사용합니다.
import -border filename.png
  전체 화면이나 한 지역을 찍을 때는 처음 명령어를 사용한 후 찍을 부분을 마우스로 선택합니다.


ISO 이미지 마운트
  먼저 마운트 포인트(빈 디렉토리)를 만든 후 mount 명령어로 이미지를 마운트합니다.
sudo mkdir /mnt/iso_image/
sudo mount -o loop iso_image.iso /mnt/iso_image/


pidof로 프로세스 죽이기
  pidof는 인수로 넘긴 프로세스의 PID를 반환하는 명령어입니다. 이를 활용하여 아래의 방법으로 특정 이름의 프로세스를 죽일 수 있습니다. 다만 killall 명령어를 놔두고 저런 방법을 사용할 필요가 있는지 모르겠군요.
kill -9 $(pidof process_name)
예:
kill -9 $(pidof amarokapp)
kill -9 $(pidof firefox-bin)


NRG 이미지를 ISO 이미지로 변환
  nrg2iso라는 툴을 사용합니다.
nrg2iso input_image.nrg output_image.iso


커맨드 라인에서 이미지 크기 변환
  ImageMagick 패키지에 있는 conver라는 툴을 사용합니다. 이를 이용하면 이미지 포맷을 변경하거나 특수 효과를 첨가할 수 있습니다. 아래는 이미지를 30%의 크기로 리사이징하는 예입니다.
convert -sample 30%x30% input_image.png output_image.png


mencoder로 MKV를 AVI로 변환
  mencoder를 통해 MKV(Matroska Video File)를 AVI로 변환하는 방법입니다.
mencoder input_file.mkv -ffourcc xvid -ovc lavc -lavcopts vcodec=xvid:vhq:vbitrate=1800 -oac mp3lame -lameopts vbr=5 -o output_file.avi


genisoimage를 이용해 커맨드 라인에서 ISO 이미지 생성
  디렉토리 안의 내용들을 ISO 9660 이미지 파일로 만드는 방법입니다.
genisoimage -o output_file.iso directory_name
  아래는 몇 개의 파일을 뭉쳐 ISO 파일로 만드는 방법입니다.
genisoimage -o output_file.iso file1 file2 file3


포트 닫기
  먼저 nmap을 이용해 자신의 시스템에 어떤 포트가 열려 있는지 알아봅니다.
nmap localhost
  닫고 싶은 포트가 있다면 루트 권한을 가진 상태에서 아래의 문법으로 명령어를 사용합니다.
fuser -k 80/tcp


CUE 파일을 참조하여 FLAC/WAV/APE 파일 분할
  CUE 파일을 가지고 FLAC과 WAV를 분할 할 때는 cuetoolsshntool이라는 패키지가 필요합니다.
cuebreakpoints cue_file.cue | shnsplit flac_file.flac
  WAV 파일에 대해서도 사용법은 동일합니다. APE 파일의 경우 먼저 monkeys-audio 패키지에 있는 mac이란 툴을 이용해 WAV 파일로 변환해야 합니다.
mac input_file.ape output_file.wav -d
  이후에는 먼저 소개한 방법을 통해 WAV 파일을 분할하면 됩니다.


C 코드에 들여쓰기 적용
  indent라는 툴을 이용하면 가독성을 위해 공백 문자를 삽입/삭제하여 들여쓰기를 적용시킬 수 있습니다.
indent -kr source_file.c
 지원하는 코딩 스타일 중 일부로는 GNU indent style(디폴트. -gnu 옵션으로 명시적으로 사용 가능), Kernighan & Ritchie style(-kr), Berkeley style(-orig)이 있습니다.


Ctrl+D를 눌렀을 때 쉘을 종료시키지 않는 법
  기본적으로 배시에서 Ctrl+D를 누르면 현재 쉘에서 빠져나가게 됩니다.(단, 프로그램 실행 중 파일의 끝임을 알리기 위해 사용하는 경우는 제외) 이를 방지하려면 ~/.bashrc 파일에 아래의 줄을 추가합니다.
export IGNOREEOF=1
  그리고 다시 로그인 하거나 아래처럼 source 명령어로 파일을 다시 읽으면 위의 내용이 적용됩니다.
source ~/.bashrc


시스템 비프 소리 죽이기
  임시로 PC 스피커를 죽이려면 아래의 명령어로 커널에서 해당 모듈을 빼면 됩니다.
modprobe -r pcspkr
  영구적으로 제거하려면 이 모듈을 블랙리스트로 등록하여 시스템이 시작될 때 로드되지 않게 하면 됩니다. 이를 위해서는 루트 권한으로 /etc/modprobe.d/blacklist 파일에 아래의 줄을 추가하면 됩니다.
blacklist pcspkr


DVD VOB 파일에서 오디오만 추출
  mplayer로 아래처럼 명령어를 실행합니다.
mplayer input_file.vob -aid 128 -dumpaudio -dumpfile output_file.ac3
  참고로 VOB 파일들은 아래의 방법을 통해 하나로 합칠 수 있습니다.
cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB > ~/output_file.vob


lm-sensors로 CPU 온도 모니터
  lm-sensors 패키지를 설치하면 온도 감지를 위해 몇 가지 커널 모듈을 로드하게 됩니다. 이것은 자동으로 이루어지며 사용자는 모듈을 로드하는 것에 동의만 하면 됩니다. sensors 명령어로 실행할 수 있습니다.
$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:      +46.0°C  (high = +74.0°C, crit = +100.0°C)


ffmpeg2theora로 비디오 포맷을 Ogg Theora로 변환
  ffmpeg2theoraffmpeg의 프론트엔드로써 다양한 비디오 파일을 오픈 포맷인 Theora 비디오로 변환할 수 있게 해줍니다. 아래는 input_file.avi 파일을 비디오 퀄리티 팩터 6, 오디오 비트레이트 192kbps를 통해 Theora 비디오 파일로 변환하는 예입니다.
ffmpeg2theora -q 6 -A 192 input_file.avi
  아래는 디폴트 세팅을 사용하여 변환하는 예입니다.
ffmpeg2theora input_file.vob -o output_file.ogg
  아래는 비디오에 메타 태그를 추가하는 방법입니다.
ffmpeg2theora --artist "Pink Floyd" --title "Live at Pompeii" input_file.vob -o output_file.ogg


OGV를 FLV로 변환
  ffmpeg 오디오/비디오 인코더를 사용한 변환 방법입니다.
ffmpeg -i input_file.ogv output_file.flv
  해상도를 줄여 변환하려면 아래처럼 사용합니다.
ffmpeg -i input_file.ogv -s 640x512 output_file.ogv
  오디오 코덱을 변경할 때는 -acodec 옵션을 사용합니다.
ffmpeg -i input_file.ogv -acodec libmp3lame output_file.flv


앨리어스 생성
  앨리어스는 어떤 단일/조합 명령어를 원하는 이름으로 쓸 수 있게 해줍니다. 앨리어스를 생성하려면 ~/.bashrc 파일에 아래처럼 앨리어스를 추가해야 합니다.
alias 'killfx='kill -9 $(pidof firefox-bin)'
alias 'back=cd -' # or cd $OLDPWD
alias 'ls=ls -lhXa'


BIN/NRG/MDF 이미지를 ISO 이미지로 변환
  iat라는 유틸리티를 사용합니다. 이 유틸리티는 많은 이미지 포맷을 지원합니다.
iat input_file.nrg output_file.iso


FLAC/WAV을 Ogg Vorbis나 MP3로 변환
  vorbis-toolslame 패키지를 사용합니다. 아래는 FLAC/WAV를 비트레이트 256 kbps의 Ogg Vorbis로 변환하는 방법입니다.
oggenc -b 256 input_file.flac -o output_file.ogg
  FLAC를 MP3로 변환할 때는 먼저 'flac -d input_file.flac' 명령어를 통해 WAV 파일로 변환한 후 아래처럼 MP3로 변환해야 합니다.
lame -b 192 input_file.wav


2010/12/27 11:31 2010/12/27 11:31
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : How to find which process is eating RAM in Linux

  매우 간단하고 짧은 팁으로써 램 사용량을 기준으로 프로세스 목록을 내림차순으로 정렬하여 보는 방법입니다. 'top' 명령어를 실행합니다. 'M(대문자)'을 누릅니다. 끝.

  커맨드 라인으로 몇 가지 명령어를 조합하여 확인하는 방법도 소개합니다. 당장 실시간 확인 용도라면 사실 위의 방법이 더 좋고 아래 방법은 보고서 생성 같은 용도의 쉘 스크립트에 활용하기 좋을 듯 싶습니다. 다만 그런 용도라면 모니터링 툴로 생성된 그래프 그림이 더 좋을 것 같네요.
$ ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 21
PID %MEM COMMAND
5669 1.2 /usr/sbin/mysqld
2226 0.7 /usr/sbin/named
19677 0.5 /usr/sbin/apache2
20024 0.5 /usr/sbin/apache2
20083 0.5 /usr/sbin/apache2
20085 0.5 /usr/sbin/apache2
20099 0.5 /usr/sbin/apache2
20204 0.5 /usr/sbin/apache2
20205 0.5 /usr/sbin/apache2
20206 0.5 /usr/sbin/apache2
20207 0.5 /usr/sbin/apache2
20208 0.5 /usr/sbin/apache2
14498 0.3 /usr/sbin/apache2
32651 0.2 /usr/sbin/smbd
4413 0.1 /usr/sbin/winbindd
5100 0.1 /usr/sbin/smbd
6283 0.1 /usr/sbin/openvpn
19873 0.1 sshd:
1659 0.1 dovecot-auth
19723 0.1 /bin/bash
2010/12/15 20:55 2010/12/15 20:55
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : How to handle files with strange names

  알파벳과 숫자가 아닌 문자나 공백이 포함된 파일명을 다루는 방법입니다. 마지막 방법을 제외하고는 크게 유용한 내용이 없는 것 같습니다.


1. 파일명에 공백 문자가 있는 경우
  크게 2가지 해결 방법이 있습니다. 첫 번째 방법은 이스케이프 문자로 공백을 표현하는 겁니다. 예를 들어 'ab cd'라는 이름의 파일이 있다면 'rm ab\ cd'라고 적으면 됩니다. 또는 ab로 시작하는 파일이나 디렉토리가 하나 뿐이라면 ab를 입력한 후 탭을 이용한 자동완성 기능으로 같은 결과를 얻을 수 있습니다.
$ ls
ab cd
$ rm ab\ cd
  두 번째 방법은 싱글 쿼트나 더블 쿼트를 사용하는 겁니다. 위와 같은 상황에서 아래의 명령어로 같은 결과를 얻을 수 있습니다.
$ rm "ab cd"    또는    $ rm 'ab cd'

2. 파일명이 -나 + 문자로 시작하는 경우
  프로그램의 옵션은 보통 -나 + 문자로 시작하는데 파일명 앞이 -, +로 시작할 경우 프로그램이 파일명을 옵션으로 착각하여 아래와 같은 상황에 발생합니다.
$ ls
-abc
$ rm -abc
rm: invalid option -- 'a'
Try `rm ./-abc' to remove the file `-abc'.
Try `rm --help' for more information.
  우분투의 경우 이미 위에서 볼 수 있는 것처럼 메시지 안에 답이 나와 있습니다. 바로 현재 디렉토리를 명시적으로 적어주는 겁니다.
$ rm ./-abc
  또 다른 방법은 언제나 통하는 방법은 아니지만 대부분의 유닉스 프로그램에서 사용할 수 있는 방법으로 '--' 파라미터를 사용하는 겁니다. 이 파라미터는 "명령어의 플래그(옵션, 파라미터) 사용이 끝났다"라는 것을 명시적으로 프로그램에 알리는 겁니다. 따라서 -나 +를 문자 그대로의 의미로 사용할 수 있게 됩니다.
$ rm -- -abc

3. 파일명에 이스케이프가 존재하는 경우
  파일명에 이스케이프 문자가 존재하여 파일명이 제대로 표시되지 않는 경우가 있습니다.
$ ls
a?b
  언뜻 보면 파일명이 'a?b'인 것처럼 보이지만 사실 a와 b 사이에 있는 물음표는 이스케이프 문자 중 뉴 라인(\n)을 출력하지 못하여 깨져 나온 겁니다. 이런 상황에서 ls 명령어에 -b 옵션을 사용하면 이스케이프 문자를 백슬래시 형태로 출력시킬 수 있습니다.
$ ls -b
a\nb
  이렇게 출력된 파일명을 $'파일명' 형식으로 적으면 해당 파일을 제어할 수 있습니다. 참고로 $'문자열'은 배시에서 싱글 쿼트 안에 있는 문자열 중 백슬래시 형태로 적은 이스케이프를 실제 이스케이프로 치환하라는 의미입니다.
$ rm $'a\nb'

4. 파일명이 구제 불능일 경우
  파일명이 매우 복잡하거나 아예 깨진 경우 inode 값을 사용하는 방법이 있습니다. 먼저 'ls -il' 명령어로 파일의 inode를 확인합니다.
$ ls -il
total 9596
1572865 -rwxr--r-- 1 mirashi mirashi 9824181 2010-09-29 12:54 07 寧
  inode 값을 확인했다면 find 명령어를 응용하여 원하는 작업을 할 수 있습니다.
$ find . -inum 1572865 -exec mv {} fixed.mp3 \;
$ ls -il
total 9596
1572865 -rwxr--r-- 1 mirashi mirashi 9824181 2010-09-29 12:54 fixed.mp3
2010/12/15 13:57 2010/12/15 13:57
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : My top ten shell/bash tricks!


1. sudo를 사용하는 것을 잊었을 때 !! 활용
  루트 권한이 필요한 명령어를 사용할 때 sudo를 사용하는 것을 잊어서 처음부터 다시 타이핑을 하거나 이전 명령어를 불러 앞 부분에 sudo를 붙이는 경우가 있는데 더 간편하게 하는 방법이 있습니다. 바로 이전에 실행한 명령어로 대체되는 '!!' 문자열을 사용하는 겁니다. 배시 쉘에서 사용이 가능합니다.
$ ethtool eth0
Settings for eth0:
Cannot get device settings: Operation not permitted
Cannot get wake-on-lan settings: Operation not permitted
    Current message level: 0x00000000 (0)
Cannot get link status: Operation not permitted
$ sudo !!
sudo ethtool eth0
[sudo] password for mirashi:


2. Ctrl+R로 이전에 사용한 명령어 찾기
  역시 배시 쉘에서 사용이 가능한 기능으로 Ctrl+R을 누른 후 이전에 사용한 명령어에 포함된 문자나 문자열을 입력하여 이전에 사용한 명령어를 검색할 수 있습니다. 검색은 가장 최근 실행한 것부터 역순으로 검색되며 Ctrl+R을 누를 때마다 검색을 계속 진행합니다. 그냥 Ctrl+R만 계속 누를 경우 이전에 실행한 명령어들을 차례대로 보여줍니다. 역시 배시 쉘에서 가능합니다.

  이전에 실행한 명령어를 검색하는 또 다른 방법으로는 'history | grep 검색할_명령어'를 실행하는 방법이 있습니다.


3. 가장 많이 실행했던 명령어 10개 보기
$ history | tr '\011' ' ' | tr -s " "| cut -d' ' -f3 | sort | uniq -c | sort -nbr | head -n10
    212 sudo
     38 man
     26 ls
     24 cd
     23 echo
     15 vi
     15 awk
     13 dig
     12 lsof
      9 htpasswd


4. 한방에 시스템을 무너트리는 명령어
  아래의 명령어로 시스템에 DoS 공격을 할 수 있습니다. fork bomb이라고 하는 공격이며 프로세스 복제로 프로세스 테이블을 포화상태로 만듭니다.
:(){ :|:& };:


5. &&로 연쇄 반응 일으키기
  '&&'는 명령어를 순차적으로 실행하게 해줍니다. 만약 '명령어1 && 명령어2'이라는 형식으로 실행하면 '명령어1'이 실행되어 무사히 종료됐을 경우에만 '명령어2'가 실행됩니다. 여기서 중요한 사실은 만약 '명령어1'의 종료 값이 0이 아닐 경우(=비정상 종료했을 경우) '명령어2'가 실행되지 않는다는 겁니다. 아래는 데비안 계열의 배포판에서 이 기법을 활용한 예로 패키지 목록을 업데이트한 후 패키지 업데이트를 실행하는 명령어입니다.
sudo apt-get update && sudo apt-get upgrade


6. screen 명령어로 화면 분할
  먼저 'screen' 명령어를 실행합니다. 그리고 엔터를 눌러 쉘 화면으로 빠져나옵니다. 이제 Ctrl+a를 누른 후 S(대문자)를 누르면 화면이 분할됩니다. 이제 Ctrl+a를 누른 후 탭을 누르면 다음 창으로 넘어갈 수 있습니다. 분할 후 새로 생긴 창에는 아무것도 없는데 커서가 그런 창에 있는 상태에서 Ctrl+a를 누른 후 c(소문자)를 누르면 쉘이 실행됩니다. 현재 커서가 있는 창을 닫고 싶을 때는 Ctrl+a를 누른 후 X(대문자)를 누르면 됩니다.

2010/12/14 17:05 2010/12/14 17:05
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Using lsof to Find Open Files
관련 글 : 특정 포트를 열고 있는 프로세스 찾기

  lsof는 "list open files"의 약자로 특정 프로그램이 사용 중인 파일 또는 열려 있는 네트워크 포트를 알 수 있는 유틸리티입니다. 루트킷이나 IRC 봇을 처리할 때도 유용합니다.

  lsof를 그냥 실행하면 사용 중인 모든 파일(네트워크 소켓, 파이프,특수 파일 포함)을 보여줍니다. 이 명령어로 파일을 사용할 때 쓴 명령어, PID, 사용자, 파일 디스크립터, 종류, 크기, 이름을 알 수 있습니다. 특정 프로세스가 사용 중인 파일만 보려면 -p 옵션과 프로세스의 PID를 적고 특정 사용자가 열고 있는 파일만 보려면 -u 옵션과 사용자명(또는 UID)을 적습니다. 만약 어떤 프로세스나 사용자가 사용 중인 파일들을 결과에서 제외하고 싶다면 프로세스ID나 사용자명 바로 앞에 ^ 문자를 붙이면 됩니다. 참고로 lsof의 실행에는 루트 권한이 필요합니다.
lsof -p 프로세스PID  : 해당 프로세스가 사용 중인 파일 목록 출력
lsof -u 유저명       : 해당 유저가 사용 중인 파일 목록 출력
lsof -u ^유저명      : 목록 중 해당 유저가 사용 중인 파일 제외
  네트워크를 통해 사용 중인 파일은 -i 옵션으로 볼 수 있습니다. 이것으로 사용 중인 파일과 소켓, 프로토콜, 호스트명 등을 알 수 있습니다. 추가로 IP 버전(IPv4는 -i4 옵션, IPv6는 -i6 옵션), 프로토콜(UDP와 TCP 옵션), 호스트명, 포트(콜론 문자 뒤에 포트번호) 같은 것을 적어 검색 결과를 좁힐 수 있습니다. 기본적으로 lsof는 결과를 출력할 때 IP의 도메인을 조회하여 번역한 후 출력하지만 -n 옵션을 사용하면 조회를 하지 않고 출력하여 실행 시간을 단축할 수 있습니다.

  "그리고"의 의미로 -a 옵션을 사용할 수 있습니다. 예를 들어 특정 사용자가 사용 중인 네트워크 소켓(TCP와 UDP 소켓)만 보려면 다음과 같이 명령어를 사용하면 됩니다.
lsof -u 유저명 -a -i


2010/12/13 09:46 2010/12/13 09:46
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Absolutely Essential Vim/vi Commands

  vi는 고전 유닉스 텍스트 에디터 프로그램이고 Vim(Vi IMproved)은 그것을 개량한 버전입니다. 사실상 현재 (아마도)모든 리눅스에서는 vi가 Vim으로 연결되는 심볼릭 링크이기 때문에 Vim을 사용하고 있다고 할 수 있습니다. 하지만 자세하게 파고들지 않으면 둘을 사용하는 데는 별 차이가 없기 때문에 대략 'Vim = vi'로 생각하셔도 당장은 무방합니다.

vi의 3가지 모드
  vi를 처음 접하는 사람들은 상당히 당황할 수 밖에 없는 그 이유는 텍스트 에디터인데도 그냥 글자를 입력하는 방법부터 다른 에디터와 다르기 때문입니다. vi에는 Insert 모드, Command 모드, Last-line(=Ex) 모드로 총 3가지의 모드가 있습니다.

  Insert 모드는 일반적으로 볼 수 있는 텍스트 에디터의 그 상태와 같습니다. 즉, 키를 누르면 그 키가 입력됩니다. 따라서 모드 자체는 따로 설명할 것이 없습니다. 단, 다른 모드에서 이 모드로 넘어오는 방법을 알아야 입력을 할 수 있겠죠? Command 모드에서 ia를 누르면 이 모드로 전환할 수 있는데 자세한 건 잠시 후 아래에서 알아보겠습니다. 여기서 알아야 할 것은 이 모드에서 아래의 Command 모드로 가려면 Esc를 눌러야 한다는 겁니다.

  Command 모드는 각종 제어를 위한 모드로 일반적인 에디터의 커서 이동, 복사, 붙여넣기 등 입력 등 대부분의 작업을 이 모드에서 할 수 있습니다. 아래에 나오는 내용도 대부분 이 모드에서 실시합니다. vi를 실행하면 이 모드에서 시작합니다.

  Last-line 모드도 Command 모드와 비슷한데 주로 치환과 같이 여러 번 키를 눌러야 하는 작업, 저장, 줄 번호 표시 같이 문서 편집에 있어서 간접적인 작업을 하기 위해 사용합니다. Command 모드에서 :(shift + ;)를 누르면 Last-line 모드로 진입하면서 화면의 마지막 줄에 : 문자와 함께 명령어를 입력할 수 있게 됩니다. Insert 모드와 마찬가지로 Command 모드로 가려면 Esc를 눌러야 한다는 것이 중요합니다.


(1) 커서 이동
  • h - 왼쪽으로 한 칸 이동.
  • l - 오른쪽으로 한 칸 이동.
  • j - 아래로 한 줄 이동.
  • k - 위로 한 줄 이동.
  • w - 한 단어(word) 오른쪽으로 이동.
    ※ 여기서 '단어'의 종류는 숫자와 문자가 조합된 문자열, 그 외 문자의 조합으로 이뤄진 문자열로 2가지가 있다. 따라서 'o1n1e-t2w2o'라는 문장의 맨 왼쪽에서 w를 누르면 '-'에서 커서가 멈추고 다시 w를 누르면 't'에서 커서가 멈춘다. 'o1n1e---t2w2o'의 경우 커서가 첫 번째 '-' 문자에 있을 때 한 번 더 w를 누르면 커서가 다음 '-' 문자로 가는 것이 아니라 't' 문자로 간다.
  • b - 한 단어 왼쪽으로 이동.

(2) 삭제
  • x - 커서 위에 있는 문자 삭제.
  • dw - 커서부터 현재 단어 끝까지 삭제.
  • db - 커서의 왼쪽 문자부터 그 문자를 포함하고 있는 단어의 처음까지 삭제.
    ※ 예를 들어 'abc-def'라는 문자열에서 커서가 'd' 문자에 있다고 할 때 db를 누르면 '-' 문자가 삭제된다. 커서가 '-' 문자에 있다면 'abc' 문자열이 삭제된다.
  • dd - 커서가 있는 줄 삭제.
  • d$ - 커서가 있는 곳부터 그 줄 끝까지 삭제.
  • d0 또는 d^ - 커서의 왼쪽 문자부터 그 줄의 처음까지 삭제.

(3) 복사와 붙여넣기
  • v - 누른 지점부터 커서가 이동하는 곳까지 대상 범위로 지정. 일반적인 윈도우용 에디터에서 Shift를 누르고 커서를 움직이는 것과 동일한 효과.
  • V - 누른 지점부터 커서가 있는 곳까지의 모든 줄 전체를 대상 범위로 지정.
  • Crtl+v - 누른 지점부터 커서가 있는 곳까지 직사각형(칼럼)으로 대상 범위 지정.
  • y - 위에서 지정한 범위를 복사.
  • p - 복사한 내용을 커서 오른쪽에 붙여넣기.
  • P - 복사한 내용을 커서 왼쪽에 붙여넣기.

(4) 검색과 치환(치환은 Last-line 모드)
  • / - 누른 후 검색할 문자열을 입력하고 엔터를 누르면 커서 위치를 기준으로 정방향으로 해당 문자열을  검색. 이후 '/' 문자만 입력하고 엔터를 누르면 다음 검색 위치로 이동.
  • ? - 위의 /와 거의 동일하며 커서 위치를 기준으로 역방향 검색.
  • :%s/old/new/ - 문서 전체에서 'old' 문자열을 'new' 문자열로 치환. 단, 같은 줄에 2개 이상의 'old' 문자열이 있을 경우 첫 번째 문자열만 치환.
    ※ '%' 문자는 global로서 문서 전체를 의미.
  • :%s/old/new/gc - 위와 거의 동일하며 맨 뒤에 'g' 옵션(global)으로 인해 한 줄에 여러 'old' 문자열이 있어도 모두 치환 대상으로 취급한다는 것과 'c' 옵션(confirm)으로 인해 치환 전마다 치환 여부를 물어본다는 것이 다르다.
    ※ %와 g 옵션 모두 global이라는 뜻이지만 효과는 다르다.
  • :1,15s/old/new/gc - 문서 전체 대신 1번째 줄에서 15번째 줄까지만 치환 대상으로 함.

(5) 실행 취소와 재실행
  • u - 실행 취소. 윈도우의 Crtl+z와 동일.
    ※ Vim이 아닌 vi(그리고 vi 호환 모드로 실행되고 있는 Vim)는 바로 이전 명령만 실행 취소가 가능.
  • Crtl+r - 재실행. 윈도우의 Ctrl+y와 동일.

(6) 저장과 종료(모두 Last-line 모드)
  • :w - 저장.
  • :q - 종료.
  • :wq - 저장 후 종료.
  • :q! - 저장하지 않고 종료.
  • :w newfile - 'newfile'이라는 새 이름으로 저장. 원본 파일은 그대로 존재.
2010/12/04 18:10 2010/12/04 18:10
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Linux: Find Out Which Process Is Listening Upon a Port

  특정 포트를 열고 있는 프로세스를 찾거나 반대로 특정 프로세스가 열고 있는 포트를 찾는 방법입니다. 이 글에서는 3가지의 툴과 /proc 파일 시스템의 PID 디렉토리에 대해 설명합니다.
  1. netstat - 네트워크 연결, 라우팅 테이블, 네트워크 인터페이스 통계 수치를 보여주는 툴.
  2. fuser - 특정 파일이나 소켓을 사용하는 프로세스 검색.
  3. lsof - 모든 열린 파일과 그 파일을 연 프로세스를 보여주는 툴
  4. /proc/$pid/ 파일 시스템 - /proc에는 실행 중인 프로세스마다 /proc/PID 형태의 디렉토리가 하나씩 존재한다. 이 디렉토리에는 프로세스 이름, 열고 있는 포트 등의 정보가 들어 있다.
  이 글에서 나오는 명령어들은 루트 권한으로 실행해야 합니다.

1. netstat
$ sudo netstat -tulpn | grep :3306
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address State  PID/Program name
tcp        0      0 127.0.0.1:3306 0.0.0.0:*       LISTEN 5669/mysqld
[...이하 생략...]
  위 명령어는 (TCP)3306 포트를 열고 있는 프로세스가 PID 5669번인 mysqld라는 것을 보여줍니다. 이것은 아래처럼 /proc을 이용해서 재확인할 수 있습니다.
$ sudo ls -l /proc/5669/exe
lrwxrwxrwx 1 root root 0 2010-11-12 10:20 /proc/5669/exe -> /usr/sbin/mysqld


2. fuser
  TCP 3306번 포트를 열고 있는 프로세스의 PID를 찾는 방법은 아래와 같습니다.
$ sudo fuser 3306/tcp
3306/tcp:             5669
  이 PID 번호를 가진 프로세스의 이름을 찾는 방법은 바로 위에서 봤던 방법과 동일합니다.
$ sudo ls -l /proc/5669/exe
lrwxrwxrwx 1 root root 0 2010-11-12 10:20 /proc/5669/exe -> /usr/sbin/mysqld
  찾은 프로세스의 이름을 가지고 man이나 whatis 명령어를 사용하면 대충 어떤 프로세스인지 알 수 있습니다.

  PID를 가지고 프로세스의 현재 작업 디렉토리를 알아내는 방법은 2가지로 다음과 같습니다.
$ sudo ls -l /proc/5669/cwd
lrwxrwxrwx 1 root root 0 2010-11-17 22:53 /proc/5669/cwd -> /var/lib/mysql

$ sudo pwdx 5669
5669: /var/lib/mysql
  PID가 3306번인 프로세스의 주인을 찾는 방법은 아래와 같습니다.
$ ps aux | grep 3306
mirashi   2664  0.0  0.0   3044   784 pts/0    S+   10:19   0:00 grep 3306
mysql     5669  0.0  1.2 131512 24720 ?        Sl   Nov12  15:21 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
  참고로 위 결과를 보면 첫 번째 줄에 쉘 프로세스가 자신의 grep 명령어로 인해 같이 검색되서 나옵니다. 이걸 방지하는 간단한 방법은 위 명령어 대신 'ps aux | grep [3]306'을 사용하는 것이며 이에 대한 설명은 여기를 참고하시기 바랍니다.


3. lsof
  이 글의 목적에 해당하는 사용법은 아래와 같습니다.
lsof -i :portNumber
lsof -i tcp:portNumber
lsof -i udp:portNumber
  아래는 위의 사용법에 따라 3306 포트를 열고 있는 프로세스를 찾는 예제입니다.
mirashi@myservlab:~$ sudo lsof -i :3306
COMMAND  PID  USER FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  5669 mysql 11u  IPv4  16181     0t0  TCP localhost:mysql (LISTEN)


팁1. ps를 이용해 더 유용한 정보 얻기
  PID를 알고 있으면 ps를 통해 더 유용한 정보를 얻을 수 있습니다.
mirashi@myservlab:~$ ps -eo pid,user,group,args,etime,lstart | grep '[5]669'
 5669 mysql    mysql    /usr/sbin/mysqld --basedir= 20-04:46:18 Fri Nov 12 06:33:55 2010
  위 출력 결과에서 각 칼럼에 대한 내용은 아래와 같습니다.
  • 5669 : PID
  • mysql : 유저명(EUID)
  • mysql : 그룹명(EGID)
  • /usr/sbin/mysqld --basedir= : 명령어와 인수(정확히 보려면 pid와 args만 별도로 사용 추천)
  • 20-04:46:18 : 프로세스가 실행된 후로 지난 시간. 형식은 [[dd-]hh:]mm:ss
  • Fri Nov 12 06:33:55 2010 : 명령어가 실행된 시간


팁2. 모르는 포트가 열려진 걸 발견한 경우
  모르는 포트가 열려 있을 경우 일단 어떤 프로세스가 해당 포트를 사용하는지 알아봅니다. /etc/services 파일은 유명한 서비스들이 사용하는 포트 번호와 프로토콜을 담고 있으므로 'grep 포트 /etc/services' 명령어를 통해 해당 포트가 일반적으로 어떤 용도로 쓰이는지 확인할 수 있습니다.

  만약 열려 있을 리가 없는 포트가 열려 있다면 루트킷(시스템의 관리자 권한을 강탈하기 위한 해킹 툴을 총칭)이 있을 가능성이 있으므로 확인해보는 것이 좋습니다.

  특히 해킹당한 서버는 다른 컴퓨터에 대량의 스팸 메일 전송, 악성 코드 전송, DoS 계열의 공격을 하는 경우가 많기 때문에 갑자기 네트워크 사용량이 늘어나 그 상태를 유지하는 경우 의심할 필요가 있습니다.


2010/12/02 11:56 2010/12/02 11:56