컴퓨터공부/Linux & Unix

쉘 스크립트 Tip 몇개..

achivenKakao 2007. 6. 20. 00:46

Linux File Backup Script
#!/bin/bash

today=`date +%F`
day=`date +%A`
hour=`date +%H`
min=`date +%M`

tar cvzf /home/backup/ruony-$today-$day-$hour:$min.tar.gz ./*


결과물 형태는 대략

ruony-2007-06-19-화요일-22:24.tar.gz

이런형태로 나옴...


예 A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트

#!/bin/bash

# "ex72.sh" 예제를 암호화된 비밀번호를 사용하도록 수정함.

#  하지만 복호화된 비밀번호가 그대로 전송되기 때문에 
#+ 아직도 안전하지는 않습니다. 주의하세요.
# 이 점이 걱정된다면 "ssh" 같은 것을 써보세요.

E_BADARGS=65

if [ -z "$1" ]
then
  echo "사용법: `basename $0` filename"
  exit $E_BADARGS
fi  

Username=bozo           # 알맞게 고치세요.
pword=/home/bozo/secret/password_encrypted.file
# 암호화된 비밀번호가 들어있는 파일.

Filename=`basename $1`  # 파일이름에서 경로이름을 떼어 냅니다.

Server="XXX"
Directory="YYY"         # 실제 서버이름과 디렉토리로 바꾸세요.


Password=`cruft <$pword`          # 비밀번호 복호화.
#  저자가 만든 고전적인 1회용 암호표(onetime pad) 알고리즘에 기반한
#+ "cruft" 파일 암호화 패키지를 씁니다.
#+ "cruft"는 다음에서 얻을 수 있습니다.
#+ Primary-site:   ftp://metalab.unc.edu /pub/Linux/utils/file
#+                 cruft-0.2.tar.gz [16k]


ftp -n $Server <<End-Of-Session
user $Username $Password
binary
bell
cd $Directory
put $Filename
bye
End-Of-Session
# "ftp"의 -n 옵션은 자동 로그인을 막아줍니다.
# "bell"은 파일 전송이 일어날 때마다 '벨'을 울려줍니다.

exit 0


예 A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트

#! /bin/sh
# 메일이나 뉴스 메세지에서 첫번째 빈 줄이 나올 때까지의 
# 헤더를 떼어 내 주는 스크립트.
# 토론토 대학의 Mark Moraes 작성

# --> 이 주석은 HOWTO 저자가 붙인 것입니다.

if [ $# -eq 0 ]; then
# --> 명령어 줄 인자가 없다면 표준입력에서 재지향되어 들어오는 파일에 대해서 동작함.
	sed -e '1,/^$/d' -e '/^[ 	]*$/d'
	# --> 공백 문자로 시작하는 첫번째 줄이 나올 때까지
	# --> 빈 줄과 모든 줄을 지웁니다.
else
# --> 명령어 줄 인자가 있다면 그 주어진 파일에 대해서 동작함
	for i do
		sed -e '1,/^$/d' -e '/^[ 	]*$/d' $i
		# --> 위와 같습니다.
	done
fi

# --> 독자를 위한 연습문제: 에러 체크와 다른 옵션을 추가해 보세요.
# -->
# --> 작은 sed 스크립트가 인자를 넘기는 것만 빼고 반복되는것을 유심히 살펴 보세요.
# --> 이 부분을 함수로 빼는게 이치에 맞을까요? 그 대답에 대해서 설명해 보세요.

예 A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트

#! /bin/sh 
# $Id: ftpget,v 1.2 91/05/07 21:15:43 moraes Exp $ 
# 익명 ftp에 배치 작업을 실행하는 스크립트. 기본적으로 명령어 라인 인자들을
# ftp의 입력으로 바꿔주는 일을 합니다.
# 간단하고 빠릅니다 - ftplist와 한 쌍이 되도록 작성됐습니다.
# -h 는 접속할 호스트를 나타냅니다(기본값은 prep.ai.mit.edu)
# -d 는 접속후 cd 로 옮겨갈 디렉토리를 나타냅니다. -d 를 여러번 쓸 수도 
# 있는데, 이렇게 하면 주어진 순서대로 디렉토리를 옮겨갈 것입니다.
# 만약에 해당 디렉토리가 상대 경로라면 순서를 잘 매겨야 합니다. 
# 요즘엔 너무 많은 심볼릭 링크가 존재하기 때문에 아주 조심해서 사용해야 합니다.
# (기본값은 ftp 로그인 디렉토리)
# -v 는 ftp의 verbose모드를 켜서, ftp 서버의 모든 응답을 보여줍니다.
# -f remotefile[:localfile] 은 remote 파일을 local 파일로 이름을 바꿔 
# 가져옵니다.
# -m pattern 은 주어진 패턴에 해당하는 파일들을 mget으로 가져옵니다.
# 쉘 문자들을 인용(quote)해야 하는 것을 기억하세요.
# -c 는 현재 자신의 시스템에서 주어진 디렉토리로 cd 를 실행합니다.
# 예를 들면,
# 	ftpget -h expo.lcs.mit.edu -d contrib -f xplaces.shar:xplaces.sh \
#		-d ../pub/R3/fixes -c ~/fixes -m 'fix*' 
# 는 expo.lcs.mit.edu 의 ~ftp/contrib 에서 xplaces.shar 를 현재 디렉토리에
# xplaces.sh 로 가져오고, ~ftp/pub/R3/fixes 에서 모든 수정 파일('fix*')들을
# 자기 시스템의 ~/fixes 디렉토리로 가져옵니다.
# ftp 에서 해당 명령어가 주어진 순서대로 실행되기 때문에 옵션 순서가 
# 중요하다는 것은 아주 확실합니다.
#
# Mark Moraes (moraes@csri.toronto.edu), Feb 1, 1989 
# ==> Docbook에서 처리할 수 있도록 부등호 괄호를 소괄호로 바꾸었습니다.
#

# ==> 이런 주석은 HOWTO 저자가 덧붙인 주석입니다.

# PATH=/local/bin:/usr/ucb:/usr/bin:/bin
# export PATH
# ==> 원래 스크립트에 있던 위 두 줄은 쓸데없어 보입니다.

TMPFILE=/tmp/ftp.$$
# ==> 스크립트의 프로세스 ID($$)로 임시 파일을 만듦.

SITE=`domainname`.toronto.edu
# ==> 'domainname'은 'hostname'과 비슷합니다.
# ==> 좀 더 일반적으로 쓰려면 매개변수로 처리하도록 재작성 할 수도 있습니다.

usage="사용법: $0 [-h remotehost] [-d remotedirectory]... [-f remfile:localfile]... \
		[-c localdirectory] [-m filepattern] [-v]"
ftpflags="-i -n"
verbflag=
set -f 		# -m 옵션에서 globbing을 쓰기 위해서
set x `getopt vh:d:c:m:f: $*`
if [ $? != 0 ]; then
	echo $usage
	exit 65
fi
shift
trap 'rm -f ${TMPFILE} ; exit' 0 1 2 3 15
echo "user anonymous ${USER-gnu}@${SITE} > ${TMPFILE}"
# ==> 쿼우트 추가(복잡한 echo 문에서는 이렇게 하기 바랍니다).
echo binary >> ${TMPFILE}
for i in $*   # ==> 명령어줄 인자를 파싱.
do
	case $i in
	-v) verbflag=-v; echo hash >> ${TMPFILE}; shift;;
	-h) remhost=$2; shift 2;;
	-d) echo cd $2 >> ${TMPFILE}; 
	    if [ x${verbflag} != x ]; then
	        echo pwd >> ${TMPFILE};
	    fi;
	    shift 2;;
	-c) echo lcd $2 >> ${TMPFILE}; shift 2;;
	-m) echo mget "$2" >> ${TMPFILE}; shift 2;;
	-f) f1=`expr "$2" : "\([^:]*\).*"`; f2=`expr "$2" : "[^:]*:\(.*\)"`;
	    echo get ${f1} ${f2} >> ${TMPFILE}; shift 2;;
	--) shift; break;;
	esac
done
if [ $# -ne 0 ]; then
	echo $usage
	exit 65   # ==> 표준을 따르기 위해 "exit 2"였던 것을 수정.
fi
if [ x${verbflag} != x ]; then
	ftpflags="${ftpflags} -v"
fi
if [ x${remhost} = x ]; then
	remhost=prep.ai.mit.edu
	# ==> 여러분이 좋아하는 ftp 싸이트로 바꾸세요.
fi
echo quit >> ${TMPFILE}
# ==> 모든 명령어는 임시 파일로 저장됩니다.

ftp ${ftpflags} ${remhost} < ${TMPFILE}
# ==> 이제 임시 파일에 저장됐던 명령어들이 ftp 에 의해 한 번에 처리됩니다.

rm -f ${TMPFILE}
# ==> 끝으로, 임시 파일 삭제(지우지 않고 로그 파일로 복사할 수도 있습니다).


# ==> 독자들을 위한 연습문제:
# ==> 1) 에러 체크를 추가하세요.
# ==> 2) 다른 편리한 기능들(bells & whistles)을 넣어보세요.