최근 수정 시각 : 2024-02-13 17:48:53

Termux

파일:Semi_protect2.svg   가입 후 15일이 지나야 편집 가능한 문서입니다.
(~ KST )

1. 개요2. 설치
2.1. F-Droid2.2. Github2.3. Play 스토어 (권장하지 않음)
3. 파일 시스템
3.1. 패키지 설치 루트3.2. 홈 디렉토리
4. 특징
4.1. 단일 사용자 도구4.2. 서버 패키지4.3. 플러그인을 통한 API 제공
5. 컨테이너
5.1. PRoot
5.1.1. chroot와의 차이점5.1.2. PRoot Distro
6. Termux로 리눅스 배포판 사용 하기7. 문제점
7.1. 특수 키7.2. 일반적인 주의 사항7.3. Android Q 이후

1. 개요

파일:Termux Native 실행.jpg
Termux 홈페이지
Termux Github
Android에서 사용 가능한 리눅스 유사환경 터미널 에뮬레이터[1]다. APT 패키지 관리자를 사용하여 추가 패키지를 다운로드 할 수 있다.

2. 설치

Android 5 및 6 에서 사용 가능한 Termux는 버전 0.83으로 지원이 종료되었으며, Android 7+ 부터 지속 업데이트가 가능한 Termux를 사용할 수 있다.

Termux와 모든 플러그인은 sharedUserId 속성과 com.termux 디렉토리를 공유하여 사용하므로 Android에 설치된 모든 Termux 및 플러그인을 동일한 서명 키로 서명하기 위해 한 가지의 소스만을 이용하여 설치해야 한다. 여러 가지의 소스를 혼합하여 설치하면 정상적으로 동작하지 않는다. 즉, F-Droid에서 Termux 앱이나 플러그인을 설치하고 Github와 같은 다른 소스의 Termux 앱이나 플러그인을 설치하여 함께 사용하는 것은 불가능하다. Android 패키지 관리자는 일반적으로 서명이 다른 APK의 설치를 허용하지 않으며 설치 오류가 발생할 수 있다.

다른 소스에서 Termux를 설치하기 위해 먼저 기기에서 모든 Termux 및 플러그인을 제거한 다음 새 소스에서 Termux 및 플러그인을 설치해야 한다. 백업을 사용하여 Termux를 다른 소스에서 다시 설치한 다음 기존의 내용을 복원할 수 있다.

2.1. F-Droid

Termux 설치 페이지는 이곳에서 확인할 수 있다.

F-Droid 페이지의 직접 다운로드 링크를 사용할 수 있기 때문에 단순히 Termux를 설치하기 위해 F-Droid 앱을 다운로드할 필요가 없다. [2][3]

2.2. Github

Releases에서 Termux 소스 코드를 다운로드하여 직접 컴파일한 앱을 사용한다. Termux를 직접 디버깅하고 싶은 경우 유용할 수 있다.

일반적인 사용자는 Github을 이용하여 Termux를 사용할 필요가 없다.

2.3. Play 스토어 (권장하지 않음)

Termux 및 모든 플러그인은 Android 10의 문제로 Play 스토어에서 더 이상 업데이트되지 않는다. 2020. 9. 29. 이후 Android 7+에서 사용가능한 마지막 버전은 0.101으로 종료되었으며 지속적인 업데이트를 위하여 더 이상 Google Play 스토어에서 Termux 앱을 설치하지 않는 것이 좋다.

여러 중요한 취약점 및 다양한 버그 수정을 위해 최대한 빨리 v0.118.0 이상으로 업데이트하는 것이 좋다.[4] 또한 Play 스토어에서 Termux를 설치한 사용자에게 Play 스토어 빌드가 더 이상 사용되지 않으며 더 이상 지원되지 않는다는 내용을 포함하고 있다. 기존 사용자는 F-Droid 또는 Github을 이용한 설치로 전환하는 것을 권장한다.

3. 파일 시스템

Android는 일반적으로 시스템 파일의 보안 및 무결성을 위해 루트 파일 시스템과, 시스템 디렉토리에 대한 쓰기 권한을 허용하지 않는다. 이것은 FHS를 따르기 어렵게 만들고 Termux는 내부의 옵션만으로 동작하게 된다.

3.1. 패키지 설치 루트

모든 패키지는 데이터를 아래의 경로에 설치해야 한다.
/data/data/com.termux/files/usr
사용자 데이터의 안전을 위하여 위 디렉토리 외부에 파일을 설치하는 패키지를 생성할 수 없다.

Termux는 이 경로를 $PREFIX로 사용하며, 패키지 파일 내부에서는 $TERMUX_PREFIX로 사용하게 된다.
Termux 파일 시스템 계층 테이블
{{{#!wiki style="margin: 0 -10px -5px -10px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -6px -1px -16px"
<rowcolor=#fff>경로목적
${TERMUX_PREFIX}/bin/bin, /sbin, /usr/bin, /usr/sbin 을 모두 포함하는 쉘에서 사용하는 실행 파일들
${TERMUX_PREFIX}/etc구성 파일
${TERMUX_PREFIX}/includeC/C++ 헤더
${TERMUX_PREFIX}/lib공유 개체(라이브러리), 런타임 실행 가능 데이터 또는 개발 관련
${TERMUX_PREFIX}/libexec사용자가 직접 실행해서는 안 되는 실행 파일
${TERMUX_PREFIX}/opt테스트용으로 로드된 패키지의 설치 루트
${TERMUX_PREFIX}/share실행할 수 없는 런타임 데이터 및 문서
${TERMUX_PREFIX}/tmp/tmp, /var/tmp 를 모두 포함하는 응용 프로그램을 다시 시작할 때 지워지는 임시 파일로 사용자가 자유롭게 수정 가능
${TERMUX_PREFIX}/var캐시 및 데이터베이스와 같은 가변 데이터로 사용자가 수정할 수 있지만 주의해야 하는 것들
${TERMUX_PREFIX}/var/run/run 을 대체하는 데몬이 생성한 파일, PID 파일, 소켓 및 기타 임시 파일의 Lock}}}}}}}}}

Termux의 $TERMUX_PREFIX 경로 내에 존재하는 usr 디렉토리는 Linux 배포판에서 찾을 수 있는 실제 /usr 디렉토리와 어떠한 관련도 존재하지 않는다. Termux는 패키지를 위한 보조 파일 시스템 계층을 사용하지 않는다.

소스 내에 FHS 디렉토리에 대한 모든 하드코딩된 참조가 있다면 Termux에서 사용가능하도록 위 표를 참조하여 수정한 이후부터 정상적으로 동작한다.

3.2. 홈 디렉토리

Termux 홈 디렉토리는 패키지 설치 접두사 외부에 있으며 다음 경로에 존재한다.
/data/data/com.termux/files/home
모든 사용자 데이터가 저장되는 장소. 모든 Android 앱의 내부 데이터는 일반적으로 EXT4 또는 F2FS 파일 시스템에 저장되므로 파일 액세스 모드, 실행 권한 및 기호 링크와 같은 특수 파일을 지원할 수 있다.

패키지는 홈 디렉토리에 파일을 설치할 수 없다. 그 중 예외로 deb 파일 스크립트에만 해당되며, 자체적으로 수행할 수 없는 패키지의 경우 $HOME에서 초기 구성을 준비하는 데 사용할 수 있다.

4. 특징

4.1. 단일 사용자 도구

Termux는 단일 사용자를 위하여 제작된 터미널 에뮬레이터이다. Android 앱은 샌드박스 처리되어 각 앱마다 고유한 Linux 사용자 ID와 SELinux 레이블이 존재한다. Termux도 예외는 아니며 Termux 내의 모든 내용은 Termux 애플리케이션 자체와 동일한 사용자 ID로 실행된다. 사용자 이름은 u0_a231처럼 보일 수 있으며 Bionic libc에 의하여 사용자 ID로 사용되어 임의로 변경할 수 없다. 모든 패키지(루트 전용 패키지 제외)는 다중 사용자, setuid/setgid 및 기타 유사한 기능을 삭제하도록 패치되어 있다.

4.2. 서버 패키지

Termux에서 제공하는 서버 패키지의 기본 포트는 사용자 모드에서 1024보다 작은 값을 사용하지 못하는 이유로 ftpd, httpd 및 sshd의 기본 포트는 각각 8021, 8080 및 8022로 설정되어 있다.

4.3. 플러그인을 통한 API 제공

이 플러그인은 Termux 터미널에 API로 장치 기능을 노출한다.
기존 Termux를 설치한 소스와 동일한 소스에서 Termux:API 앱을 설치한 후 터미널에서 정상적으로 API 기능을 이용하기 위해 다음과 같이 입력한다.
apt install termux-api
현재 구현되어 있는 API 목록
{{{#!wiki style="margin: 0 -10px -5px -10px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -6px -1px -16px"
termux-battery-status장치 배터리의 상태를 가져온다.
termux-brightness밝기를 0에서 255 사이로 설정
termux-call-log통화 기록 나열
termux-camera-info카메라 정보를 가져온다.
termux-camera-photoTake사진을 JPEG 파일로 저장한다.
termux-clipboard-get시스템 클립보드 가져오기
text.termux-clipboard-set시스템 클립보드 설정
text.termux-contact-list모든 연락처 나열
termux-dialog텍스트 항목 표시 대화 상자
termux-download시스템 다운로드 관리자를 사용하여 리소스를 다운로드한다.
termux-fingerprint장치의 지문 센서를 사용하여 인증을 확인한다.
termux-infrared-frequencies적외선 송신기의 지원되는 반송파 주파수를 쿼리한다.
termux-infrared-transmit적외선 패턴 전송
termux-job-schedulerTermux일시 또는 주기적으로 사용할 스크립트 예약
termux-location기기 위치 가져오기
termux-media-player미디어 파일 재생
termux-media-scanMediaScanner인터페이스, 파일 변경 사항을 Android Gallery에 표시
termux-microphone-record장치에서 마이크를 사용하여 녹음한다.
termux-notification시스템 알림 표시
termux-notification-removetermux-notification --id로 이전에 표시된 알림 제거
termux-sensor실시간 데이터뿐만 아니라 센서 유형에 대한 정보 얻기
termux-share인수로 지정된 파일 또는 stdin 공유
termux-sms-list텍스트 SMS 메시지 목록
termux-sms-send지정된 수신자 번호로 SMS 메시지 보내기
termux-storage-get시스템에서 파일을 요청하고 다음으로 출력 지정된 파일
termux-telephony-call전화 번호를 호출한다.
termux-telephony-cellinfo기본 및 인접 셀을 포함하여 장치의 모든 라디오에서 관찰된 모든 셀 정보에 대한 정보를 얻는다.
termux-telephony-deviceinfo전화 장치에 대한 정보를 얻는다.
termux-toast일시적인 팝업 알림 표시
termux-torch장치의 LED 토치 전환
termux-tts-engines사용 가능한 텍스트 음성 변환 엔진에 대한 정보를 얻는다.
termux-tts-speak텍스트 음성 변환 엔진
termux-usbUSB 장치 목록 또는 액세스
termux-vibrate장치를 진동시킴
termux-volume오디오 스트림의 볼륨 변경
termux-wallpaper장치의 배경 무늬 변경
termux-wifi-connectioninfo현재 Wi-Fi 연결에 대한 정보를 얻는다.
termux-wifi-enableWi-Fi 켜기/끄기 전환
termux-wifi-scaninfo마지막 Wi-Fi 스캔에 대한 정보 얻기}}}}}}}}}

5. 컨테이너

5.1. PRoot

파일:Termux PRoot 실행.jpg
PRoot는 사용자 권한만으로 사용가능할 수 있도록 chroot의 일부 기능만을 이용해 구현된 바이너리이다. PRoot로 가능한 작업은 다음과 같다.
  • 권한을 가진 임의의 디렉토리를 새로운 루트 파일 시스템으로 사용한다
  • 파일 시스템 계층의 경로를 변경하여 액세스할 수 있도록 한다.[5]
  • QEMU 사용자 모드를 사용하여 다른 CPU 아키텍처용으로 빌드된 프로그램을 실행할 수 있다[6]

5.1.1. chroot와의 차이점

이 둘의 주요한 차이점은 Native인지 아닌지에 달려 있다. chroot는 사용 중인 파일 시스템 레이아웃 또는 사용자/그룹 ID를 위조하기 위해 값을 직접 반환한다. 그 과정에서 오버헤드가 발생하지 않으며 모든 장치에서 문제 없이 작동한다. 그러나 선행적으로 수퍼유저 권한이 필요하다. 장치의 보안을 위하여 관리자 계정으로의 접근을 차단한 Android에서 chroot를 사용하고자 루팅을 진행하는 행위가 필요하지 않도록 PRoot는 사용자 계정 단위에서 시스템 호출 인수를 가로채기 위해 ptrace()를 사용하여 Native와 유사한 환경을 만들어 낸다.

5.1.2. PRoot Distro

Termux는 터미널에서 Linux 배포판을 관리하는 패키지를 제공하고 있다. 루트나 커스텀 롬, 특정 커널 등을 필요로 하지 않으며 최신 버전의 Termux만 존재한다면 실행 가능하다. 아래 명령으로 패키지를 설치할 수 있다.
apt install proot-distro
패키지가 설치되면 아래 명령으로 설치 가능한 배포판을 확인할 수 있다.
proot-distro list

모든 시스템은 일반적으로 패키지 관리자, 셸, coreutils, util-linux 등으로 구성된 최소한의 기능으로 구성된다. 셸 자동완성 혹은 패키지 설치 제안과 같은 확장 기능은 수동으로 구성해야 한다.

proot-distro를 이용한 Ubuntu 설치 예제는 다음과 같다.
proot-distro install ubuntu
proot-distro login ubuntu
PRoot Distro는 가상 머신이 아니며 Android 시스템과 동일한 커널을 공유하므로 APT 패키지 관리자를 통해 dbus, udisks2, gvfs-daemon 등의 추가 권한이 필요한 패키지들을 직접 업그레이드하지 않아야 한다. 사용자 rootfs의 제한된 권한 문제로 오작동할 수 있다.

PRoot Distro는 루트 권한으로 실행하지 말 것. 시스템 파일의 권한과 SELinux 레이블이 엉망이 될 수 있다. 루트로 실행하면 실제 시스템이 손상될 가능성 또한 존재한다. 안전을 위해 PRoot Distro는 실행 전에 사용자 ID를 확인하고 사용자 ID 0(root)이 감지되면 작업을 거부하게 된다.

Termux에서 Linux 배포판을 설치하는 방법은 proot-distro에만 국한되지 않으며 개인 또는 단체 커뮤니티에서 만들어 배포하는 스크립트 또한 존재한다. 그러나 Termux가 그 품질을 보증할 수 없으며 일반적으로 공식 지원에서 벗어나게 된다.[7][8]

xSDL, RDP, VNC, termux-x11을 사용하여 proot-distro의 GUI 지원을 받을 수 있다.

6. Termux로 리눅스 배포판 사용 하기

Termux에서 설정만 제대로 해 주면 아예 안드로이드 휴대폰에서 우분투, 데비안, 페도라 같은 리눅스 배포판을 사용할 수 있다. 말하자면 안드로이드 휴대폰이 하나의 리눅스 컴퓨터가 되는 셈. 마지노선은 엑시노스 9825/스냅드래곤 855이고, 제대로 사용하려면 엑시노스 2100/스냅드래곤 888 이상 탑재한 안드로이드 휴대폰이 필요하다.

다음을 참고할 것.

7. 문제점

7.1. 특수 키

Termux 터미널을 사용하다 보면 불편한 점으로 특수 키의 부족함으로 인한 문제가 있다. Termux를 설치하고 처음 볼 수 있는 특수 키는 Esc, Tab, Ctrl과 Alt, 위, 아래뿐이다. termux.properties 설정을 변경하여 키보드에 특수 키를 추가할 수 있다.
mkdir $HOME/.termux/
echo "extra-keys = \[\['ESC','/','-','HOME','UP','END','PGUP'\],\['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN'\]\]" >> $HOME/.termux/termux.properties && termux-reload-settings && sleep 1 &&logout

7.2. 일반적인 주의 사항

$PREFIX를 포함한 모든 구성 요소에 대하여 자유로운 읽기, 쓰기 및 액세스 권한이 존재한다. $PREFIX 내부의 파일을 관련 지식 없이 실수로 삭제하거나 덮어쓰는 경우 오류가 나기 쉽기 때문에 주의해야 한다.

7.3. Android Q 이후

Android Q에 설치된 Termux는 정상적으로 동작한다. 그러나 완벽한 작동을 보장할 수는 없다.

Android 앱의 홈 디렉토리에 있는 파일에서 execve()를 실행하는 기능은 W^X 위반으로 API 28 이후 버전에서 제거된다.[9][10]Termux의 exec()가 execve()를 기반으로 동작하기 때문에 API 28 이후 버전의 경우 Termux가 정상적으로 동작하지 않을 가능성이 크다.

Google은 신규 앱 또는 업데이트를 출시하는 경우 API 29 버전으로 변경을 요구라고 쓰고 강제라고 읽는다하고 있으며 그 시작 시점은 2021. 11. 2. [11]이었지만 Termux는 기한 이전인 2021. 9. 29. 에 API 28을 사용하는 앱으로 Play 스토어에 등록하였기 때문에 Google Play의 업데이트를 사용하지 않는 조건에 한하여 API 28을 지속적으로 사용 가능하다. 그러나 이것은 임시방편이며 W^X를 해결할 수 있는 방법을 Termux에서 찾지 못한다면 상위 버전 호환을 배제한 체 사용해야만 한다.

Termux는 Android R 이후의 버전에서 정상적인 사용이 불가능할 수 있다. Android OS는 자식 프로세스가 32개를 초과하는 모든 프로세스 및 과도한 CPU를 사용하는 프로세스를 워치독을 이용하여 강제 종료하게 되어 사용자가 쉘 프로세스를 종료하지 않았음에도 터미널에서 [Process completed (signal 9) - press Enter] 메시지가 표시될 수 있다. 팬텀 프로세스 킬러 워치독을 비활성화하는 옵션은 Android S (API 32) 또는 Android T에서 사용 가능하기 때문[12]에 Android R을 사용하는 경우, 특히 루팅되지 않은 기기의 경우 사용자가 모든 위험을 감수해야 한다.

[1] Android 앱으로 동작하는 Termux는 내부 홈 디렉토리에 한정하는 권한으로 동작하기 때문에 루트 파일 시스템, 시스템 디렉토리의 쓰기 권한을 가질 수 없어 FHS (Wikipedia, 영문) 를 지킬 수 없다. Termux 터미널 에뮬레이터에서 Debian, Ubuntu, 또는 Arch와 같은 공식 이미지를 사용할 수 없는 이유이기도 하다.[2] 각 버전 섹션 하단의 다운로드 링크를 클릭하여 Termux 를 다운로드할 수 있다. 하단 다운로드 링크 중 가장 상위 섹션이 F-Droid에서 제공하는 최신 버전이다[3] Github에서 업데이트 Release 이후 F-Droid에서 업데이트를 사용할 수 있으려면 일반적으로 2-3일, 많게는 7일 이상이 걸릴 수 있다. F-Droid Release는 새 Github Release를 감지하면 F-Droid 내부에서 빌드 및 게시를 진행하므로 Termux 유지 관리자가 F-Droid에서 Termux 앱의 빌드 및 게시를 제어할 수 없다. 또한 Termux 유지 관리자는 F-Droid Release의 APK 서명 키에 액세스할 수 없으므로 F-Droid Release와 호환되는 Termux 앱을 Github에서 직접 Release할 수 없다.[4] https://termux.github.io/general/2022/02/15/termux-apps-vulnerability-disclosures.html[5] 특정 디렉토리에 접근하는 경로를 변경할 수 있다[6] PRoot는 기존 CPU 아키텍처로 빌드된 프로그램의 실행과 QEMU 사용자 모드에서 에뮬레이트된 프로그램의 실행을 혼합할 수 있다. 이는 사용자 rootfs의 일부로 작용하여 크로스 컴파일 도구 또는 인터프리터 등 CPU에 의존하지 않는 프로그램으로 전체 빌드 시간을 단축할 수 있다.[7] AnLinux, AndroNix, 및 기타 웹에서 제공하는 Termux 전용 Linux배포판 설치 스크립트들이 존재한다.[8] Termux proot-distro Github[9] Termux 이슈#1072 (Github, 영문)[10] API 레벨 29 이상을 타겟팅하는 앱 (Android 개발자, 한글)[11] Play Console의 대상 API 수준 요구사항 (Play Console 고객센터, 한글)[12] https://t.co/Nfn2npZMkX