<div dir="ltr"><div>Actually, the sample cli module works quite all right. The problem is that the default implementation in ssh_cli for the "exec" thing in ssh is actually to execute it (using erl_scan and erl_eval and stuff). There is an undocumented option to ssh (actually to the ssh_cli module) that can be used to customize this. The option<font face="arial, helvetica, sans-serif"> </font><font face="courier new, monospace">{exec, {M, F, []}}</font> takes an exported function (M:F/1) that is called with the parameters given to the ssh commands as a string. This function should spawn a process that writes the desired output on stdout.</div>
<div><br></div><div>So to avoid the strange eval phenomenon, and provide another function that just echoes the parameters back, you can write a module x:<br></div><div><div><font face="courier new, monospace">-module(x).</font></div>
<div><font face="courier new, monospace">-export([exec/1]).<br></font></div><div><font face="courier new, monospace">exec(A) -> spawn(fun() -> io:format("~p\n", [A]), exit(normal) end).</font></div></div><div>
<br></div><div>and specify the function x:exec/1 as a call-back for the exec option:</div><div><span style="font-size:13px"><font face="courier new, monospace">B=ssh_sample_cli:listen(8323, [{subsystems, []}, {exec, x, exec, ""]).</font></span><br>
</div><div><br></div><div>And then when you do:</div><div><font face="courier new, monospace"><span style="font-size:13px">> ssh -p 8323 to.the.host '</span><span style="font-size:13px">lists:reverse("test").'</span></font></div>
<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">You get back:</span></div><div><span style="font-size:13px"><font face="courier new, monospace">"list:reverse(\"test\")."</font></span></div>
<div><span style="font-size:13px"><font face="courier new, monospace"><br></font></span></div><div><font face="arial, helvetica, sans-serif">Hope this helps. (And sorry for the mess…)</font></div><div><font face="arial, helvetica, sans-serif">/Jakob</font></div>
<div><font face="arial, helvetica, sans-serif"><br></font></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/12/10 Ingela Andin <span dir="ltr"><<a href="mailto:ingela.andin@gmail.com" target="_blank">ingela.andin@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div>Hi!<br><br></div>The CLI example in the SSH application must be seen as a hack. We intend to clean it up and <br>
</div>extend the SSH documentation, when it gets prioritized I can not say. Well anyway your CLI <br>
</div>implementation must take care of SSH exec request as well.  You can also look at the ssh_cli.erl  module.<br></div>If
 I remember correctly there was a bug, before ssh-2.1.7, with regards to
 the exec request  so that  it was not forwarded to CLI process but 
rather always interpreted in the erlang shell environment.<br><br></div>Regards Ingela Erlang/OTP team - Ericsson AB<div><div class="h5"><br><br><div class="gmail_extra"><br><div class="gmail_quote">2013/12/7 OvermindDL1 <span dir="ltr"><<a href="mailto:overminddl1@gmail.com" target="_blank">overminddl1@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Greetings,<br>
<br>
I am attempting to just create an SSH shell to connect to a system by<br>
users so they can do commands without the web interface, and as such I<br>
certainly do not want things like port forwarding or being able to run<br>
arbitrary erlang code, however I do not seem to be able to disable<br>
running arbitrary erlang code.  An example of the ssh_sample_cli<br>
included with erlang:<br>
"""<br>
$ erl<br>
Erlang R16B02 (erts-5.10.3) [source] [64-bit] [smp:8:8]<br>
[async-threads:10] [hipe] [kernel-poll:false]<br>
<br>
Eshell V5.10.3  (abort with ^G)<br>
1> c(ssh_sample_cli).<br>
ssh_sample_cli.erl:146: Warning: this expression will fail with a<br>
'badarith' exception<br>
{ok,ssh_sample_cli}<br>
2> B=ssh_sample_cli:listen(8323, [{subsystems, []}]).<br>
{ok,<0.67.0>}<br>
"""<br>
<br>
And from another shell/computer:<br>
"""<br>
$ ssh -p 8321 to.the.host<br>
myusername@to.the.host's password:<br>
Enter command<br>
CLI> help<br>
CLI Sample<br>
crash                  crash the cli<br>
exit                   exit application<br>
factors    <int>       prime factors of <int><br>
gcd        <int> <int> greatest common divisor<br>
help                   help text<br>
host                   print host addr<br>
lcm        <int> <int> least common multiplier<br>
prime      <int>       check for primality<br>
primes     <int>       print all primes up to <int><br>
rho        <int>       prime factors using rho's alg.<br>
self                   print my pid<br>
user                   print name of user<br>
<br>
---> ok<br>
CLI> exit<br>
---> done<br>
Connection to to.the.host closed.<br>
"""<br>
<br>
So far so good (the main program where I have this implemented has a<br>
well running shell of its own), but lets try a couple other things:<br>
"""<br>
$ sftp -P 8321 to.the.host<br>
myusername@to.the.host's password:<br>
subsystem request failed on channel 0<br>
Connection closed<br>
"""<br>
<br>
Also good, no file transfers can be done since the option subsystem is<br>
set to [], but notice:<br>
"""<br>
$ ssh -p 8323 to.the.host 'lists:reverse("!?ti pots I od woh dna ereh<br>
gnineppah si tahw woN").'<br>
myusername@to.the.host's password:<br>
"Now what is happening here and how do I stop it?!"<br>
"""<br>
<br>
So... I can still run arbitrary erlang commands, how do I stop this?<br>
Unable to find an option to pass in or anything through a quick code<br>
perusal to no avail.  Help?<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div></div></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>