Автоматизация передачи файлов Netcat из приложения C# — Windows и Raspberry Pi

Я пытаюсь получить файл через Netcat с сервера на базе Linux (Raspberry Pi).

На стороне отправителя (Raspberry Pi) я запускаю небольшой скрипт Python, который просто упаковывает некоторые файлы и отправляет их в конвейер. Это прекрасно работает и было протестировано много раз.

На стороне получателя (Windows 8.1 Pro) я использую Netcat для преобразования входящего потока в файл. Если я делаю это вручную в cmd.exe, все отлично работает:

nc -l -p <port> > C:\file.gz

Мой файл прибывает, как и планировалось. Однако, когда я пытаюсь автоматизировать этот процесс на стороне получателя с помощью скрипта C# (.Net 4.5), файл просто не приходит. Мой код выглядит так:

public void StartListeningToNetcat()
        {
            Process ncProcess = new Process();
            ncProcess.StartInfo.UseShellExecute = false;
            ncProcess.StartInfo.CreateNoWindow = false;
            ncProcess.StartInfo.RedirectStandardOutput = true;
            ncProcess.StartInfo.RedirectStandardInput = true;

            ncProcess.StartInfo.FileName = "cmd.exe";
            ncProcess.StartInfo.Arguments = @"C:\...\nc -l -p <port> > C:\file.gz";
            ncProcess.Start();
        }

Я знаю, что запуск nc через cmd.exe — это обходной путь, но прямой вызов netcat выглядит так:

            ncProcess.StartInfo.FileName = "C:\...\nc.exe";
            ncProcess.StartInfo.Arguments = @"-l -p <port> > C:\file.gz";

... возвращает ошибку: «>: прямой поиск хоста не удалось: h_errno 11001: HOST_NOT_FOUND». В любом случае, я был бы не против проигнорировать эту ошибку и пойти на «неэлегантный» способ вызова cmd.exe.

Предполагая, что Windows может быть мерой безопасности, чтобы запретить приложениям записывать входящие файлы на мой жесткий диск, я попытался отключить брандмауэр и использовать:

            ncProcess.StartInfo.Verb = "runas";

без успеха. Может ли кто-нибудь указать мне в правильном направлении?


person Heinz.Benjamin    schedule 03.07.2015    source источник


Ответы (1)


Я только что смог решить эту проблему сам:

Вместо выполнения «cmd.exe» с аргументами для запуска netcat или вызова самого Netcat я заранее создаю пакетный файл, который позже могу вызвать в своем сценарии C#.

public void StartListenToNetcat()
{
        string batchPath = CreateNetcatBatchFile();   
        Process.Start(batchPath);
}

public string CreateNetcatBatchFile()
{
        Streamwriter w = new StreamWriter("C:\runNC.bat");
        w.WriteLine("C:\...\nc -l -p 22 > C:\file.gz");
        w.Close();
        return "C:\runNC.bat";
}

И все же я не совсем понимаю необходимость этого обходного пути. Комментарии для уточнения были бы очень признательны.

person Heinz.Benjamin    schedule 03.07.2015