aprilsh

module
v0.0.0-...-958bc56 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 17, 2024 License: MIT

README

Aprilsh: remote shell support intermittent or mobile network. inspired by mosh and zutty. aprilsh is a remote shell based on UDP, authenticate user via openssh.

Installation

Reqirement

if you perfer to build aprilsh manually, please refer to this document

Alpine linux

Before start apshd, you need to make sure you can ssh login to the target server, please refer to this doc to setup a ssh enabled docker container.

Note: aprilsh is still waiting for aports approval. For now please use the following private repository. The private repository only provide x86_64 packages. Refer to build doc to know how to build apk packages and private repositories.

wget -P /etc/apk/keys/ https://ericwq.github.io/alpine/packager-663ebf9b.rsa.pub    # add public key
echo "https://ericwq.github.io/alpine/v3.19/testing" >> /etc/apk/repositories       # add private repository
apk update                                                                          # update repositories metadata
apk add aprilsh                                                                     # install client and server

Now you can ssh login to the server and the aprilsh is installed, it's time to start apshd server and login with apsh.

rc-service apshd start          # start apshd server
apsh -m 100 eric@localhost:8022 # apsh login to server

Note: when aports finally approve aprilsh, the above private repository will be replaced by official testing repositories. The testing repositories will provide all architecture packages.

echo "https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories  # add testing repositories

Fedora, CentOS, Redhat linux

Note: This is a private yum/dnf repositories, it only provides x86_64 packages. Refer to rpms doc to understand how to build rpm packags and dnf repositories.

rpm --import https://ericwq.codeberg.page/RPM-GPG-KEY-wangqi            # import public key to rpm DB
dnf config-manager --add-repo https://ericwq.codeberg.page/aprilsh.repo # add new repo to dnf repository
dnf install aprilsh                                                     # install client and server

Before start apshd, you need to make sure you can ssh login to the target server, please refer to this doc to setup a ssh enabled docker container.

Now you can ssh login to the server, it's time to start apshd service and login with apsh.

sudo systemctl start apshd.service      #start apshd service
sudo journalctl -f -u apshd.service     #keep reading the latest apshd.service log
apsh user@host                          # start apsh client on different host

MacOS

brew tap ericwq/utils       # add tap to homebrew
brew install aprilsh        # only install aprilsh client

Refer to homebrew doc to know how to create homebrew package and tap.

Validate installation

by default apshd listen on udp localhost:8100.

openrc-nvide:~# netstat -lup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 localhost:8100          0.0.0.0:*                           45561/apshd
openrc-nvide:~#

now login to the system with apsh (aprilsh client), note the motd(welcome message) depends on you alpine system config.

qiwang@Qi15Pro client % apsh ide@localhost
openrc-nvide:0.10.2

Lua, C/C++ and Golang Integrated Development Environment.
Powered by neovim, luals, gopls and clangd.
ide@openrc-nvide:~ $

if you login on two terminals, on the server, there will be two server processes serve the clients. the following shows apshd serve two clients. one is:8101, the other is ':8102'

openrc:~# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      225/sshd [listener]
tcp        0      0 :::ssh                  :::*                    LISTEN      225/sshd [listener]
udp        0      0 localhost:8100          0.0.0.0:*                           45561/apshd
udp        0      0 :::8101                 :::*                                45647/apshd
udp        0      0 :::8102                 :::*                                45612/apshd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     872486 159/s6-ipcserverd   /run/utmps/.btmpd-socket
unix  2      [ ACC ]     STREAM     LISTENING     869747 253/s6-ipcserverd   /run/utmps/.utmpd-socket
unix  2      [ ACC ]     STREAM     LISTENING     866239 281/s6-ipcserverd   /run/utmps/.wtmpd-socket
openrc-nvide:~#

Motivation

openSSH is excellent. While mosh provides better keystroke prediction/latency and is capable of handle WiFi/cellular mobile network roaming. But mosh project is not active anymore and no release sine 2017. Such a good project like mosh should keeps developing.

After read through mosh source code, I decide to rewrite it with golang. Go is my first choice because the C++ syntax is too complex. Go also has excellent support for UTF-8 and multithreaded programming. The last reason: go compiler is faster than c++ compiler.

There are several rules for this project:

  • Keep the base design of mosh: SSP, UDP, keystroke prediction.
  • Use 3rd party library as less as possible to keep it clean.

There are also some goals for this project:

  • Full UTF-8 support, including emoji and flag support.
  • Support the terminal 24bit color.
  • Upgrade to proto3
  • Use terminfo database for better compatibility.
  • Prove golang is a good choice for terminal developing.

The project name Aprilsh is derived from April+sh. This project started in shanghai April 2022, and it's a remote shell. Use the above command to add musl locales support and utmps support for alpine. Note alpine only support UTF-8 charmap.

Architecture

aprilsh.svg

  • The green part is provided by the system/terminal emulator. Such as alacritty or kitty.
  • The cyan part is provided by Aprilsh.
  • The yellow part is our target terminal application. In the above diagram it's neovim.
  • Actually the yellow part can be any terminal based application: emcas, neovim, htop, etc.
  • The rest part is provided by the system.

Changelog

Ready for early acess. The missing part is prediction engine tuning. Check here for history deatil.

License

MIT

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL