개요
`expect`는 미리 정의된 패턴(예: 프롬프트 문자열)을 기다렸다가 특정 문자열(예: 사용자 입력)을 전송하는 방식으로 대화형 세션을 자동화합니다. 이를 통해 수동 개입 없이 복잡한 작업을 수행할 수 있습니다.
주요 특징
- Tcl 기반의 스크립팅 언어 확장
- 대화형 프로그램(예: ssh, ftp, telnet)과의 상호작용 자동화
- 프롬프트 패턴 매칭 및 응답 전송 기능
- 반복적이고 수동적인 작업 자동화에 유용
주요 옵션
`expect` 명령어 자체의 실행 방식을 제어하는 옵션들입니다. 스크립트 내부에서 사용되는 `expect` 및 `send` 명령어와는 다릅니다.
실행 제어 및 디버깅
생성된 명령어:
명령어를 조합해 보세요.
설명:
`expect` 명령어를 실행합니다.
위 옵션들을 조합하여 AI와 함께 가상으로 명령어를 실행해 보세요.
설치
`expect`는 대부분의 리눅스 배포판에 기본으로 포함되어 있지 않으므로, 패키지 관리자를 통해 설치해야 합니다.
Debian/Ubuntu
sudo apt update && sudo apt install expect
APT 패키지 관리자를 사용하여 `expect`를 설치합니다.
RHEL/CentOS/Fedora
sudo dnf install expect
DNF (또는 Yum) 패키지 관리자를 사용하여 `expect`를 설치합니다.
사용 예시
`expect` 스크립트는 일반적으로 `.exp` 확장자를 가지며, `#!/usr/bin/expect`로 시작하여 `expect` 인터프리터로 실행되도록 합니다.
간단한 프롬프트 자동 응답
#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof
`Proceed? (y/n)`과 같은 질문에 자동으로 'y'를 입력하는 스크립트입니다. (예시를 위해 `sh`를 사용)
SSH 로그인 자동화 (보안 경고)
#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"
spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof
원격 서버에 SSH로 자동 로그인하고 명령을 실행하는 예시입니다. **스크립트에 비밀번호를 직접 포함하는 것은 보안상 매우 위험하므로 실제 환경에서는 권장되지 않습니다.**
passwd 명령어 자동화 (보안 경고)
#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"
spawn passwd
expect "현재 비밀번호:"
send "$old_pass\r"
expect "새 비밀번호:"
send "$new_pass\r"
expect "새 비밀번호를 다시 입력하십시오:"
send "$new_pass\r"
expect eof
`passwd` 명령어를 사용하여 비밀번호를 자동으로 변경하는 예시입니다. **비밀번호를 스크립트에 하드코딩하는 것은 보안상 매우 위험합니다.**
팁 & 주의사항
`expect` 스크립트는 강력하지만, 보안 및 안정성을 위해 몇 가지 주의사항을 고려해야 합니다.
주요 팁
- **비밀번호 보안**: 스크립트에 비밀번호를 직접 하드코딩하는 것은 매우 위험합니다. 환경 변수, 안전한 설정 파일 또는 `ssh-agent`와 같은 다른 보안 메커니즘을 고려하세요.
- **타임아웃 설정**: `set timeout` 명령어를 사용하여 `expect`가 특정 패턴을 기다리는 최대 시간을 설정하세요. 기본값은 10초이며, `set timeout -1`로 무한 대기를 설정할 수 있습니다.
- **정확한 패턴 매칭**: `expect`는 정규 표현식을 지원합니다. 프롬프트가 정확히 일치하지 않을 수 있으므로 유연한 패턴을 사용하거나 `*` 와일드카드를 활용하세요.
- **디버깅**: `expect -d your_script.exp` 명령어를 사용하여 디버그 모드로 실행하면 `expect`가 어떤 패턴을 기다리고 어떤 문자열을 보내는지 자세히 확인할 수 있습니다.
- **`interact` 사용**: 스크립트 실행 중 특정 시점에서 사용자에게 제어권을 넘겨주고 싶을 때 `interact` 명령어를 사용할 수 있습니다.