<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Hi Per and Hans,</p>
<p style="margin-top:0;margin-bottom:0"><br>
Thank you both for your replies! <span>😊<br>
Per is correct, I want to execute "ssh <host> <cmd>" from a regular shell (bash, etc.) and have it connect to the Erlang SSH shell that I started on <host> and give me output like there was "echo test1", "echo test2" in a bash script. </span></p>
<p style="margin-top:0;margin-bottom:0"><span><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span>I will look into if I can make use of the exec functionality for the Erlang SSH server. I looked at it earlier but it seemed to me that its intended use was for an Erlang SSH client connecting to an Erlang SSH server
 so I dismissed that as an option.<br>
<br>
If all else fails I could look into the ssh_cli option and see if I can have an Erlang SSH shell handle I/O differently than the default.</span></p>
<p style="margin-top:0;margin-bottom:0"><span><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span>Best regards,</span></p>
<p style="margin-top:0;margin-bottom:0"><span>Tommy</span></p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Per Hedeland <per@hedeland.org><br>
<b>Sent:</b> Friday, November 2, 2018 11:30:33 AM<br>
<b>To:</b> Hans Nilsson R; Mattsson, Tommy<br>
<b>Cc:</b> erlang-questions@erlang.org<br>
<b>Subject:</b> Re: [erlang-questions] Erlang ssh shell question</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Hi Tommy! (and Hans:-)<br>
<br>
Hans, I *think* you are misunderstanding Tommy's question. More<br>
speculation below, since I haven't actually verified how ssh(3)<br>
works... When using e.g. the OpenSSH client,<br>
<br>
$ ssh <host><br>
<br>
makes a "shell" request per<br>
<a href="https://tools.ietf.org/html/rfc4254#section-6.5">https://tools.ietf.org/html/rfc4254#section-6.5</a> , while<br>
<br>
$ ssh <host> <cmd><br>
<br>
makes an "exec" request. I think Tommy is happy with how "shell" works,<br>
but you seem to be changing it to a pretty boring implementation.:-) And<br>
I think Tommy's question is about "exec" not associating 'standard_io'<br>
with the SSH channel - thus if you use "exec" to call a function that<br>
prints something, the output is lost.<br>
<br>
I'm not sure there is anything "wrong" with that though - for an SSH<br>
server running "directly" on *nix, it is obvious that "exec" should<br>
associate stdio with the SSH channel, since <cmd> is *nix shell command,<br>
and it's pretty fundamental that you want any output (and exit code)<br>
that it produces. But for the Erlang/OTP SSH server, <cmd> is<br>
(apparently) an Erlang function call, and sending only what the call<br>
returns (in text form) back through the channel is not unreasonable per<br>
se.<br>
<br>
But maybe there could be an option to ssh:daemon() to make it do the<br>
same thing with 'standard_io' for "exec" as it does for "shell" - I<br>
can't see one in the man page. And I can't think of a way that the<br>
called function could set it up. But I assume that it's possible to<br>
do-it-all yourself via the 'ssh_cli' option.<br>
<br>
--Per<br>
<br>
On 2018-11-02 10:37, Hans Nilsson R wrote:<br>
> Hi,<br>
> <br>
> Try<br>
> <br>
> 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}]).<br>
> {ok,<0.110.0>}<br>
> 6><br>
> <br>
> Sorry for the one-liner. The fun() a bit edited, I hope I got it right:<br>
> <br>
>     fun(Usr,Hst) -><br>
>            spawn(fun() -><br>
>                     io:format("Hello ~p ~p~n",[Usr,Hst]),<br>
>                     L1 = io:get_line("&& "),<br>
>                     io:format("Got ~p~n", [L1])<br>
>                  end)<br>
>     end<br>
> <br>
> <br>
> Note the option shell and the spawn, it is essential.<br>
> You don't need the subsystem option.  The user_dir option defaults to the $HOME/.ssh of the user that started erl.<br>
> <br>
> Now in bash:<br>
> <br>
> ~$ ssh -p 1234 localhost<br>
> Hello "USERNAME" {{127,0,0,1},60088}<br>
> && some command<br>
> Got "some command\n"<br>
> Connection to localhost closed.<br>
> ~$<br>
> <br>
> Hope this helps.<br>
> /Hans<br>
> <br>
> <br>
> <br>
> On 11/2/18 10:05 AM, Mattsson, Tommy wrote:<br>
>> Hi,<br>
>><br>
>> First time writer here on the erlang questions list :)<br>
>><br>
>><br>
>> I am wondering if anyone knows about how the erlang ssh handles I/O? More details can be found below.<br>
>><br>
>><br>
>> Erlang version: 21.0<br>
>><br>
>><br>
>><br>
>> Start of SSH server on testing (Windows) machine:<br>
>><br>
>> application:ensure_all_started(ssh),<br>
>> Options = [{system_dir, filename:join(SSHPath, "daemon")}, {user_dir, ?DIR}, {subsystems, [ssh_sftpd:subsystem_spec([{cwd, SSHPath}])]}],<br>
>><br>
>> ssh:daemon(?ipaddr, ?port, Options]).<br>
>><br>
>> Test module:<br>
>> -module(sshtest).<br>
>> sshIO() -><br>
>>    io:format("test1~n"),<br>
>>    io:format("test2\n"),<br>
>>   test3.<br>
>><br>
>><br>
>> Test run from my own machine:<br>
>>> ssh $IPADDR 'sshtest:sshIO().'<br>
>> test3<br>
>><br>
>><br>
>> 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.<br>
>><br>
>> A test I did with a bash script towards a Linux server,<br>
>> Bash script (~/test.sh):<br>
>><br>
>> echo "test1"<br>
>><br>
>> echo "test2"<br>
>><br>
>> echo "test3"<br>
>><br>
>><br>
>> Test run from my own machine:<br>
>>> ssh $IPADDR ./test.sh<br>
>><br>
>> test1<br>
>><br>
>> test2<br>
>><br>
>> test3<br>
>><br>
>> This is how I'd like it to work.<br>
>><br>
>><br>
>> 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.<br>
>><br>
>> Other than this I/O problem the ssh connection works perfectly for me =<br>
<br>
>><br>
>> Hopefully someone here on the list has some insight into how this works.<br>
>><br>
>> Thankful for any help I can get :)<br>
>> Best regards,<br>
>><br>
>> Tommy<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> _______________________________________________<br>
>> erlang-questions mailing list<br>
>> erlang-questions@erlang.org<br>
>> <a href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
>><br>
> <br>
> <br>
> <br>
> _______________________________________________<br>
> erlang-questions mailing list<br>
> erlang-questions@erlang.org<br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
> <br>
<br>
</div>
</span></font></div>
</body>
</html>