Автоматизиране на 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