BLOG main image
Their Finest Hour! Since1999..

카테고리

분류 전체보기 (934)
My Page (47)
Linux/Unix (604)
::FAQ (279)
::Fundamentals (285)
::Shell Script (2)
::Apache (22)
::Tomcat (0)
::Sendmail (9)
::Qmail (0)
::DNS -Bind (4)
::AnNyung Linux (3)
Windows (219)
Database (61)
Programming (1)
Network (0)
ScreenShot (1)
Tip (1)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백


일반적으로 grep 으로 해당 디렉터리에 위치한 파일들이 포함하고 있는 특정 문자열을 찾지만, 하위 디렉터리까지 찾을 때에는 다음과 같은 방법들을 많이 사용합니다.
cat * | grep 문자열 `ls`
find ./ -name '*' | xargs grep -ne '문자열'
find . -exec grep '문자열' {} /dev/null \;
grep -nHr 문자열 *
이 외에도 여러가지가 있지만 더욱 간단한 방법으로 다음의 명령으로 해결 할 수도 있습니다.
grep -R 문자열 *
하지만 간혹 구버전일 경우 -R 옵션이 없는 경우가 있을 수 있으며, 그러한 때에는 다음의 명령을 이용할 수도 있습니다.
grep --recursive "문자열" *
Posted by 채종윤
이 글은 암호없이 scp를 사용하는 방법을 설명한다.

리눅스 시스템 관리자는 자주 컴퓨터간에 파일을 복사하거나 파일을 여러 컴퓨터로 전송한다.
ftp를 사용해도 되지만, scp를 사용하면 많은 이점이 있다.
ftp는 LAN/WAN에 내용(심지어 암호도)을 그대로 전송하지만, scp는 암호화하여 전송하기때문에 ftp보다 안전하다.

scp의 장점은 쉽게 스크립트에서 사용할 수 있는 점이다. 파일을 리눅스 컴퓨터 100대로 복사한다고 가정한다.
직접 100번 복사 명령어를 실행하는 것보다 스크립트를 작성하고 싶을 것이다.
스크립트에서 ftp를 사용하면 로그인할때마다 암호를 물어보기때문에 힘들다
(역주; netrc 파일을 사용하여 암호를 자동으로 입력하게 만들 수 있지만 보안상 위험하다).
대신 scp를 사용하는 경우 원격 리눅스 컴퓨터가 암호를 물어보지 않도록 설정할 수 있다.
믿거나 말거나 이 방법은 ftp보다 훨씬 더 안전하다!

scp의 기본 문법은 다음과 같다.
현재 컴퓨터에 있는 'abc.tgz' 파일을 'bozo'라는 원격컴퓨터의 /tmp 디렉토리로 복사하려면:

scp abc.tgz root@bozo:/tmp

그러나 이 경우 bozo의 root 암호를 물어본다.
암호를 물어본다면 스크립트에서 쉽게 사용할 수 없다.
해결책은 다음과 같다 (한번만 해주면 "암호없이" 무제한 scp로 복사할 수 있다):

1. 나중에 scp를 사용하여 파일을 복사할 사용자를 결정한다.
물론 root가 가장 강력하고, 난 개인적으로 root를 사용한다.
여기서 root를 사용할때 발생할 수 있는 보안상 문제점을 강의할 생각은 없다.
내가 지금 무슨 말을 하는지 모르겠다면 root가 아닌 일반 사용자를 사용하라.
결정했다면 이제 그 사용자로 로그인하여 다음 단계를 진행한다.


2. 컴퓨터에 공개키(public key)와 비밀키(private key)를 만든다.
이게 뭔가? 공개키 암호화 방식을 모른다면 15초간 설명하겠다.
공개키 암호화 방식은 수학적으로 연관된 공개키와 비밀키를 만든다.
그런 다음 공개키는 누구에게라도 줄 수 있지만, 비밀키는 아무에게도 알려주면 안된다.
키들의 수학적 구성상 신기하게도 누구나 공개키를 가지고 내용을 암호화할 수 있지만,
비밀키를 가진 당신만이 암호화한 결과를 해독할 수 있다. 어쨋든 두 키를 만드는 명령은:

ssh-keygen -t rsa


3. 다음과 같이 출력한다:
"Generating public/private rsa key pair"
"Enter file in which to save the key ... "
그냥 enter를 누른다.

4. 그러면 다음과 같이 출력한다:
"Enter passphrase (empty for no passphrase):"
passphrase를 사용하지 않기때문에 enter를 두번 누른다.


5. 그러면 마지막으로:
"Your identification has been saved in ... "
"Your public key has been saved in ... "
방금 만든 공개키 파일명과 위치를 기억하라 (항상 파일명이 .pub로 끝난다).

6. 공개키를 파일을 복사할 모든 원격 리눅스 컴퓨터에 복사한다.
scp나 ftp를 사용하여 복사한다. root를 선택했다면 (다시 단계 1의 경고를 주의하라),
키는 /root/.ssh/authorized_keys (철자 조심!)에 있어야 한다. root가 아니고 예를 들어 clyde로 로그인한다면,
/home/clyde/.ssh/authorized_keys 에 있어야 한다. authorized_keys 파일이 다른 컴퓨터의 키를 저장하고 있을 수 있기때문에,
파일에 이미 내용이 있다면 (새파일을 덮어쓰지않고) 공개키 파일 내용을 뒤에 추가해야 한다.

이제 끝이다. 별다른 문제가 없다면 파일을 암호없이 원격컴퓨터로 scp할 수 있다. 다시 한번 테스트해보자.
컴퓨터에 있는 'xyz.tgz' 파일을 'bozo'라는 원격컴퓨터의 /tmp 디렉토리로 복사한다

scp xyz.tgz root@bozo:/tmp

와 !!! 암호를 물어보지 않고 복사가 된다!!

일단 암호 하나로 컴퓨터에 로그인하면 모든 원격컴퓨터에 접근할 수 있기때문에 보안에 대해서 주의하라.
그래서 암호를 더 잘 보호해야 한다.

이제 즐길 차례다.
컴퓨터에 있는 'houdini'란 파일을 10개 도시에 흩어져있는 원격컴퓨터의 /tmp 디렉토리로 복사하는 짧은 스크립트를 (5분 안에)
작성해보자. 물론 원격컴퓨터가 100대거나 1000대라도 마찬가지다.
원격컴퓨터들의 이름은: brooklyn, oshkosh, paris, bejing, winslow, rio, gnome, miami, minsk, tokyo.
스크립트는 다음과 같다:

#!/bin/sh
for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo
do
scp houdini root@$CITY:/tmp
echo $CITY " is copied"
done

신기한 마술같다.
스크립트에서 echo 줄은 현재 진행상황을 알려준다.

혹시 쉘스크립트가 생소하다면 좋은 투토리얼이 있다:
http://www.freeos.com/guides/lsst/.

알다시피 scp는 더 강력한 ssh의 일부이다.
위의 6 단계를 마쳤다면 원격컴퓨터에서 명령어를 실행할 수 있다
(물론 암호없이!). 예를 들어, brooklyn 이라는 원격컴퓨터의 시간을 보려면:

ssh brooklyn "date"

이제 두 개념을 합쳐서 진짜로 멋진 스크립트를 만들어보자. 모든 원격 리눅스 컴퓨터를 백업하기란 쉬운 일이 아니다. 아래 스크립트는 각 컴퓨터의 /home 디렉토리를 백업한다. 상용 백업 소프트웨어와 비교하면 기능은 매우 기본적이지만, 가격면에서는 따라올 수 없다. 대부분의 상용 백업 소프트웨어는 백업할 컴퓨터 대수대로 가격을 매긴다. 이런 패키지를 사용한다면 원격컴퓨터 100대에 대한 비용을 지불하는 대신 원격컴퓨터를 한 컴퓨터로 백업하는 스크립트를 사용한라. 그리고 그 컴퓨터에서만 상용 패키지를 사용하면 99대분 가격을 절약할 수 있다 ! 어쨌던 스크립트를 참고하여 자신의 상황에 알맞는 스크립트를 작성할 수 있다. 이 스크립트를 cron 작업에 걸어둔다 (원격컴퓨터에는 필요없다). 주석을 보면 자세한 내용을 알 수 있다:

#!/bin/sh

# 변수는 구별하기위해 대문자로 지었다

# 스크립트를 실행하기 전에 원격컴퓨터마다 '/tmp/backups'라는 디렉토리를
# 만들고, 컴퓨터에는 '/usr/backups'라는 디렉토리를 만들어야 한다


# 컴퓨터에서,
# date 명령어 결과를 보기 좋게 만들어서 "DATE" 변수를 설정한다
#
DATE=$(date +%b%d)

# 'for 반복문'은 세가지 작업을 한다

for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo
do

# 1) 원격컴퓨터의 하드디스크가 꽉차지 않도록 저번에 실행한 스크립트가 만든 tarball을 삭제하고
# 확인을 위해 echo한다
#
ssh -1 $CITY "rm -f /tmp/backups/*.tgz"
echo $CITY " old tarball removed"

# 2) 원격컴퓨터마다 /home 디렉토리를 tarball로 만들어서 /tmp/backups에 저장한다
# tarball 파일명은 구별하기위해 도시명과 시간으로 짓는다
#
ssh $CITY "tar -zcvpf /tmp/backups/$CITY.$DATE.tgz /home/"
echo $CITY " is tarred"

# 3) 원격컴퓨터에 있는 tarball을 /usr/backups 디렉토리로 복사해온다
#
scp root@$CITY:/tmp/backups/$CITY.$DATE.tgz /usr/backups
echo $CITY " is copied"

done


# 나머지 부분은 오류검사용으로 없어도 된다:

# 파일명에 날짜를 포함한 오류파일을 만든다.
# 백업이 안된 컴퓨터가 있다면 이 파일에 기록한다
#
touch /u01/backup/scp_error_$DATE

for CITY in brooklyn oshkosh paris bejing winslow rio gnome miami minsk tokyo

do

# tarball이 복사되었는지 검사한다. 없다면 오류파일에 기록한다
# '||'은 앞에 있는 부분이 참이 아닐때만 뒤에 있는 부분을 실행한다는 뜻이다
#
ls /u01/backup/$CITY.$DATE.tgz || echo " $CITY did not copy" >> scp_error_$DATE


# tarball을 정상적으로 열 수 있는지 검사한다. 문제가 있다면 오류파일에 기록한다.
tar ztvf /u01/backup/$CITY.$DATE.tgz || echo "tarball of $CITY is No Good" >> scp_error_$DATE

done

출처 : linux gazette
Posted by 채종윤
rsync란 서로 다른 두 컴퓨터에 들어 있는 정보를 서로 동기화 시킬때 사용한다.
동일한 소스가 두군데 존재하고 한쪽을 편집했을때, 다른 한쪽에 편집한 부분을 업데이트 시켜줘야한다.
이때 모든 소스를 옮기게 되면 시간적으로 많은 낭비가 있기 때문에 rsync는 수정된 부분만 비교해서 옮겨 주게 된다.
그리고 anonymous 서버로도 설정할 수 있는등 많은 유용한 기능들이 들어있다.

rsh이나 ssh을 이용하여 전송하기
이것은 원격지의 호스트에 계정이 있고 rsync의 서버 데몬이 설정되어 있지 않을 경우 사용한다.
간단히 로컬에서도 cp 대신 사용할 수도 있다. ssh를 이용하면 안전하게 복사할 수 있다.
아래의 방법대로 하면 간단히 원격지로 복사할 수 있다.

shell> rsync -arvu -e ssh /from/directory/ to.hostname.com:/to/direcotry

여기서 디렉토리를 써 줄경우 마지막 부분의 /가 중요한 의미를 가진다.
마직막에 /가 있을 경우는 그 디렉토리 내의 모든 파일을 의미하고 /가 없을 경우는 그 디렉토리 자체를 말하는 것이다.
-arvu는 아래 부분을 참조하기 바란다.

원격지 서버 설정하기
먼저 리눅스 최신본을 설치하면 기본적으로 rsync가 설치된다. 그러나 xinetd를 이용하여 서버로 설정은 되어 있지 않기 때문에 서버로 사용할 수 있도록 설정을 해 주어야 한다.

xinetd.d에 rsync파일 추가하기
/etc/xinetd.d디렉토리에 rsync라는 파일을 만들고, 아래와 같은 내용을 입력한뒤, 저장한다.

service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

/etc/services파일에도 아래와 갈은 내용이 없으면 추가해 주도록 한다.

rsync 873/tcp # rsync
rsync 873/udp # rsync

그리고 /etc/rc.d/init.d/디렉토리에서 xinetd를 restart 시켜준다.

shell> /etc/rc.d/init.d/xinetd restart

rsyncd.conf 파일 생성
/etc디렉토리에 rsync.conf라는 파일을 생성한다.

#motd = /etc/rsync.motd # file : message of the day
uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid

[www.wangsy]
path = /somewhere/in/remote/host
comment = www.wangsy.com homepage
read only = false
uid = apache
gid = apache
auth users = wangsy
secrets file = /etc/rsyncd.secrets

위 파일과 함께 /etc디렉토리에 rsyncd.secrets파일도 함께 생성한다.

name:password

그리고 /etc/rsyncd.secrets파일의 permission을 rw-------로 해주는 것을 잊지 말도록 한다.

client에서 접근하기
서버 내용 내려받기
다음 명령을 통해서 서버의 내용을 다운 받을 수 있다.

shell> rsync -avz home.inzoo.co.kr::www.wangsy target_dir/

그리고 아래 명령을 통해서 로컬에서 수정된 파일을 서버에 반영할 수 있다.

shell> rsync -avz target_dir/ home.inzoo.co.kr::www.wangsy

위에서 -avz의 의미는 각각 다음과 같다. 자세한 사항은 rsync 홈페이지의 메뉴얼에서 확인할 수 있다.

-a, --archive archive mode
-v, --verbose increase verbosity
-z, --compress compress file data
-u, --update update only (don't overwrite newer files)

약간의 문제
client의 ip와 hostname이 lookup되지 않으면 remote호스트에서 접근을 허용하지 않는 문제가 있다. 이는 ADSL로 접속할 경우 연결이 되지 않게 되는 문제가 발생한다. 서버로 바로 접속하는 것 보다는 위 처음 방식인 ssh를 통한 접속 방법이 좀더 보안상 안전하기 때문에 이방법을 이용하는것이 좋을듯 하다.

관련 사이트
rsync 공식 홈페이지
linux.co.kr내 테마 리눅스-rsync 강좌
Posted by 채종윤

Total : Today : Yesterday :
채종윤's Blog is powered by Daum & Tattertools.com / Designed by tistory.com