From b3c6852d2d716580b79c41c84f3d087b86b93d10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= <lhoguin@vmware.com>
Date: Mon, 27 Feb 2023 15:27:32 +0100
Subject: [PATCH] Fix rabbitmq-diagnostics remote_shell for 26.0 (#7441)

(cherry picked from commit 74ce1a4bccfb4735d3f395e3556c8763d2a4cc64)
(cherry picked from commit e3a356473a1ae351831da0df3ada10316079bbf2)
---
 .../commands/remote_shell_command.ex          | 24 ++++++++++++-------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex b/deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex
index 1d4726bc61a5..231b09c3ff19 100644
--- a/deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex
+++ b/deps/rabbitmq_cli/lib/rabbitmq/cli/diagnostics/commands/remote_shell_command.ex
@@ -6,19 +6,27 @@
 
 defmodule RabbitMQ.CLI.Diagnostics.Commands.RemoteShellCommand do
   @behaviour RabbitMQ.CLI.CommandBehaviour
+  @dialyzer :no_missing_calls
 
   use RabbitMQ.CLI.Core.MergesNoDefaults
   use RabbitMQ.CLI.Core.AcceptsNoPositionalArguments
 
   def run([], %{node: node_name}) do
-    _ = Supervisor.terminate_child(:kernel_sup, :user)
-    Process.flag(:trap_exit, true)
-    user_drv = :user_drv.start(['tty_sl -c -e', {node_name, :shell, :start, []}])
-    Process.link(user_drv)
-
-    receive do
-      {'EXIT', _user_drv, _} ->
-        {:ok, "Disconnected from #{node_name}."}
+    _ = :c.l(:shell)
+
+    if :erlang.function_exported(:shell, :start_interactive, 1) do
+      :shell.start_interactive({node_name, :shell, :start, []})
+      :timer.sleep(:infinity)
+    else
+      _ = Supervisor.terminate_child(:kernel_sup, :user)
+      Process.flag(:trap_exit, true)
+      user_drv = :user_drv.start(['tty_sl -c -e', {node_name, :shell, :start, []}])
+      Process.link(user_drv)
+
+      receive do
+        {'EXIT', _user_drv, _} ->
+          {:ok, "Disconnected from #{node_name}."}
+      end
     end
   end