bash script (backup)2020. 10. 21. 16:56

 

반달가면 이글루에서 백업 - bahndal.egloos.com/406163

 

그냥 echo 명령만 사용하면 자동으로 줄바꿈이 되는데, 전에 출력한 문자열을 지우고  새 문자열을 겹쳐 쓰고 싶다면 -n 옵션과 -e 옵션을 사용하자.

-n 옵션은 줄바꿈을 하지 않는 것이고, -e 옵션은 리턴(\r), 탭(\t) 등을 사용할 수 있게 해 주는 옵션이다.

echo "abc\tdef"
abc\tdef
echo -e "abc\tdef"
abc    def

전에 출력한 문자열을 지우고 그 자리에 새로운 문자열을 출력하려면, 첫번째 문자열을 출력할 때 -n 옵션으로 줄바꿈을 억제한 후에 다음 문자열을 출력할 때 -e 옵션으로 리턴(\r)을 출력해서 프롬프트를 줄 시작점으로 보내주면 된다. 아래의 예시를 참고하자.

echo -n "this is the first."
sleep 3
echo -e "\rthis is the 2nd.   "

첫번째 문자열 출력후 3초후에 두번째 문자열을 같은 줄에 겹쳐 쓰게 된다.

두번째 문자열이 첫번째보다 짧다면 이전 출력 뒷부분이 남을 것이므로 뒤쪽에 공백(space)을 충분히 주자.

shell script에서 진행 상황을 표시해 주고 싶을 때 요긴하게 사용할 수 있다. 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 21. 12:20

 

반달가면 이글루에서 백업 - bahndal.egloos.com/404027

 

텍스트 파일에서 대문자를 전부 소문자로 바꾸거나 소문자를 전부 대문자로 바꾸는 방법이다. tr 명령을 이용하면 되겠다.

 

# sample.txt 파일의 소문자를 전부 대문자로 바꾸는 경우

tr [:lower:] [:upper:] < sample.txt

 

#반대로 대문자를 전부 소문자로 바꾸는 경우

tr [:upper:] [:lower:] < sample.txt

 

위와 같이 하면 바뀐 결과가 화면에 출력된다. 파일로 저장하고 싶으면 아래와 같이 하면 된다. sample.txt 파일에서 대문자를 모두 소문자로 바꾸고 이 결과를 sample.lower.txt에 저장하는 방법이다.

 

tr [:upper:] [:lower:] < sample.txt > sample.lower.txt

 

스크립트에서 특정 변수에 할당된 문자열에 적용하는 것도 간단하다. 변수 sample_string에 할당된 문자열을 모두 소문자로 변환하고 싶다면 아래의 예시를 참고하자.

 

sample_string="This Is A Sample String"

echo "$sample_string" | tr [:upper] [:lower:]

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 21. 12:16

 

반달가면 이글루에서 백업 - bahndal.egloos.com/402428

 

난수(random number)를 생성하고 싶으면 $RANDOM 변수를 이용하면 되겠다.

echo $RANDOM

위와 같이 그냥 사용하면 0에서 32767 사이의 자연수가 만들어진다. 만약 난수의 범위를 정하고 싶다면 모듈로(modulo)연산을 이용하자. 예를 들어 두자리수를 만들려면 난수를 100으로 나눈 나머지값을 취하면 된다.

echo `expr $RANDOM % 100`

 

좀 더 복잡한 범위를 주고 싶다면 지난번에 올린 산수 계산 게시물에 있는 bc를 이용하자.

범위가 120이상 253이하인 난수를 만들려면 어떻게 할까? 일단 0~133 사이의 난수를 만든 후에 120을 더해 주면 된다.

 

echo "($RANDOM % 134) + 120" | bc

변수를 이용하면 좀 더 유연하게 사용할 수 있겠다. 난수 생성용 seed는 현재 시각의 나노초(nanosecond) 부분을 사용했다.

 

# random seed
RANDOM=`date "+%N"`
# make a random number between 120 & 253
min_val=120
max_val=253
mod_val=`echo "$max_val - $min_val + 1" | bc`
random_val=`echo "($RANDOM % $mod_val) + $min_val" | bc`
echo $random_val

 

Posted by 반달가면

댓글을 달아 주세요

리눅스 (backup)2020. 10. 20. 17:18

 

반달가면 이글루에서 백업 - bahndal.egloos.com/439787

 

자주 쓸 일은 없지만, 뭔가 꼬여서 부팅이 제대로 되지 않거나 NVIDIA의 VGA 드라이버를 설치해야 하거나 할 때 리눅스 실행 레벨(run level)을 단일 사용자(single-user, run level 1)로 낮출 필요가 생긴다.

GRUB으로 부팅할 때 실행 레벨을 지정해 주면 되겠다. 

부팅할 때 GRUB이 실행되면서 부팅 메뉴가 나오는데, 여기서 키보드의 e키를 누르면 해당 항목의 세부 내용이 표시되고 이를 변경할 수가 있다.

 

 

화살표키를 눌러서 차근차근 아래로 내려가다 보면 linux로 시작되는 행이 나오는데, 이 행 맨 마지막에 실행 레벨을 써 준다.

linux  /boot/vmlinuz-... splash=silent quiet showopts (원래 설정)

linux  /boot/vmlinuz-... splash=silent quiet showopts 1 (실행 레벨 1로 지정, 단일 사용자 모드로 부팅)

이 상태에서 F10을 누르면 변경된 설정을 적용해서 부팅이 진행된다. 변경 내용이 저장되는 것은 아니므로 다음에 부팅할 때는 원래 설정이 적용된다. 

 

Posted by 반달가면

댓글을 달아 주세요

리눅스 (backup)2020. 10. 20. 11:12

 

반달가면 이글루에서 백업 - bahndal.egloos.com/437831

 

멀티미디어 코덱 등 오픈수세 리눅스의 기본 패키지 저장소에는 없는 패키지를 설치하기 위해 팩맨 패키지 저장소(Packman Repository)를 추가해 보았다. 추가적인 오픈수세 패키지 저장소들 중에 가장 크고 잘 알려진 저장소다.

패키지 추가 명령 형식은 아래와 같다.
zypper ar -f http://[저장소URL] [저장소 이름]
  ar: 저장소 추가
  -f: 자동 갱신(auto refresh)

 

팩맨 저장소의 URL은 오픈수세 12.2의 경우 아래와 같다.

 

packman.inode.at/suse/openSUSE_12.2/

 

다른 버전의 경우 위의 디렉토리 이름에서 버전을 바꾸면 된다. /suse/openSUSE_12.3/ 이런 식으로. (웹브라우저로 직접 들어가서 디렉토리 이름을 확인해도 되겠다. 현재 버전 11.1부터 12.3까지 있다. packman.inode.at/suse/ )

 

자, 그럼 팩맨 저장소를 추가해 보자. 루트 권한이 필요하므로 su 명령으로 루트가 된 다음 추가하면 되겠다. 터미널창에서 아래와 같이 입력.

 

su

zypper ar -f http://packman.inode.at/suse/openSUSE_12.2/ packman                               

 

또는 YaST에서 GUI를 통해 추가하는 것도 가능하다. Software Manager(YaST -> Software Management) 상단 메뉴에서 Configuration -> Repositories 항목으로 가면 현재 추가되어 있는 저장소 목록이 나오는데 여기에서 'Add' 버튼을 누르고 안내에 따라 추가하면 된다. 종류(Media Type)를 선택하는 창이 나오는데, 팩맨 저장소의 경우 HTTP로 선택하고 URL을 적어 주면 된다.

 

저장소를 추가한 후에 S/W 관리자를 실행하면 팩맨 저장소에 대응되는 GPG Key를 가져온다는 창이 뜨는데, 'Trust' 버튼을 클릭하면 되겠다. 여기까지 하면 완료. 이제 팩맨 저장소에 있는 S/W를 검색하고 설치할 수 있다.

추가 저장소에 대한 자세한 안내는 오픈수세 홈페이지에 있다. 여기로

 

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 20. 11:02

 

반달가면 이글루에서 백업 - bahndal.egloos.com/399592


리눅스 셸에서 산수 계산을 하는 방법이다.

간단한 정수 연산은 아래와 같이 할 수 있다.

expr 34 + 51

이렇게 하면 85가 출력될 것이다. 수와 연산기호 사이에는 반드시 띄어쓰기를 해 주자. 더하기(+), 빼기(-), 곱하기(\*), 나누기(/), 모듈로(modulo, %) 등을 할 수 있다. 곱하기의 경우 연산기호에 유의하자. 반드시 \* 이렇게 써야 한다.

34*51의 결과를 result 변수에 저장하려면 아래와 같이 하면 되겠다.

result=`expr 34 \* 51`
echo "$result"

정수가 아니라 실수를 사용하고 싶다거나, 연산기호가 여러개 들어가는 복잡한 계산을 하려면 expr로는 안되고 bc를 이용해야 한다.

34.8+51.2를 더하고 이 값을 제곱하려면 아래와 같이 하면 되겠다.

echo "(34.8+51.1)^2" | bc

bc를 사용할 때는 곱하기 연산기호를 평소처럼 그냥 쓰면 된다. 예를 들어 24*3은 아래와 같이 하면 된다.

echo "24*3" | bc

echo 명령으로 출력하는 수식은 반드시 따옴표로 묶어 주자.


-- 2013.7.24 추가 --

실수 나눗셈에 대한 부분을 추가로 적어 두기로 했다.

echo "1/2" | bc
0

1을 2로 나누는 예시인데, 결과가 0.5가 아니라 0이라고 나온다. 기본 설정이 정수 연산으로 되어 있어서 그러니, 제대로 된 결과를 얻으려면 scale 변수에 소수점 이하 몇자리를 출력할 것인지 지정해 주어야겠다. 소수점 이하 세자리를 출력하고 싶으면 아래와 같이 해 보자.

echo "scale=3; 1/2" | bc
0.500

이제 결과가 제대로 나왔다.

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 19. 09:54

 

반달가면 이글루에서 백업 - bahndal.egloos.com/396980

 

지난번에 적어 놓은 ssh 자동 접속 방법을 조금 확장시켜 볼 수 있겠다.

expect는 인자(argument)를 사용할 수 있기 때문에, 접속 주소나 암호 등을 script에 넣지 않고 인자로 지정할 수 있다. 실행 명령에 사용된 인자는 argv라는 이름의 변수로 가져온다.

 

예제 script 이름은 ssl_login2.exp로 하자. 인자 순서는 접속주소, 접속암호, 셸 프롬프트(shell prompt) 문자열 순서로 정하면 실행은 이런 식이 될 것이다.

 

expect -f ssl_login2.exp john@192.168.0.10 my_password "john>"

 

ssh서버 192.168.0.10에 john이라는 계정으로 접속하고 암호는 my_password인 경우이다. 로그인했을 경우 셸 프롬프트에 john>이라는 문자열이 들어있다고 가정했다. 셸 프롬프트를 인자로 가져오는 경우 bash에서 사용되는 특수 기호(>, | 등)가 포함되어 있다면 위의 예와 같이 반드시 따옴표 처리를 해 주자.

 

ssl_login2.exp script는 아래와 같이 만들면 되겠다. 인자로 받은 주소, 접속암호, 셸 프롬프트 문자열 값을 각각 addr, password, prompt 변수에 할당했다. 로그인 후에 하는 작업은 지난번처럼 그냥 커널 버전 확인만 하는 것으로 했다.

 

# script file: ssl_login2.exp

# version 2 (with argument support)

# set variables

set addr [lindex $argv 0]

set password [lindex $argv 1]

set prompt [lindex $argv 2]

# spawn ssh session

spawn ssh $addr

expect -nocase "password"

send "$password\r"

expect "$prompt"

# execute commands (in this example, 'uname -r')

send "uname -r\r"

expect "$prompt"

send "exit\r"

exit 0

 

각기 다른 서버에 들어가 같은 종류의 반복작업을 해야 할 경우 나름 편리하게 사용할 수 있다.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 19. 09:48

 

반달가면 이글루에서 백업 - bahndal.egloos.com/391964

 

앞에 게시한 ftp, telnet, ssh 자동접속 script를 사용할 경우 script에 접속 암호가 그대로 표시된다. 그러므로 반드시 해당 파일에 대한 접근권한을 제대로 설정해 주어야만 한다.

 

예를 들어 login.sh라는 파일을 만들었다면, 다른 사용자가 script 내용을 볼 수 없도록 권한을 설정해 주어야 한다.

ssh

chmod 700 login.sh

 

권한을 이렇게 해 놓아도 당연히 root는 해당 내용을 볼 수 있다. 자동접속 기능은 편리하긴 하지만 보안 측면에서는 분명히 위험요소가 있다는 점을 명심하고, 사용해도 괜찮은 상황인지 꼼꼼하게 따져 보고 결정하자.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 19. 09:02

 

반달가면 이글루에서 백업 - bahndal.egloos.com/391590

 

앞에서 올린 telnet 자동 접속 방법으로 ssh 접속은 불가능하다.

ssh 로그인을 자동화하려면 우선 expect를 설치해야 한다. 패키지 관리자에서 expect를 검색해서 설치하면 된다.

터미널창에서 설치하고 싶다면 아래와 같이 입력하면 되겠다.

sudo apt-get install expect
(데비안/우분투 계열 배포판)

또는

sudo zypper install expect
(오픈수세)

expect가 설치되었으면 이제 ssh 자동 접속을 해 보자.

 

예를 들어 ssh 서버가 192.168.0.10이고 사용자명은 john, 암호는 my_password라고 가정하자. 또한 서버에 로그인하면 셸 프롬프트(shell prompt)는 john> 이렇게 나온다고 가정하자. (셸 프롬프트가 어떤 형태로 표시되는지 미리 알고 있어야 한다)

 

처음 접속할 때는 암호화 통신을 위한 열쇠(RSA key)를 받아야 되니까 처음 한번은 수동으로 접속해서 열쇠를 받고, 그 다음부터 자동화 스크립트를 이용하면 되겠다. (만약 열쇠를 무조건 자동으로 받고 싶다면 ssh 접속에서 -o StrictHostKeyChecking=no 항목을 추가해야 한다. 아래 예시의 내용을 참고하자)

 

문서편집기를 이용해서 자동화 스크립트 ssl_login.exp를 아래와 같이 작성한다. #으로 시작되는 줄은 주석(comment)이다. 서버 192.168.0.10에 john이라는 사용자가 ssh 접속을 해서 서버의 커널 버전을 확인하기 위해 uname -r 명령을 실행한 경우이다.

 

# script file: ssl_login.exp

# spawn ssh process

spawn ssh john@192.168.0.10

# to accept RSA key automatically, set StrictHostKeyChecking=no

# spawn ssh -o StrictHostKeyChecking=no john@192.168.0.10

# wait for password request

expect -nocase "password"

# send password (\r is for return key)

send "my_password\r"

# wait for shell prompt expect "john>"

# execute commands (in this example, identify kernel version with 'uname -r' command)

send "uname -r\r"

# wait for user prompt

expect "john>"

# exit

send "exit\r"

 

위와 같이 스크립트를 만들었으면, 아래의 명령으로 실행하면 된다.

 

expect -f ssl_login.exp

 

여기에 사용된 expect 스크립트 명령어에 대해 간단히 적어 보자면,

 

spawn: 새로운 프로세스를 실행한다

 

expect: 특정 문자열이 나올 때까지 기다린다. -nocase 옵션을 주면 대소문자를 구별하지 않는다.

 

send: 특정 문자열을 실행중인 프로세스로 보낸다. 명령어를 입력하고 엔터를 누르는 경우 마지막에 \r 추가.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 16. 11:47

 

반달가면 이글루에서 백업 - bahndal.egloos.com/388042

 

telnet 로그인을 자동화하는 방법이다.

 

telnet 서버가 192.168.0.10이고 사용자명은 john, 암호는 my_password라고 가정하면, 아래와 같은 shell script를 이용할 수 있다. telnet으로 접속해서 uname -r 명령으로 서버의 커널 버전을 확인하는 경우다.

 

(

sleep 2

echo "john"

sleep 2

echo "my_password"

sleep 2

echo "uname -r"

sleep 2

echo "exit" ) | telnet 192.168.0.10

 

입력을 보낸 후 응답이 올 때까지 걸리는 시간을 고려해서 각 입력 사이에 몇초간 대기하도록 sleep 명령을 사이사이에 추가해 주는 것이 좋다.(위의 예시에서는 2초)

 

 

Posted by 반달가면

댓글을 달아 주세요