iPadで動くLinuxエミュレーター「iSH」がすごいと私の中で話題に

# iSHセットアップ
## apkをインストール
標準ではパッケージマネージャーのapkがインストールされていないのでインストールします。

```sh
$ wget -qO- http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86/apk-tools-static-2.10.5-r1.apk | tar -xz sbin/apk.static && ./sbin/apk.static add apk-tools && rm sbin/apk.static && rmdir sbin 2> /dev/null
```

### apkの更新

```sh
$ apk update
$ apk upgrade
```

### 最低限色々入れてみる

```sh
$ apk add zsh vim git openssh
```

### デフォルトシェル変更

```sh
$ vim /etc/passwd
```

```/etc/passwd
# 変更前
root:x:0:0:root:/root:/bin/ash
# 変更後
root:x:0:0:root:/root:/bin/zsh
```

変更後はiSHを再起動します。
するとプロンプトが`\h:\w\$`と表示され見辛いのでプロンプトを変えちゃいましょう。
全ユーザーで共通にしたいので/etc/zshrcを作ります。

```/etc/zshrc
setopt PROMPT_SUBST     # allow funky stuff in prompt

if [ "$USER" = "root" ]; then
    color="red"         # root is red, user is cyan
else
    color="cyan"
fi;


local ok_yuno="%F{yellow}✘╹◡╹✘%f"
local bad_yuno="%F{red}✘>﹏<✘%f"
local command_line="
%F{green}%B%*%b%f %F{$color}%B%n@%m%b%f %F{green}%B%~%b%f
%(?.${ok_yuno}.${bad_yuno}) %F{yellow}%B%#%b%f "

export PROMPT="${command_line}"
```

ついでに`/etc/vimrc`も

```/etc/vimrc
syntax enable

set number
set title
set cursorline
set virtualedit=onemore
set showmatch
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set hlsearch
nmap <Esc><Esc> :nohlsearch<CR><Esc>

set fenc=utf-8
set encoding=utf-8
scriptencoding utf-8
set ambiwidth=double

inoremap { {}<Left>
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap ( ()<ESC>i
inoremap (<Enter> ()<Left><CR><ESC><S-o>
inoremap [ []<Left>
inoremap ' ''<Left>
inoremap " ""<Left>

nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk
```

### バックグラウンドでiSHを起動したままにする
魔法のおまじないです。

```sh
$ cat /dev/location > /dev/null &
```

次にiPadOSの設定アプリでiSHの位置情報利用を常に許可します。

### SSHで好きなクライアントからiSHにログインする
iSHのターミナルはちょっと味気ないので普段使い慣れてるクライアントから操作できたら嬉しいですよね。
ここではみのりんおすすめの`Blink Shell`を使ってiSHを操作してみます。

#### iSHで準備

```/etc/ssh/sshd_config
Port 22000 # 同じデバイスからは22番でアクセスできない
PermitRootLogin yes # あとでNoに変更
PubkeyAuthentication yes
PasswordAutentication yes # あとでNoに変更
ClientAliveInterval 60 # SSHが途切れないようにお好みで
ClientAliveCountMax 60
```

```sh
$ passwd # rootパスワードを決める
$ ssh-keygen -A
$ /usr/sbin/sshd
```

あとはお好きなクライアントから接続するだけです(o・ω・o)

```sh
ssh root@localhost -p 22000
```

## 一般ユーザー追加とか

```sh
$ adduser -s /bin/zsh minorin
$ addgroup minorin wheel
```

`sudo`をインストール

```sh
$ apk add sudo
$ visudo
```

```
# コメントアウトを外す
%wheel ALL=(ALL) ALL
```

### SSH設定
#### 鍵作成

```sh
$ su minorin
$ chmod 755 /home/minorin
$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ touch authorized_keys
$ chmod 600 authorized_keys
$ ssh-keygen
$ chmod 600 id_rsa
```

このあと`autorized_keys`にクライアントの公開鍵をコピペします。

#### sshd_config設定

```/etc/ssh/sshd_config
PermitRootLogin no
PasswordAutentication no
AddressFamily inet
UseDNS no
```

```sh
$ sudo /usr/sbin/sshd
```

あとはいつものクライアントから鍵認証でSSHできることを確認するだけです。

```sh
ssh minorin@localhost -p 22000
```

### openrcとか

```sh
$ apk add openrc
$ rc-update add sshd
```

これでsshdが自動起動されるはずだけどうまくいかない( ；∀；)

## code-serverのインストール

```sh
$ apk add alpine-sdk libstdc++ libc6-compat npm libx11-dev libxkbfile-dev libsecret-dev python3
$ npm config set unsafe-perm true
$ npm config set python python3
$ npm install -g @google-cloud/logging@4.5.2
$ npm install -g code-server
```

```sh
npm WARN @coder/logger@1.1.11 requires a peer of @google-cloud/logging@^4.5.2 but none is installed. You must install peer dependencies yourself.

npm ERR! code ENOENT
npm ERR! syscall rename
npm ERR! path /usr/lib/node_modules/code-server/node_modules/tar-fs/node_modules/chownr
npm ERR! dest /usr/lib/node_modules/code-server/node_modules/tar-fs/node_modules/.chownr.DELETE
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, rename '/usr/lib/node_modules/code-server/node_modules/tar-fs/node_modules/chownr' -> '/usr/lib/node_modules/code-server/node_modules/tar-fs/node_modules/.chownr.DELETE'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-**-*****_**_**_****-debug.log
```

ダメでした( ；∀；)

## 次回予告

とりあえずVNCの設定とかやってみるつもりです。