ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP EXPECT 설치 (at 라즈베리파이)
    개발 & 계발/PHP 2020. 6. 20. 18:56
    반응형

    안녕하세요!

    제가 최근 라즈베리파이에서 PHP를 설치해서 이것저것 해보고 있는데요~

    오늘은 OS에 설치된 SSH, telnet 등을 활용하여 원격 서버 접속하기 위한 "EXPECT" 모듈을 설치해 보겠습니다.

     

    expect란? (출처 : https://ko.wikipedia.org/wiki/Expect)
    Expect는 Don Libes 가 개발한 Tcl 스크립팅 언어의 확장 기능으로서 터미널 인터페이스를 노출하는 프로그램과의 상호작용을 자동화하기 위한 프로그램이다.

    Expect는 텔넷, 파일 전송 프로토콜, passwd, fsck, rlogin, tip, SSH와 같은 상호작용 응용 프로그램의 제어를 자동화하기 위해 사용된다. Expect는 의사 터미널(유닉스)을 사용하거나 콘솔을 에뮬레이트(윈도우)하고 대상 프로그램을 시작한 다음 마치 인간 세상에서 하는 것처럼 해당 프로그램과 통신하며 이는 터미널이나 콘솔 인터페이스를 통해 이루어진다. 또다른 Tcl 확장 기능인 Tk 그래픽 사용자 인터페이스를 제공하기 위해 사용할 수 있다.
    Expect는 정규 표현식 패턴 매칭과 일반 프로그램 기능들이 있으므로 단순한 스크립트들이 프로그래밍 언어, 매크로, 기타 프로그램 매커니즘이 결여된 텔넷, FTP, SSH 등의 프로그램들을 똑똑하게 제어할 수 있게 한다.

     

    환경은

    1. 라즈베리파이 3 우노 보드

    2. OS는 Rasbian (NOOBS v3.4.0)

    3. 현재 apt로 설치할 수 있는 PHP 최신 버전은 "7.3" 입니다.

    4. 현재 apt로 설치할 수 있는 apache는 "apache2" 입니다.

    입니다.

     

    먼저 root 비밀번호를 설정해 줍니다.

    pi@raspberrypi:~ $ sudo passwd root

     

    OS를 설치 후에는 시스템에 설치된 S/W를 최신화 시켜주어야 합니다. (root 권한에서 실행)

    root@raspberrypi:~# apt update && apt upgrade

     

    다음으로는 APACHE와 MariaDB를 설치하겠습니다.

    root@raspberrypi:~# apt install apache2 
    root@raspberrypi:~# apt install mariadb-server

     

    Expect를 사용하기 위해서는 TCL를 설치해야 한다.

    root@raspberrypi:~# apt install tcl tcl-tclreadline tcl-dev

     

    다음으로 Expect 모듈을 설치한다. (여기까지 설치한다고, PHP에서 사용할 수는 없다.)

    root@raspberrypi:~# apt install expect expect-dev tk8.6 tk8.6-dev tcl-expect-dev

     

    PHP에서 Expect를 사용하기 위해서 pecl을 통해 Expect를 재 설치 한다.

    pecl (pecl.php.net/)은 PHP의 확장 프로그램을 관리하는 사이트다 라고만 알아두자.

    root@raspberrypi:~# pecl install expect

    혹시 위 설치 시 phpize가 없어서 에러가 나는 경우 아래 내용을 추가로 설치하고, 다시 위 설치를 진행해야 한다.

    root@raspberrypi:~# apt install autoconf automake libtool m4
    root@raspberrypi:~# apt install php7.3-dev

     

     

    설치가 완료되었고, 마지막으로 php.ini에서 expect를 사용할 수 있도록 extension 설정을 하자.

    extension는 PHP의 확장 프로그램을 연결해주는 PHP의 설정이라고만 알아두자.

    Apache를 통해 PHP가 실행(WEB) 될 때와, Shell에서 실행(CLI) 때 php.ini가 다르게 설정될 수 있기 때문에 아래 두개의 php.ini를 모두 설정한다.

    root@raspberrypi:~# vi /etc/php/7.3/apache2/php.ini
    root@raspberrypi:~# vi /etc/php/7.3/cli/php.ini

     

    php.ini 파일에 아래와 같이 내용을 추가한다.

    extension=expect.so

     

     

    Web상에서 확인을 하려면 Apache를 재 시작해야 한다.

    root@raspberrypi:~# systemctl restart apache2

     

    이제 PHP에서 expect가 잘 동작하는지 확인해 보아야겠다.

    먼저 현재 라즈베리 파이가 ssh로 접속 가능한지 확인한다.

    root@raspberrypi:~# ssh pi@127.0.0.1
    The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
    ECDSA key fingerprint is SHA256:????????????????????????????????????????. 
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
    pi@127.0.0.1's password:

     

    ssh로 접속이 가능하다면 PHP 파일을 다음과 같이 생성한다.

    <?php

    ini_set("expect.timeout", 30);     // 타임 아웃 30초로 설정

    ini_set("expect.logfile", "./log");  // 로그 파일 설정

     

    $ep = expect_popen("ssh pi@127.0.0.1");  // ssh 접속 시도

    $login_arr = array(
        array("yes/no", "c")
       ,array("assword", "p")
    );

    switch(expect_expectl($ep, $login_arr))
    {
       case "c" :
          echo "YES or NO?\n";
          fwrite($ep, "yes\n");
          break;
       case "p" :
          echo "PASSWORD?\n";
          fwrite($ep, "pi의 비밀번호\n");
          break;
    }

     

    ?>

     

    해당 PHP 파일을 shell에서 실행해 본다.

    그리고 log 파일 정보를 확인한다.

     

Designed by Tistory.