{-# LANGUAGE BangPatterns #-} import Data.Conduit import qualified Data.Conduit.Combinators as C import qualified Data.Conduit.List as CL import System.Environment import System.FilePath import qualified Data.Text.IO as TIO import System.IO import Network.SSH.Client.LibSSH2.Foreign import Network.SSH.Client.LibSSH2.Conduit import Network.SSH.Client.LibSSH2 main = do args <- getArgs case args of [user, host, port, cmd] -> ssh user host (read port) cmd _ -> putStrLn "Synopsis: ssh-client USERNAME HOSTNAME PORT COMMAND" ssh login host port command = do initialize True home <- getEnv "HOME" let known_hosts = home ".ssh" "known_hosts" public = home ".ssh" "id_rsa.pub" private = home ".ssh" "id_rsa" withSession host port $ \session -> do r <- checkHost session host port known_hosts publicKeyAuthFile session login public private "" (Just ch, !src) <- execCommand True session command hSetBuffering stdout NoBuffering src =$= C.decodeUtf8 =$= C.linesUnbounded $$ CL.mapM_ TIO.putStrLn rc <- getReturnCode ch putStrLn $ "Exit code: " ++ show rc exit returnStrict !x = return x