taliaferro

taliaferro

SSH server: How can I get raw input from the client?

Good morning folks,
I’m new to Elixir and have a project I’d like to build, but I think I might be a little out of my depth.
I want to make an SSH server which, instead of presenting a command prompt, presents a simple game in the terminal.

I’ve found jbenden/esshd and a couple of small examples of Erlang’s own :ssh module. However, all the examples I can find seem to accept input line by line. The user types a command then the user presses enter, then the full line they typed is sent to the server and my code can read it and do something with it.

I’m wondering if this is a gap in my knowledge about how SSH works. With a normal command-line application, I know there are arcane escape sequences I can send to any given terminal emulator that will put it into raw/non-canonical mode; all nicely abstracted away behind ncurses so I don’t have to think about them.
But in this application, there is no terminal, at least not one I’m aware of.
By what mechanism can I signal to an SSH client that as soon as the user presses an arrow key, I want to hear about it?

Most Liked

marcin

marcin

Hi!

Not exaclty grasping if you really want to run your ssh server or you just want to run a custom shell, but it will be probably worth reading on:

  • terminal emulator
  • shell (eg bash)
  • ANSI escape codes

It seems that you just need to run standard ssh but have a different shell (then bash) set for a user.

The special codes that are sent by the shell app are interpreted by you ur terminal emulator (eg gnome terminal) and the SSH server just passes them through as strings.

Last Post!

taliaferro

taliaferro

Hi Marcin! Thanks for your suggestion.
I should clarify – for the sake of security, and the simplicity of the design, I don’t want to just make a custom shell and put it behind sshd.
I want to use the SSH daemon module included with OTP; that way the server and all the application logic can be part of the same application, and I could handle many concurrent clients in parallel as separate processes.

I have looked at ANSI escape codes, but to the best of my knowledge there’s no way to put a terminal into non-canonical mode using escape sequences alone. The thing that seems to do what I need is termios, but I’m not sure how that’d work over SSH, or how I could interface with it from Elixir.

Where Next?

Popular in Questions Top

vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

We're in Beta

About us Mission Statement