Опитвам се да получа файл чрез 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";
без успех. Може ли някой да ме насочи в правилната посока?