Pterodactyl · Pelican · Feather · Wisp · Docker

One egg.
Every shell.
Every direction.

A universal multi-shell egg hosting 0 shell types: SSH with real CA certificates, hardened keys-only, tunnels, interpreter reverse shells, TLS and covert channels, bind shells, browser terminals and debug harnesses. Credentials are the only mandatory setting.

0

shell types

0

families

0

panels + docker

0

egg json

$

Set SHELL_TYPE=auto and the console becomes a paginated picker; set it to any id (or a comma list) and everything boots unattended. Multiple shells run side by side on multiple panel ports.

container console
$ SHELL_TYPE=auto bash /entrypoint.sh
</> shell-eggs Detected panel: Pterodactyl/Pelican
</> shell-eggs SHELL-TYPE is set to AUTO - opening picker
+==========================================================+
| SHELL-EGGS INTERACTIVE PICKER - choose your shell |
+==========================================================+
How do you want to reach this container?
1) Server / incoming - SSH, Dropbear, Telnet, Mosh
2) Multiplexer - tmux / screen / zellij
3) Reverse shell - container calls back to you
4) Browse everything - page through the full catalog
</> shell-eggs SSH ready on port 2222 (users: alice bob)
</> shell-eggs Supervisor online. Managed services: ssh

The catalog · 8 families

54 shells. Eight directions. One startup variable.

Pick any combination - a hardened SSH server plus a tmux session, a TLS bind shell plus a Python reverse shell. The first ported shell takes the panel-assigned port; extras get their own. Every family has its own docs page with connection commands.

Full connection guides for every entry: SHELLs.md · also printed to your server console at boot.

Port policy

Ports that actually work on panels

Pterodactyl / Pelican / Feather / Wisp

primary shell binds the panel-allocated SERVER_PORT automatically

Docker / standalone

binds SERVER_PORT (you choose it, default 8888) - no panel required

Extra shells

SHELL_EXTRA_PORTS positionally, so 3 shells = 3 allocated panel ports

Reverse + multiplexers

no inbound port at all - they call out or live in-session

Configuration

Credentials mandatory. Everything else optional.

Every egg variable has a working default. Give it users and passwords (or let it generate crypto-random secrets) and the egg is fully operational.

SHELL_TYPE

Which shell(s) to run.

SHELL_PASSWORDS

Positionally matched to Shell Usernames ('S3cretA,S3cretB').

SHELL_EXTRA_PORTS

OPTIONAL: comma-separated extra panel ports for additional PORTED shells (the primary shell always binds this server's default port).

All 24 variablesrequiredSHELL_USERS - Shell Usernames

Tested, not claimed

Verified in real container boots

SSH password + SFTP + generated credentials[OK] real sshpass login in CI
SSH CA certificates[OK] signed cert login; wrong principal rejected
Hardened keys-only[OK] password refused, pubkey accepted
Telnet + shadow auth[OK] login OK; bad password rejected
Reverse shells (python/nc/bash)[OK] reached external listener, command round-trip
TLS bind shell[OK] socat OPENSSL round-trip in container