[erlang-questions] Erlang ssh shell question

Per Hedeland per@REDACTED
Fri Nov 2 11:30:33 CET 2018


Hi Tommy! (and Hans:-)

Hans, I *think* you are misunderstanding Tommy's question. More
speculation below, since I haven't actually verified how ssh(3)
works... When using e.g. the OpenSSH client,

$ ssh <host>

makes a "shell" request per
https://tools.ietf.org/html/rfc4254#section-6.5 , while

$ ssh <host> <cmd>

makes an "exec" request. I think Tommy is happy with how "shell" works,
but you seem to be changing it to a pretty boring implementation.:-) And
I think Tommy's question is about "exec" not associating 'standard_io'
with the SSH channel - thus if you use "exec" to call a function that
prints something, the output is lost.

I'm not sure there is anything "wrong" with that though - for an SSH
server running "directly" on *nix, it is obvious that "exec" should
associate stdio with the SSH channel, since <cmd> is *nix shell command,
and it's pretty fundamental that you want any output (and exit code)
that it produces. But for the Erlang/OTP SSH server, <cmd> is
(apparently) an Erlang function call, and sending only what the call
returns (in text form) back through the channel is not unreasonable per
se.

But maybe there could be an option to ssh:daemon() to make it do the
same thing with 'standard_io' for "exec" as it does for "shell" - I
can't see one in the man page. And I can't think of a way that the
called function could set it up. But I assume that it's possible to
do-it-all yourself via the 'ssh_cli' option.

--Per

On 2018-11-02 10:37, Hans Nilsson R wrote:
> Hi,
> 
> Try
> 
> 5> ssh:daemon(1234, [{system_dir,...}, {shell,fun(Usr,Hst) -> spawn(fun() -> io:format("Hello ~p ~p~n",[Usr,Hst]), L1 = io:get_line("&& "), io:format("Got ~p~n", [L1]) end) end}]).
> {ok,<0.110.0>}
> 6>
> 
> Sorry for the one-liner. The fun() a bit edited, I hope I got it right:
> 
>     fun(Usr,Hst) ->
>            spawn(fun() ->
>                     io:format("Hello ~p ~p~n",[Usr,Hst]),
>                     L1 = io:get_line("&& "),
>                     io:format("Got ~p~n", [L1])
>                  end)
>     end
> 
> 
> Note the option shell and the spawn, it is essential.
> You don't need the subsystem option.  The user_dir option defaults to the $HOME/.ssh of the user that started erl.
> 
> Now in bash:
> 
> ~$ ssh -p 1234 localhost
> Hello "USERNAME" {{127,0,0,1},60088}
> && some command
> Got "some command\n"
> Connection to localhost closed.
> ~$
> 
> Hope this helps.
> /Hans
> 
> 
> 
> On 11/2/18 10:05 AM, Mattsson, Tommy wrote:
>> Hi,
>>
>> First time writer here on the erlang questions list :)
>>
>>
>> I am wondering if anyone knows about how the erlang ssh handles I/O? More details can be found below.
>>
>>
>> Erlang version: 21.0
>>
>>
>>
>> Start of SSH server on testing (Windows) machine:
>>
>> application:ensure_all_started(ssh),
>> Options = [{system_dir, filename:join(SSHPath, "daemon")}, {user_dir, ?DIR}, {subsystems, [ssh_sftpd:subsystem_spec([{cwd, SSHPath}])]}],
>>
>> ssh:daemon(?ipaddr, ?port, Options]).
>>
>> Test module:
>> -module(sshtest).
>> sshIO() ->
>>    io:format("test1~n"),
>>    io:format("test2\n"),
>>   test3.
>>
>>
>> Test run from my own machine:
>>> ssh $IPADDR 'sshtest:sshIO().'
>> test3
>>
>>
>> For some reason any io:format/io:fwrite does not travel back over the SSH connection. If I connect to some Linux machine that already has a (non-erlang) SSH server running and I try to run some random bash script then any echo I have in the script will travel back over the SSH connection.
>>
>> A test I did with a bash script towards a Linux server,
>> Bash script (~/test.sh):
>>
>> echo "test1"
>>
>> echo "test2"
>>
>> echo "test3"
>>
>>
>> Test run from my own machine:
>>> ssh $IPADDR ./test.sh
>>
>> test1
>>
>> test2
>>
>> test3
>>
>> This is how I'd like it to work.
>>
>>
>> I have been googling and reading the documentation for the ssh and related modules to no avail in regards to finding a solution to this problem.
>>
>> Other than this I/O problem the ssh connection works perfectly for me =

>>
>> Hopefully someone here on the list has some insight into how this works.
>>
>> Thankful for any help I can get :)
>> Best regards,
>>
>> Tommy
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
> 
> 
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
> 




More information about the erlang-questions mailing list