본문 바로가기
SW 개발/Android

Android 에서 리눅스 App 실행: Linux Terminal Emulator (Termux) 활용

by Kibua20 2020. 8. 29.
반응형

안드로이드 스마트 폰에서 Linux Application을 실행하는 방법을 설명하고자 합니다. 

 

Android 기반의 스마트 폰은 Linux Kernel위에 HAL, Android Framework을 사용하지만 사용자 레벨에서는 Java나 Kotlin으로 작성된 Application을 사용해야 하고, Linux Application을 그대로 사용할 수 없습니다.  안드로이드의 Libc는 Bionic  libc이고,  리눅스의 Libc는 gLibc를 사용하기 때문에  리눅스에 빌드된 실행 파일을 그대로 실행하는 것은 불가능합니다. 

 

이러한 차이점을 해결하기 위해서 안드로이드 스마트 폰에서는 Linux Terminal Emulator를 사용해야 합니다. Android에서 구동 가능한 리눅스 Terminal 중에서 Termux를 사용 가능하고, Playstore에서 Termux  설치 후  apt (pkg)를 통해서 각종 리눅스 실행 파일을 설치하고  실행이 가능합니다.   

 

안드로이드 폰에서 리눅스 터미널 Termux은 아래와 같은 경우에 유용하게 활용할 수 있습니다. 

  • 안드로이드 폰에 Web server를 올리는 경우
  • 안드로이드 폰에 Python 프로그램을 구동시키는 경우
  • 안드로이드 폰에서 SSH 기반의 서버 (e.g. sFTP)로 활용하는 경우
  • 안드로이드 폰의 SW를 HACK 하는 경우 (루팅 된 device) - Termux에서 Hacking tool을 지원한다고 함.
  • 리눅스에서 개발된 프로그램을 재사용
    • Termux에서는 C 컴파일로 clang을 사용하기 때문에 우분투 gcc로 빌드된 실행파일 (ELF)는 직접 실행이 안되고 재 빌드해야 함 (소스만 재 활용)
    • Python과 같은 interpreter 언어는 그대로 실행됨
출처: 나무위키 

Termux - 안드로이드 전용 오픈소스 앱이다. 겉으로 보면 플레이스토어에 올라온 리눅스 터미널 앱과 별 다를 게 없어 보이지만 pkg 및 apt를 이용해 다양한 소프트웨어를 설치해 사용이 가능하다. nano, emacs 등의 에디터부터 파이썬, npm, node.js 등의 개발도구, php, 아파치 등의 서버 소프트웨어 등을 설치해서 쓸 수 있다. 심지어 X-Window까지 구동이 가능하다.

무엇보다 루팅이 필요 없으며 무 광고의 무료 앱이라는 점도 강점이다.  특히 루팅 된 디바이스의 경우 Termux 위에 다른 리눅스 배포판이나 MATE 등의 고사양의 데스크톱 메니져를 설치하는 것도 가능하다고 한다. 한글판은 없으나 입출력은 문제없이 지원한다.

▶ Termux 공식 Home : https://termux.com/  

 Termux wiki :  https://wiki.termux.com/wiki/Main_Page

 

 

아래 동영상은 Termux에 대한 설명 및 pkg 설치 방법을 설명하고 있습니다.  유튜브 동영상 내용에서는 해킹 머신으로 사용할 수 있다고 부제로 되어 있지만 실제 내용은 Termux 개념 및 설치 방법으로 해킹하고는 별 상관없습니다. 

출처: https://www.youtube.com/watch?v=O8oHrYrz8kI

 

1. 안드로이드 스마트 폰에서 Termux 설치

안드로이드 PlayStore에서 Termux를 검색하고 설치합니다.  Termux 설치하면 PC 환경의 BASH와 유사하는 터미널이 실행됩니다.

설치 링크:  https://play.google.com/store/apps/details?id=com.termux

Android 에서 Termux 설치

2. Termux에 원격 접속을 위한 SSH Server 설치

안드로이드 폰에서 키보드 입력이 불편하기 때문에 PC에서 원격 접속을 위해서 SSH Server를 가장 먼저 설치해야 합니다. (참고: Termux Wiki)    참고로, 단말이 Sleep에 들어가면 Network 연결이 끊어지기 때문에 Termux의 Wake lock을 설정합니다. 

2.1. Android Termux에서 open ssh 설치

안드로이드 폰의 Termnux에서 openssh를 설치합니다.  openssh 설치하고 ssh 연결을 위해서 sshd를 실행하고 Termux의 1) User ID 확인, 2) IP Address 확인 3) Passwd 설정이 필요합니다. 

 

(스마트 폰 Termux 실행)

  $ pkg update

    → pkg list update를 진행합니다.  pkg update 후에 apt 명령서가 정상 실행됩니다. 

  $ pkg install openssh

    → openssh 서버 설치

  $ sshd

    → sshd 데몬 실행 

  $ passwd

    → 패스워드 설정,   user ID는 안드로이드에서 자동으로 설정되고, ssh 사용을 위해서는 password를 설정해야 합니다. 

  $ whoami

    → ID 이름 확인   (u0_a269) 

  $ ifconfig

    → IP address 확인 (스마트 폰과 PC는 같은 WiFi AP에 접속한 상태야 합니다)

    → inet 값 확인 192.168.0.71

안드로이드 폰에서 Termux 에서 OpenSSH 설치 후 user id, ip address 확인

 

2.2. PC에서 안드로이드 스마트 폰으로 ssh 연결 (WiFi로 연결)

안드로이드 Termux에서 설치되는 openssh는 기본 값으로 포트 8022번을 사용합니다.  PC에서 아래와 같은 명령어를 사용해서 스마트 폰에 접속합니다.  처음 접속에서는 Password 입력을 해야 하고, 이후에는 좀 더 편리하게 접속하기 위해서 RSA 인증서를 설치하여 패스 워드 없이 접속하도록 설정합니다.

 

  $ sshd

    → sshd 데몬 실행 

 

(PC 실행 - PC에서 스마트폰으로 SSH 접속 연결)

$ ssh -p 8022 user@hostname_or_ip

 

포트 번호는 고정된 값이고, user id는 termux에서 whoami로 얻은 값으로, IP address는 ifconfig 값으로 설정합니다. 위의 예제에서는 아래와 같이 입력합니다.  Connection Refuse 에러가 발생하는 경우는 Termux 상에서 sshd를 실행하지 않은 경우 또는 password가 설정되지 않은 경우에 발생합니다. 

 

$  ssh -p 8022 u0_a269@192.168.0.71

PC에서 ssh 연결 명령어 실행

 



SSH 연결 후 PC의 RSA Public 키를 스마트 폰 Termux의 authorized key로 등록합니다. 

#PC에서 RSA 인증키 확인 

$  cat ~/.ssh/id_rsa.pub 

 

# 스마트폰 Termux PC의 public key 등록

$ echo "ssh-rsa ABCD(중략)  Mc=  kibua20@ubuntuPC"   >    ~/.ssh/authorized_keys

 

adb forward tcp:8022 tcp:8022

2.3. PC에서 안드로이드 스마트 폰으로 ssh 연결 (USB로 연결)

WiFi AP를 사용할 수 없는 환경에서는 Android에서 제공하는 adb의 port forwarding 기능을 활용하여 USB를 통해서 SSH 연결을 할 수 있습니다.  PC와 스마트 폰이 유선 연결이 되어야 하는 불편함은 있지만 속도는 WiFi 보다 USB가 빠릅니다.  대용량의 파일을 전송하고자 하는 경우 USB 사용을 추천드립니다. 

 

※ 사전 작업 -  PC에 adb 설치와  스마트 폰 연결이 되어야 있어야 합니다.  

  *우분투 :  $ apt install adb 

  * 윈도우:  Android 사이트에서 SDK를 다운로드합니다.  설치 링크 SDK를 설치 후 /platform-tool 하위에 adb.exe입니다. 

  * 안드로이드 스마트 폰과 USB 연결 상태 확인   (연결 방볍)

       $ adb devices 

 

  $ sshd

    → sshd 데몬 실행 

 

PC에서 adb forward 명령어 사용합니다.   (adb forward 명령어 참고)

 $ adb forward tcp:8022 tcp:8022    

    → PC의 tcp:8022 포트를 스마트폰의 tcp:8022 포트로 전달

 $ ssh localhost -p 8022

   → PC localhost로 tcp:8022 포트로 ssh 연결

 

Termux와의 SSH WiFi 연결과 USB 연결이 동일한 RSA 인증서이기 때문에 인증서 에러가 발생할 수 있습니다. 이 경우  know_host에 인증서를 추가합니다. 

 

$ ssh-keygen -f "/home/kibua20/.ssh/known_hosts" -R "[localhost]:8022"

Termux SSH 연결 시 인증서 에러

 

 

 

3. Termux 실행 시 프로그램 자동 실행 

스마트 폰에서 Termux 실행할 때마다 특정 프로그램을 자동으로 실행하기 위해서는 bashrc 파일을 생성합니다. 

 

(스마트폰 Termux에서 bashrc 파일 생성)

$ vi ~/.bashrc 

 

bashrc 파일에서 필요한 script를 추가합니다. sshd를 실행하고, Wake lock을 잡는 경우 아래와 같이 추가합니다. 

ssdh 

termux-wake-lock 

→sshd와 wake lock을 잡는다.

 

(PC에서 USB로 ssh 연결)

$ adb forward tcp:8022 tcp:8022; ssh localhost -p 8022

 

4. 스미트 폰 Booting 시 프로그램 자동 실행   (Termux:Boot)

스마트 폰 부팅 시 프로그램을 자동 실행하기 위해서는 Termux:Boot Apk를 설치해야 합니다. 이는 PlayStore에서는 유료 app이고, 가이드의  링크를 추가합니다.  하지만, 일부 APK mirror 사이트에서 무료로 다운로드는 가능하고 설치 및 실행도 잘 됩니다.  무료  Apk 다운로드 사이트 링크

 

Termux:Boot는 리눅스에서 서비스로 동작했던 기능을 그대로 실행 가능합니다. (e.g. sshd, web server)

 

1. Termux:Boot 설치 

2. Termux:Boot 1회 실행

3. /.termux/boot/ 하위에 script 추가 

    $ mkdir  -p  ~/.termux/boot/
    $ vi ~/.termux/boot/start-sshd

   

  * start-sshd 파일에 아래 내용을 추가

   #!/data/data/com.termux/files/usr/bin/sh
   termux-wake-lock
   sshd

 

start-sshd 파일 작성 시 주의해야 할 점은 상단의 script 실행 파일이 Termux에 설치된  /data/data/com.termux/files/usr/bin/sh입니다. (Android에서 /system/bin/sh 파일이 아닙니다.) 

 



5. Termux에서 스마트 폰 SD 권한 설정

Google Android Security 정책은 외장 SD Card의 Permission이 사용자 동의를 얻어야 합니다.  EXTERNAL_STORAGE_PERMISSION 권한을 획득하기 위해서는 스마트 폰 Termux 에서 termux-setup-storage 명령어를 사용합니다.  Termux에서는 storage 폴더에 스마트폰의 /sdcard 주의 폴더를 synlink가 추가되어 있습니다. 

 

Termux에서 SD card ACCESS

$ termux-setup-storage

스마트폰 Termux에서 외장 sdcard 인식

 

6. 안드로이드 Termux에서 gcc 컴파일

gcc --version을 확인하면 clang version이다.  우분투에서 gcc 로 빌드된 실행파일 (ELF)는 직접 실행은 불가능하며, 소스를 받아서 재 빌드해야 합니다.   우분투에서 빌드하는 소스를 스마트 폰 Termux에 다운로드해서 clang으로 빌드하면 정상적으로 동작합니다. 

(Termux에서 git 설치, make, gcc가 정상적으로 설치 및 동작합니다.)

스마트폰 Termux에서 clang 컴파일러로 make 빌드함

관련 글:

[모바일 SW 개발/Android] - Android apkanalyzer 에러: java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

[개발환경/Web Server] - Python: Web Framework Flask 사용하기

[개발환경/Web Server] - 우분투 20.04에서 lighttpd Web Server 설치 (Embedded용으로 활용 가능)

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 원격 데스크 톱(RDP) 연결: Linux 용 Chrome RDP

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

[모바일 SW 개발/Python] - Python code 숨기는 방법: PyInstaller로 실행 파일 만들기

[개발환경/우분투] - 우분투 작업 스케줄러 Crontab 사용법, 디버깅, 주의 사항

[개발환경/git] - GitHub 아이디/패스워드 입력 없이 사용하는 방법

[모바일 SW 개발/Android] - [실패 사례] WSL(Windows Subsystem for Linux)에서 Android 빌드하기

[개발환경/윈도우와 WSL] - 윈도우용 MobaXterm - SSH 및 X-Server 지원

반응형



댓글8

  • Favicon of https://interes-things.tistory.com BlogIcon into 2020.08.30 00:11 신고

    좋은 정보 감사합니다. 테블릿에서 파이썬 사용하고 싶었는데 이런 방법이 있네요. 오늘은 대충 훓어봤구요. 설치할 때 다시 방문해야겠습니다.
    답글

  • 진우 2021.12.19 19:09

    저도 termux 에 proot-distro install ubuntu 로 우분투를 설치하고
    mysql, sftp 를 설치해봤는데 서비스 실행이 안되더라구요...
    혹시 mysql, sftp 도 설치해서 사용 가능한지궁금합니다.
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.12.19 19:31 신고

      sftp는 sshd에 포함된 기능이라 가능할 것 같고요, mysql은 안해봤지만, termux용으로 빌드된 Pkg 있다면 가능할 것 "예상"됩니다. 패키지가 있는지 확인해보시겠어요?

  • 진우 2021.12.20 02:39

    제가 termux 사용법을 잘못알고있었던 부분이 있었습니다
    현재 sftp 는 잘 작동하네요 ^^

    그런데 mariadb 를 설치했는데
    tsu mariadb 와 sudo mariadb 를 입력하면
    "No superuser binary detected.
    Are you rooted?" 라고 뜨네요..
    잘 진행되다가 여기서 막혔습니다..
    이거 혹시 루트권한으로 실행은 어떻게 하는지 좀 알 수 있을까요?? ㅜㅜ
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.12.20 18:34 신고

      android 단말에서 termux는 하나의 app이기 때문에 일반적인으로는 su 권한을 얻을 수 없어요. 루팅해야 su 가 가능합니다.

  • 진우 2021.12.21 14:35

    아.. 루트권한을 얻을수가 없는거군요..
    그렇다면 termux 는 우분투 같은 리눅스 배포판을 실행하는게 아니라
    안드로이드에 있는 리눅스 커널을 이용하는거네요??

    답글

  • 진우 2021.12.23 14:53

    네 하나배워갑니다 답변 감사합니다 ^^
    답글