bashdrop is a tiny one-shot file transfer tool.
It is designed for situations where the sender and receiver only have Bash and raw TCP via /dev/tcp.
That means: no scp, no rsync, no wormhole, no croc, no curl, no wget, no netcat.
Just Bash. (Optionally openssl and sha256sum for integrity and encryption modes.)
A temporary Python relay server is required somewhere on the internet:
- It can be bootstrapped automatically over SSH (with
bashdrop). - Or started manually.
Note
The SSH/scp dependency exists only to set up the server. Neither the sender nor the receiver need them — they just run Bash commands.
- bashdrop — the main script. Copies
bashdrop-server.pyto a remote machine over SSH and runs it there. - bashdrop-server.py — the Python server that handles one upload and one download. Can also be run directly if you're already on the host.
Test it out without installation:
nix run . -- <ssh-target> <public-domain-or-ip> [filename] [password]Install it permanently:
nix profile add github:fabian-thomas/bashdropYou need a reachable server somewhere (e.g. a VPS). There are two ways to start the relay:
-
Bootstrap via SSH (automatic):
bashdrop [-p PORT] <ssh-target> <public-domain-or-ip> [filename] [password]
This uses
ssh/scpto copy and startbashdrop-server.py.Example:
bashdrop user@myserver my-domain-or-ip.com
-
Manual start (no SSH needed): If you already have access to the server shell:
bashdrop-server.py [-p PORT] <public-host-or-ip> [filename] [password]
Important
The <ssh-target> and <public-domain-or-ip> must point to the same machine.
<ssh-target>→ how you connect via SSH (e.g.user@myserver)<public-domain-or-ip>→ how sender/receiver connect (e.g.my-domain-or-ip.com)
Once the server is running, it prints ready-to-use Sender and Receiver commands in three modes:
- Plain Bash — just
/dev/tcp - Plain + Integrity Check —
/dev/tcpwithsha256sumverification - Encrypted + Integrity Check —
openssl enc -aes-256-cbc -pbkdf2withsha256sum
These commands require only:
- Bash +
/dev/tcp - (optional)
sha256sum - (optional)
openssl
No ssh, no scp.
-p PORT: TCP port to listen on (default:9000).filename: filename shown in the copy-paste commands (default:file).password: optional, used only for the encrypted mode (default: random).
Port 9000 is used by default.
Ensure port forwarding / firewall rules allow access.
Sender:
cat >/dev/tcp/my-domain-or-ip.com/9000 < myfile.txtReceiver:
cat </dev/tcp/my-domain-or-ip.com/9000 > myfile.txtRemember: these commands only work while the server is running to relay the file.