C# 多跳 SSH(SSH 通过 SSH)

C# multi-hop SSH (SSH through SSH)

我编写了一个 C# 控制台程序,通过 SSH 从 A(Windows 10,控制台 C# 应用程序)连接到 B(Linux 服务器),然后从那里连接到 C(Linux 服务器),但我无法从 B 连接到 C(从 A 到 B 可以)。 当我通过 Windows 终端从 A 连接到 B 以及从 B 的终端连接到 C 时,它工作正常,所以我证明我的凭据没问题。

知道问题出在哪里吗?

提前致谢,

我想在这里总结一下我是如何借助从网上和@jeb 收集的一些有价值的提示来解决这个问题的:

打开一个cmd.exe控制台,输入ssh userC@hostC -p portC-J userB@hostB - p portBportBportC可以省略,如果它们是默认端口22)然后你会被提示依次输入 passwordBpasswordC。 如果连接成功,您将进入 hostC 控制台,并设法执行您想要执行的任何操作。

您需要的代码是:

static void RunSshHop(params string[] cmds)
{
    try
    {
        using (Process p = new Process())
        {
            p.StartInfo = new ProcessStartInfo("cmd.exe")
            {
                RedirectStandardInput = true,
                UseShellExecute = false,
                //WorkingDirectory = @"d:\" // dir of your "cmd.exe"
            };

            p.OutputDataReceived += p_DataReceived;
            p.ErrorDataReceived += p_DataReceived;

            p.Start();

            // way 1: works
            foreach (var e in cmds)
                p.StandardInput.Write($"{e}\n"); // cannot use 'WriteLine' because Windows is '\r' and Linux is '\n'

            /* way 2: works as well
            using (var sw = p.StandardInput)
            {
                foreach (var e in cmds)
                    if (sw.BaseStream.CanWrite)
                        sw.Write($"{e}\n"); // cannot use 'WriteLine' because Windows is '\r' and Linux is '\n'
            }
            //*/

            p.WaitForExit();

            if (p.HasExited)
            {
                Console.WriteLine($"ExitCode: {p.ExitCode}");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

你可以这样称呼它:

static void Main(string[] args)
{
    RunSshHop(
       "ssh userC@hostC -p portC-J userB@hostB - p portB",
       "pwd",
       //"...",
       "ls"
    );
}

为避免为每个主机输入密码,您还可以创建一个 SSH 密钥对,如下所示:

  • 打开cmd.exe控制台
  • 输入ssh-keygen -t rsa
  • 选择要生成的 public 和私钥的保存路径(按 enter 使用默认目标)
  • 复制目的地,稍后您将需要它来取回您的密钥:-)
  • 要管理自动化流程,您必须将 passphrase 留空 - 生成密钥后,通过 ssh 登录第一台主机,例如 ssh youruser@firsthost -p hostport(如果端口是默认端口 22,则 -p hostport 部分可以忽略)
  • 输入ssh-copy-id youruser@firsthost -p hostport
  • 接受
  • 为第二个主机重复该过程