Debian Squeeze doesn’t have a new enough libssh2 for the LibSSH2 package on hackage. So I tried the libssh library and dev package from Debian testing:

$ dpkg -l | grep -i libssh2
ii  libssh2-1                                       1.4.2-1.1                          SSH2 client-side library
ii  libssh2-1-dev                                   1.4.2-1.1                          SSH2 client-side library (development headers)

However libssh2 failed to install using cabal:

$ cabal install libssh2
Resolving dependencies...
Configuring libssh2-
cabal: The pkg-config package libssh2 version >=1.2.8 is required but it could
not be found.
Failed to install libssh2-
cabal: Error: some packages failed to install:
libssh2- failed during the configure step. The exception was:
ExitFailure 1

We can help it along by setting PKG_CONFIG_PATH so that cabal finds libssh2, and also set the extra lib/include directories so that it finds libgcrypt:

$ export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
$ cabal install libssh2 --extra-include-dirs=/usr/include --extra-lib-dirs=/lib/x86_64-linux-gnu

Finally, compiling ssh-client.hs blew up in a weird way:

$ ghc –make ssh-client.hs
[1 of 1] Compiling Main ( ssh-client.hs, ssh-client.o )

    Couldn't match expected type `BSL.ByteString'
                with actual type `bytestring-'
    In the first argument of `BSL.putStr', namely `result'
    In a stmt of a 'do' block: BSL.putStr result
    In the expression:
      do { channelExecute ch command;
           result <- readAllChannel ch;
           BSL.putStr result }

Thanks to this stackoverflow question I found out that I had two versions of the bytestring library installed on my system:

$ ghc-pkg list bytestring

and the answer was to hide the 0.10.x version:

$ ghc --make -hide-package bytestring- ssh-client.hs

Example usage:

$ ./ssh-client command carlo 22 uptime
 20:04:43 up 35 days, 22:14,  0 users,  load average: 0.00, 0.00, 0.00