linux expect

-·2023년 6월 28일
0

배포하는데 root계정이 필요한일이 생겼다.

근데 계정을 들어가려면 비밀번호치는 과정을 거쳐야되는데 이걸 한줄에 한번에 할수가 없었다.

내가 매크로처럼 뭔가 만들어줘야 되는 상황이다.

사용자가 입력하는거처럼 할수있는 방법이 바로 expect를 사용하는것이다.

보니까 서버에 없넹?... 그리고 운영서버는 폐쇄망이라서 yum같은것도 못씀

그럼 설치부터 해보자

설치

rpm을 이용해서 설치를 해보자

CentOS7 이라서 이 버전으로 할꺼다

https://rpmfind.net/linux/RPM/centos/7.9.2009/x86_64/Packages/expect-5.45-14.el7_1.x86_64.html << expect

https://rpmfind.net/linux/rpm2html/search.php?query=libtcl8.5.so()(64bit) << libtcl8.5.so()(64bit)

expect설치하려면 libtcl8.5.so()(64bit)이게 선행으로 설치되어야 설치가 가능

이제 준비가 되었다.

rpm -Uvh 패키지파일이름.rpm

젤 많이 쓰는 명령어 옵션이다.

대충 알아보자면

U -> 패키지가 설치/업그레이드

v -> 설치과정의 확인

h -> 설치진행과정을 "#"으로 화면에 출력

  1. libtcl8.5.so()(64bit)
  2. expect

이 순서로 명령어 따라쳐서 설치를 해주자

$ expect -v
expect version 5.45

이렇게 뜨면 설치가 완료된것이다.

login script

이제 스크립트를 짜봅시다.

그렇게 길지는 않다.

간단하게 명령어를 설명해보자면

command설명
expectexpect 스크립트로, 응답을 읽어서 매칭시킬때 사용한다.
패턴 매치는 switch문, case문과 동일한 처리를 실현할 수 있다.
spawnexpect내에서 프로세스를 생성하는 커맨드이다.
send머신에 문자열에 응답하는 커맨드이다. 입력하는 커맨드
exitexpect의 처리를 종료시킨다.
#!/usr/bin/expect

# set arguments
# expect.sh argv1 argv2 이런식으로 넘겨주면 받아서 쓸수있다.
set wasName [lindex $argv 0]
set pjtName [lindex $argv 1]

set passwd "passwd"

# if else 구문도 가능 ! 
if { $pjtName == "mypjt"} {
        set shellPath "/test/mypjt.sh"
} elseif { $pjtName == "elsePjt" } {
# 여기서는 else if를 elseif 이렇게 써야된다.
        set shellPath "/test/elsePjt.sh"
} else {
        set shellPath "/"
}

# login script start

spawn su - root
# 화면에 Password: 이렇게 뜨는거 확인
expect -re "Password:"

sleep 1

# 사용자가 비밀번호를 입력하는 과정이라고 생각하면 편하다
# 마지막에 enter치는거까지 생각해서 짜기
send "$passwd\r"
expect -re "Last login:"

sleep 1

send "whoami\r"

sleep 1

send "sh $shellPath\r"

sleep 10

# 종료시켜줘야한다.
send "exit\r"

# 이것은 프로세스의 제어를 유저에게 넘겨주는 커맨드이다.
# 유저로부터 표준 입력을 받을 수 있게 된다.
interact

뭔가 편리한거같다 내가 원하는대로 구동을 시킬수있으니

일반적인 쉘로 안되면 생각해보자

profile
거북이는 오늘도 걷는다

0개의 댓글

관련 채용 정보