MacOS 12.5.1 (M1 Max)
Elixir 1.14.3 (compiled with Erlang/OTP 25)
I am trying to read some status data from a network switch within my Elixir application over ssh. I am attempting to do this using the SSHEx framework.
I am able to connect fine (returns ok, and I can see an open session on the switch), but when I issues a command I am unable to read any response, and it times out waiting.
To confirm I have started :ssh under Extra Application.
Here is the code I am using initially, I’m aware it’s not ideal at the moment, but it should at least be getting me some output.
defmodule FibreTestUi.Ssh do
defp connect do
SSHEx.connect(
ip: '192.168.1.1',
user: 'admin',
password: '!Password',
modify_algorithms: [
{:append, [{:kex, [:"diffie-hellman-group-exchange-sha1"]}]},
{:append, [{:public_key, [:"ssh-rsa", :"ssh-dss"]}]}
]
)
end
def list_port_status do
{:ok, conn} = connect()
SSHEx.cmd!(conn, 'show ssh', exec_timeout: 15000)
end
end
All I get back is:
** (RuntimeError) {:error, "Timeout. Did not receive data for 15000ms."}
(sshex 2.2.1) lib/sshex.ex:100: SSHEx.cmd!/3
iex:2: (file)
If I ssh into the switch manually, I am able to execute the command fine.
user@comp ~ % ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 admin@192.168.1.1
FS#show ssh
Connection Version Encryption Hmac Compress State Username
0 2.0 aes128-ctr hmac-sha1 none Session started admin
FS#
If I pick another random device (ransom raspberry pi), and connect with a basic ‘echo hello’ I get a response fine.
defmodule FibreTestUi.Ssh do
defp connect do
SSHEx.connect(
ip: '10.11.xx.xx',
user: 'pi',
password: 'password',
modify_algorithms: [
{:append, [{:kex, [:"diffie-hellman-group-exchange-sha1"]}]},
{:append, [{:public_key, [:"ssh-rsa", :"ssh-dss"]}]}
]
)
end
def list_port_status do
{:ok, conn} = connect()
SSHEx.cmd!(conn, 'echo hello', exec_timeout: 5000)
end
end
"hello\n"
I have also tried doing this directly using :ssh with the following code:
def send_command do
{:ok, ssh_pid} =
:ssh.connect('192.168.1.1', 22,
user: 'admin',
save_accepted_host: false,
silently_accept_hosts: true,
password: '!Password',
modify_algorithms: [
prepend: [kex: [:"diffie-hellman-group1-sha1", :"diffie-hellman-group-exchange-sha1"]],
prepend: [public_key: [:"ssh-rsa", :"ssh-dss"]]
]
)
{:ok, chn} = :ssh_connection.session_channel(ssh_pid, 5000)
_success = :ssh_connection.exec(ssh_pid, chn, 'show ssh', 5000)
# for _ <- 0..1 do
receive do
{:ssh_cm, ^ssh_pid, value} -> IO.inspect(value)
after
5000 ->
IO.puts(:stderr, "No message in 5 seconds")
end
:ok = :ssh.close(ssh_pid)
end
The response I get is this, for every command, no matter what command I send.
iex(20)> FibreTestUi.Ssh.send_command
{:data, 0, 0,
<<2, 83, 67, 80, 58, 32, 83, 67, 80, 32, 83, 101, 114, 118, 101, 114, 32, 83,
101, 114, 118, 105, 99, 101, 32, 105, 115, 32, 100, 105, 115, 97, 98, 108,
101, 33, 10>>}
So it seems to be something specific to this device, but I can’t really work out what that would be. Anyone got any thoughts?