[erlang-questions] SSH SCP

JD Bothma jbothma@REDACTED
Wed Jul 18 20:03:50 CEST 2012


plus this could help
https://blogs.oracle.com/janp/entry/how_the_scp_protocol_works since
at least my scp manpage doesn't explain -t

On 18 July 2012 20:01, JD Bothma <jbothma@REDACTED> wrote:
> It sounds like ssh_cli is doing exactly what it's supposed to be doing
> :) http://www.erlang.org/documentation/doc-5.6/lib/ssh-0.9.9.3/doc/html/ssh_cli.html
> executing it as an erlang term, since it provides the erlang shell via
> ssh.
>
> I guess you should implement your own shell module according to the
> instructions (somewhere around the erlang ssh module set docs) and
> execute the command given by the client (I guess scp -t path) with
> open_port or whatever it was.
>
> Following that, I imagine the scp client starts sending data and at a
> guess you should forward the data to stdin of your scp os process on
> the server side.
>
> If you google a bit I think you'll find an example ssh shell module
> implementation, or you can just look at the ssh_cli sources.
>
> If you get this working it'd be cool if you made it available, I'm
> sure others have wanted to do this too!
>
> Hope that's reasonably correct and helpful :)
>
> JD
>
> On 18 July 2012 19:41,  <gabre@REDACTED> wrote:
>> Hello,
>>
>> Thank you for your quick answer, Siraaj, but I'd like to do the inverse of
>> what you described below. I'd like to start an SSH daemon with Erlang (OTP
>> SSH), and use it with the following command:
>>  scp filename_on_my_pc host:path
>> (copying)
>>
>> I start Erlang SSH like this:
>>   start() ->
>>     crypto:start(),
>>     ssh:start(),
>>     Shell = myshell(),
>>     ssh:daemon({0,0,0,0}, 45678, [{pwdfun, fun check_pwd/2},
>>             {system_dir, "/home/.../global-ssh-host-keys"},
>>                 {ssh_cli,{ssh_cli, [Shell]}},
>>             {subsystems,
>>             [{"sftp", {ssh_sftpd, [
>>                             {vsn,           3}
>>                         ]}}]}]).
>> Shell is a self-written simple shell, but it has no job here, 'cause using
>> scp command is something like giving the ssh command a parameter (I think).
>>
>> I know this is an improper way of using scp because ssh_cli tries to parse
>> "scp -t path" (this is the command which is called via ssh by scp) as an
>> Erlang term.
>> I d like to ask you to give me instructions. How can I set up a working
>> Erlang ssh deamon (working with scp)?
>>
>> Thank you in advance
>>
>> Gabor Hosszu
>>
>>
>>
>>>
>>> On Jul 16, 2012, at 3:39 PM, gabre@REDACTED wrote:
>>>
>>>> Hello,
>>>>
>>>> I d like to ask about the SSH module found in OTP. I would like to use
>>>> the SCP command (which uses ssh) via Erlang (SSH module). Is there
>>>> anybody, who can explain me, how to do it? I have googled and searched
>>>> million times, but nothing... (I have also tried it using os:cmd/1 and a
>>>> seld-made shell loop)
>>>
>>>
>>>
>>> I haven't gotten around to file transfers (with OTP ssh app) yet, but I
>>> did manage to mostly figure-out the basics of using the SSH app, and can
>>> give you a jump start.
>>>
>>> For the simplest example of doing something useful, lets say we want a
>>> an escript that sort-of mimics an ssh command. First, make sure you have
>>> an SSH directory (~/.ssh) and a pub-priv key pair (~/.ssh/id_dsa and
>>> ~/.ssh/id_dsa.pub) that is NOT password protected. This last part is
>>> important, because at this time the ssh app does not yet support
>>> password-protected keys [1]. After you have the key pair, the simplest
>>> implementation could look something like this:
>>>
>>>
>>>     #! /usr/bin/env escript
>>>
>>>     %%%
>>> ----------------------------------------------------------------------
>>>     %%% file: ssh.erl
>>>     %%%
>>> ----------------------------------------------------------------------
>>>
>>>
>>>     main([User, Address, Port, Command]) ->
>>>         ok = crypto:start(),
>>>         ok = ssh:start(),
>>>
>>>         Timeout = 5000,
>>>         SSHDirectory = filename:join(os:getenv("HOME"), ".ssh"),
>>>
>>>         ConnectOptions = [
>>>             {user, User},
>>>             {connect_timeout, Timeout},
>>>             {silently_accept_hosts, true},
>>>             {user_interaction, true},
>>>             {user_dir, SSHDirectory}
>>>         ],
>>>
>>>         case ssh:connect(Address, list_to_integer(Port), ConnectOptions)
>>> of
>>>             {ok, ConnRef} ->
>>>                 case ssh_connection:session_channel(ConnRef, Timeout) of
>>>                     {ok, ChannId} ->
>>>                         ssh_connection:exec(ConnRef, ChannId, Command,
>>> Timeout),
>>>                         Data = collect_data(),
>>>                         io:format("~s~n", [Data]);
>>>
>>>                     {error, Reason} ->
>>>                         io:format("~p~n", [Reason])
>>>                 end;
>>>             {error, Reason} ->
>>>                 io:format("~p~n", [Reason])
>>>         end;
>>>
>>>     main(_) ->
>>>         io:format("USAGE: ssh.erl <user> <address> <port> <command>~n").
>>>
>>>
>>>     collect_data() -> collect_data([]).
>>>     collect_data(Data) ->
>>>         receive
>>>             {ssh_cm, _, {data, _, _, Datum}} ->
>>>                 collect_data([Datum | Data]);
>>>
>>>             {ssh_cm, _, {closed, _}} ->
>>>                 lists:reverse(Data);
>>>
>>>             {ssh_cm, _} ->
>>>                 collect_data(Data)
>>>         end.
>>>
>>>
>>> For a more extended example of the use of the above code, see my Cluster
>>> Commander project [2], particularly commander_worker_otp.erl module. I
>>> also took advantage of OS's ssh/scp commands (as an alternative to OTP
>>> ssh and as the only, for now, way to do scp), see
>>> commander_worker_os.erl module and os_cmd/1 function in
>>> commander_lib.erl module.
>>>
>>> The above uses ssh_connection:exec/4 to just send a command string to
>>> the remote host and receive the resulting data, but, for more
>>> interesting uses, you can also use ssh_connection:send/3-5 and push any
>>> data you want to the remote host (assuming it knows how to interpret
>>> it).
>>>
>>> For a more interesting example, see Kenji Rikitake's sshrpc [3] [4] and
>>> my (uber-early and half-baked) attempts at implementing the ssh_channel
>>> behavior for my needs [5].
>>>
>>>
>>> [1] - http://erlang.org/pipermail/erlang-questions/2010-April/050637.html
>>> [2] - https://github.com/ibnfirnas/cluster-commander
>>> [3] - https://github.com/jj1bdx/sshrpc
>>> [4] -
>>> http://www.erlang-factory.com/conference/SFBay2010/speakers/kenjirikitake
>>> [5] - https://github.com/ibnfirnas/data-mill
>>>
>>>
>>> --
>>> Siraaj Khandkar
>>> .o.
>>> ..o
>>> ooo
>>>
>>>
>>>
>>
>>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list