2

我正在使用 c# 中的 plink 连接到 Linux 服务器并运行一些程序。c# 控制台程序和 plink.exe 都在同一台 windows 机器上。

问题是当我第一次连接到 Linux 服务器时,plink 会询问我是否要接受并存储来自 Linux 服务器的 SSH 密钥。我总是想对此做出回应,因为所有服务器都在我的局域网中,并且没有安全问题。

我正在使用 c# Process 类型,将正确的参数传递给 plink,重定向输出并启动。现在问题是当plink提示时,process.StandardOutput.ReadToEnd(); 挂起,我无法弄清楚 plink 是否提示我接受密钥或实际登录到 Linux 服务器。

        string output = string.Empty;
        string error = string.Empty;
        string arguments = @" -ssh -pw password root@12.12.12.12 ./Install_xxx.bin";

        using (Process process = new Process())
        {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "plink";
            psi.Arguments = arguments;
            psi.ErrorDialog = false;
            psi.UseShellExecute = false;
            psi.RedirectStandardError = true;
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.CreateNoWindow = true;

            process.StartInfo = psi;
            process.Start();

            output = process.StandardOutput.ReadToEnd();
            error = process.StandardError.ReadToEnd();
        }

谢谢

4

3 回答 3

1

与其使用外部可执行文件来建立 SSH 连接,为什么不使用 SSH 库并通过代码(更可靠)来实现呢?

sharpSsh这里是最新版本)是 Jsch 的 C# 端口,Jsch 是一个 BSD 许可的 Java 库。我在我的 C# 项目中非常成功地使用了它;您将能够以编程方式处理 SSH 连接的所有方面,包括密钥协商。

于 2011-03-17T19:12:09.760 回答
1

Process文档中解释了您的死锁问题。当进程等待输入时,它不能关闭标准输入,所以它会阻塞。StandardOutput 不会关闭,因为该进程仍在等待您从 stdin 输入:死锁。您可以使用异步 api 逐行读取,也可以将其他流用于另一个线程。

于 2011-03-17T19:32:40.663 回答
0

为了通过 PLINK 无缝连接到远程服务器,第一次和以后的时间,您必须手动协调您的 SSH 密钥。即使用 PUTTYGEN 创建 PLINK 将使用的 .ppk 私钥文件,并将相应的公钥~/.ssh/authorized_keys预先存储在服务器上的文件中。

还需要协调sshd的主机密钥,所以使用PUTTYGEN生成一组私钥文件ssh_host_rsa_keyssh_host_dsa_key在下/etc/ssh(查看现有文件找出导出到哪些密钥格式),然后运行ssh-keygen -y -f /etc/ssh/ssh_host_rsa_key > /etc/ssh/ssh_host_rsa_key.pub创建对应的公钥文件(做同样的事情来创建ssh_host_dsa_key.pub文件)。

如果您想要 PLINK 到多个服务器,并且不介意使用相同的密钥连接到所有服务器(这将取决于您当地的 IT 安全策略),那么只需将相同的密钥文件复制到每台服务器上.

然后,在您使用 PLINK 的 Windows 机器上,使用 PUTTY 或 PLINK 手动连接到任何服务器,并以交互方式接受主机密钥。完成此操作后,PUTTY/PLINK 将该密钥存储在 Windows 注册表中的HKCU\Software\SimonTatham\PuTTY\SshHostKeys. 您会注意到类似的条目rsa2@22:hosthost您的服务器的主机名在哪里。

现在,对于该过程的关键,您需要将 REG_SZ 十六进制值复制0x23,...到您的 C# 应用程序中,您必须在其中手动使用类为使用相同命名方案Microsoft.Win32.RegistryKey的所有其他服务器写入此值,然后再使用rsa2@22:hostPLINK(你是否认为这个注册表值是安全敏感的取决于你,所以如果你必须在你的 C# 应用程序中以某种方式保护它)。

就像其他人提到的那样,您可能想要考虑使用 SSH 库来获得有关您的连接过程的更多编程反馈,但是要使用 PLINK,这是您需要做的。

于 2012-02-01T22:30:55.893 回答