通过bat文件从Windows重新启动远程Linux设备(Pi型设备)

问题描述 投票:0回答:1

我一直在尝试使用 C# 按以下方式从 Windows 重新启动 Linux 板。如果我通过 API 执行 C# 函数,则不会发生任何情况,但如果我通过双击执行 bat 文件,我会看到设备重新启动。可能是什么问题?

log.Info("Rebooting Pi " + ip );
string path = @"C:\data\rebootpi.bat";
if (File.Exists(path))
{
    File.Delete(path);
}
using (StreamWriter w = new StreamWriter(path))
{
    w.WriteLine("@echo off");
    String s = string.Format("plink -batch root@{0} -pw secret_pass /sbin/reboot", ip);
    w.WriteLine(s);
    w.Close();
}

try
{
    System.Diagnostics.Process proc2 = new System.Diagnostics.Process();
    proc2.StartInfo.WorkingDirectory = @"C:\data\";
    proc2.StartInfo.FileName = @"C:\data\rebootpi.bat";
    bool b = proc2.Start();
    log.Info("Rebooting Pi  = " + b);
    proc2.WaitForExit();
}
catch (Exception ex)
{}
c# linux
1个回答
0
投票

您不需要 MS-DOS 批处理文件。您正在尝试使用

plink
,因此应使用
Process
来启动该程序。无论如何,在 .NET Core 中,您不能仅使用文档的路径来通过其注册的应用程序来运行它。

假设

plink
在 PATH 中,您可以使用 :

Process.Start("plink.exe",$"-batch root@{ip} -pw secret_pass /sbin/reboot");

或者,为了让事情更清楚:

string args=$"-batch root@{ip} -pw secret_pass /sbin/reboot";

var proc=Process.Start("plink.exe",args);
proc.WaitForExit();

不要使用

catch{}
来隐藏错误。在这种情况下,如果
plink.exe
不在路径上,则可能会出现异常,在这种情况下,您需要更改路径或使用工具的绝对路径。

您可以使用 stdout 或 stderr 重定向读取

plink
的实际输出,例如:

  var pInfo = new ProcessStartInfo {
      FileName = "plink.exe",
      Arguments=args,
      RedirectStandardError = true
  };  
  var p=Process.Start(pInfo);

  string output = p.StandardError.ReadToEnd();  
  p.WaitForExit();

  Console.WriteLine($"\nError stream: {output}");
© www.soinside.com 2019 - 2024. All rights reserved.