# [iSH](https://ish.app) [![Build Status](https://travis-ci.org/ish-app/ish.svg?branch=master)](https://travis-ci.org/ish-app/ish) [![goto counter](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto) [![fuck counter](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck)
A project to get a Linux shell running on iOS, using usermode x86 emulation and syscall translation. For the current status of the project, check the issues tab, and the commit logs. - [App Store page](https://apps.apple.com/us/app/ish-shell/id1436902243) - [TestFlight beta](https://testflight.apple.com/join/97i7KM8O) - [Discord server](https://discord.gg/HFAXj44) - [Wiki with help and tutorials](https://github.com/ish-app/ish/wiki) - [README中文](https://github.com/ish-app/ish/blob/master/README_ZH.md) (如若未能保持最新,请提交PR以更新) # Hacking This project has a git submodule, make sure to clone with `--recurse-submodules` or run `git submodule update --init` after cloning. You'll need these things to build the project: - Python 3 + Meson (`pip3 install meson`) - Ninja - Clang and LLD (on mac, `brew install llvm`, on linux, `sudo apt install clang lld` or `sudo pacman -S clang lld` or whatever) - sqlite3 (this is so common it may already be installed on linux and is definitely already installed on mac. if not, do something like `sudo apt install libsqlite3-dev`) - libarchive (`brew install libarchive`, `sudo port install libarchive`, `sudo apt install libarchive-dev`) TODO: bundle this dependency ## Build for iOS Open the project in Xcode, open iSH.xcconfig, and change `ROOT_BUNDLE_IDENTIFIER` to something unique. Then click Run. There are scripts that should do everything else automatically. If you run into any problems, open an issue and I'll try to help. ## Build command line tool for testing To set up your environment, cd to the project and run `meson build` to create a build directory in `build`. Then cd to the build directory and run `ninja`. To set up a self-contained Alpine linux filesystem, download the Alpine minirootfs tarball for i386 from the [Alpine website](https://alpinelinux.org/downloads/) and run `./tools/fakefsify`, with the minirootfs tarball as the first argument and the name of the output directory as the second argument. Then you can run things inside the Alpine filesystem with `./ish -f alpine /bin/login -f root`, assuming the output directory is called `alpine`. If `tools/fakefsify` doesn't exist for you in your build directory, that might be because it couldn't find libarchive on your system (see above for ways to install it.) You can replace `ish` with `tools/ptraceomatic` to run the program in a real process and single step and compare the registers at each step. I use it for debugging. Requires 64-bit Linux 4.11 or later. ## Logging iSH has several logging channels which can be enabled at build time. By default, all of them are disabled. To enable them: - In Xcode: Set the `ISH_LOG` setting in iSH.xcconfig to a space-separated list of log channels. - With Meson (command line tool for testing): Run `meson configure -Dlog="