mody5
How to connect via :ssh module using an id_ed25519 private key string
I spent more than a day trying to figure out how to connect via ssh using a private key but without a result.. all languages some to have an example when it comes to ssh except erlang/elixir which I don’t know why it’s that hard.
The only example I can find is using username/password, but I want to ssh to another machine using username and private ssh key (id_ed25519),
Any idea?
Most Liked
al2o3cr
A good starting point IMO is the example in the :ssh user guide.
That shows the general shape of things (connect/session_channel/exec) but doesn’t really use the messages, or answer your original question.
For the “using the messages” part, take a look at how SSHEx does it - the whole file is worth reading, but this is where the actual {:ssh_cm, ...} messages get handled:
For the second half, there are two behaviours that :ssh depends on but the one we care about is :ssh_client_key_api. That’s implemented by two modules supplied with :ssh, :ssh_file and :ssh_agent which use either files or the SSH agent. :ssh_file is the default, but you can pass an alternative implementation via the :key_cb option to :ssh.connect.
HOWEVER
:ssh_client_key_api has more moving parts than just “here is a key”, it also deals with known hosts. SSHEx includes an implementation you could use / model after:
https://github.com/rubencaro/sshex/blob/master/lib/sshex/configurable_client_keys.ex#L10-L26
D4no0
If you are using OTP, it’s always worth checking out the official documentation. Here is how to configure custom keypairs for servers and the next paragraph is for clients: ssh — OTP 29.0.2 (ssh 6.0.1)
The parameters that can be sent to the client/daemon are also clearly documented, take a look through them: ssh — OTP 29.0.2 (ssh 6.0.1)
mody5
Ok I believe this is so easy for you so please just add that one line or 2 missing lines where I have put a placeholder for completion (my private key is located in /home/me/.ssh/id_ed25519)
ssh_options = [
{:user, user},
{:silently_accept_hosts, true},
{:user_interaction, false},
# ====== please just fill in here those easy missing lines ======
]
{:ok, conn} <- :ssh.connect(ip, port, ssh_options, 5000)
BTW I am really newbie to OTP, but I am sure you an experienced on these stuff.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









