Title : Transfer your files with Kermit
Author: Solène
Date  : 31 January 2019
Tags  : unix kermit

Hi, it's been long time I wanted to write this article. The topic is Kermit,
which is a file transfer protocol from the 80's which solved problems of that
era (text files and binaries files, poor lines, high latency etc..).

There is a comm/kermit package on OpenBSD and I am going to show you how to use
it. The package is the program **ckermit** which is a client/server for kermit.

Kermit is a lot of things, there is a protocol, but it's also the
client/server, when you type **kermit**, it opens a kermit **shell**, where you
can type commands or write kermit scripts. This allows scripts to be done using
a kermit in the shebang.

I personally use kermit over ssh to retrieve files from my remote server, this
requires kermit on both machines. My script is the following:

    #!/usr/local/bin/kermit +
    set host /pty ssh -t -e none -l solene perso.pw kermit
    remote cd /home/ftp/
    cd /home/solene/Downloads/
    reget /recursive /delete .
    close
    exit

This connects to the remote server and starts kermit. It changes the current
directory on the remote server into **/home/ftp** and locally it goes into
**/home/solene/Downloads**, then, it start retrieving data, continuing previous
transfer if not finished (reget command), for every file finished, it's deleted
on the remote server. Once finished, it close the ssh connection and exits.

The transfer interfaces looks like this. It shows how you are connected, which
file is currently transferring, its size, the percent done (0% in the example),
time left, speed and some others information.

    C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, solene.perso.local [192.168.43.56]
    
       Current Directory: /home/downloads/openbsd
            Network Host: ssh -t -e none -l solene perso.pw kermit (UNIX)
            Network Type: TCP/IP
                  Parity: none
             RTT/Timeout: 01 / 03
               RECEIVING: src.tar.gz => src.tar.gz => src.tar.gz
               File Type: BINARY
               File Size: 183640885
            Percent Done:
                              ...10...20...30...40...50...60...70...80...90..100
     Estimated Time Left: 00:43:32
      Transfer Rate, CPS: 70098
            Window Slots: 1 of 30
             Packet Type: D
            Packet Count: 214
           Packet Length: 3998
             Error Count: 0
              Last Error:
            Last Message:
    
    X to cancel file, Z to cancel group, <CR> to resend last packet,
    E to send Error packet, ^C to quit immediately, ^L to refresh screen.


What's interesting is that you can skip a file by pressing "X", kermit will
stop the downloading (but keep the file for later resuming) and start
downloading the next file. It can be useful sometimes when you transfer a bunch
of files, and it's really big and you don't want it now and don't want to type
the command by hand, just "X" and it skips it. Z or E will exists the transfer
and close the connection.


Speed can be improved by adding the following lines before the reget command:

    set reliable
    set window 32
    set receive packet-length 9024

This improves performance because nowadays our networks are mostly reliable and
fast. Kermit was designed at a time when serial line was used to transfer data.
It's also reported that Kermit is in use in the ISS (International Space
Station), I can't verify if it's still in use there.

I never had any issue while transferring, even by getting a file by resuming it
so many times or using a poor 4G hot-spot with 20s of latency.

I did some tests and I get same performances than rsync over the Internet, it's
a bit slower over Lan though.

I only described an use case. Scripts can be made, there are a lot of others
commands. You can type "help" in the kermit shell to get some hints for more
help, "?" will display the command list.

It can be used interactively, you can queue files by using "add" to create a
send-list, and then proceed to transfer the queue.

Another way to use it is to start the local kermit shell, then type "ssh
user@remote-server" which will ssh into a remote box. Then you can type
"kermit" and type kermit commands, this make a link between your local kermit
and the remote one. You can go back to the local kermit by typing "Ctrl+\",
and go back to the remote by entering the command "C".

This is a piece of software I found by lurking into the ports tree for
discovering new software and I felt in love with it. It's __really__ reliable.

It does a different job compared to rsync, I don't think it can preserve time,
permissions etc... but it can be scripted completely, using parameters, and
it's an awesome piece of software!

It should support HTTP, HTTPS and ftp transfers too, as a client, but I did not
get it work. On OpenBSD, the HTTPS support is disabled, it requires some work
to switch to libreSSL.

You can find information on the [official
website](http://www.kermitproject.org).