2013년 8월 21일 수요일

리눅스 자동 완성하는 쉘 스크립트 expect와 tpipe

리눅스 쉘 스크립트를 작성할 때
보통 자동처리 방식을 원하기 때문에 작성을 많이한다
이때, 필수적으로 암호를 입력해야 할 때가 있다
이번 블로그는 이런 암호도 자동으로 완성해서 운영되는 쉘 스크립트 작성할 때의 팁이다

자동 완성할 때의 환경이 여러가지 있는데
이제까지 찾은 두가지 방법을 기술해 보고자 한다

리눅스 터미널에서 ssh-add 등을 입력해서 비밀키를 입력해야하는 환경이라 가정을 해 보자

$ /usr/bin/ssh-add /home/bloodstorm/.ssh/id_rsa [Enter]
Enter passphrase for /home/bloodstom/.ssh/id_rsa: _

자동으로 진행되서 처리해야하는 부분에서 위와 같은 입력, 혹은 암호 입력을 요구할 때 쉘 스크립트가 막힐 수 있다

1. expect  쉘 스크립트 작성
일반 쉘 스크립트를 작성할 때
쉘 스크립트 상단 처음 부분에 다음과 같이 입력한다

#!/bin/bash

하지만 expect 를 사용할 때는 다르게 입력 후 사용해야 한다

#!/usr/bin/expect

이후 작성 방법은 쉘 스크립트와 동일하지만
선언하는 파일이 bash 가 아닌 expect 이기 때문에 같지만 다른 쉘 스크립트가 된다는 것을 잊으면 안된다

[예시] - 위 ssh-add 시 암호 입력을 요구할 때의 예시
#!/usr/bin/expect
spawn bash -c "/usr/bin/ssh-add /home/bloodstorm/.ssh/id_rsa";
expect -re "id_rsa"
send "[암호 및 입력해야할 내용]\r"
interact

spawn bash 를 불러와서 bash 를 이용해서 쉘을 실행한다
expect -re 를 이용, 암호 및 입력해야할 내용이 발생하는 지점을 찾는다
send 부분에서는 이 암호 및 입력해야할 내용을 입력 후, \r 입력 완료 메시지를 넣고
interact 암호 입력 쉘을 끝낸다

전체 쉘 스크립트를 작성 후
암호 및 입력을 해서 지나가야하는 부분만 부분 쉘로 작성하면
자동 완성하는 전체적인 쉘 스크립트를 만들 수 있다

2. tpipe 를 이용한 bash 쉘 스크립트 작성
bash 쉘 스크립트를 작성할 때
위와 같은 암호나 입력이 필요로 할 때 사용한다
사용 방법은 expect 보다 훨씬 더 간편하다

bash 쉘 스크립트 작성 중 중간에 강제 입력을 해야하는 부분이 있으면

tpipe()
{
echo '[강제 입력 내용]'
}
tpipe | /usr/bin/ssh-add /home/bloodstorm/.ssh/id_rsa

expect 처럼 쉘을 또 만들어서 사용하는 것이 아니라
bash 쉘 스크립트 내에서 끝낼 수 있다

하지만 tpipe 는 적용이 될 때도 있고 안될 때도 있으니
반드시 우선 테스트를 해 본 후 전체 적용하는 것이 좋을 것이다

댓글 없음:

댓글 쓰기