Запуск команды командной строки из C # не работает - PullRequest
0 голосов
/ 16 мая 2019

Есть много примеров того, как запускать команды командной строки из c #.Например, это отличный пример:

https://stackoverflow.com/a/32872174/637142

Мне нужно запустить эту команду Linux из c #:

rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/

Вы можете пропустить эту часть:

WSL означает «Подсистема Windows для Linux» https://docs.microsoft.com/en-us/windows/wsl/install-win10.Это приложение для Windows позволяет вам установить Ubuntu на компьютер с Windows.Для того, чтобы установить его, вы должны WSL на Windows.Этот ответ объясняет, как: https://stackoverflow.com/a/36465000/637142.После включения WSL вы можете установить Ubuntu из магазина приложений Windows.

rsync - это команда, которую я использую в Ubuntu для синхронизации файлов между двумя компьютерами.Если я открываю приложение Ubuntu в Windows и запускаю rsync -av -e 'ssh -i /root/key.rsa' /root/sourceDir/ root@someDomain.com:/root/destDir, он запрашивает у меня пароль, и синхронизация завершается отлично.

Это отличная ссылка, которая объясняет, как запускать команды wsl в Windows: https://devblogs.microsoft.com/commandline/a-guide-to-invoking-wsl/

Буду признателен, если кто-нибудь скажет мне, что я делаю неправильно.В любом случае, вот что я делаю: * Чтобы это работало, вы должны нацелиться на x64 **

  1. Сначала убедитесь, что моя команда работает.Если я открою свое приложение для Windows с Ubuntu и запусту rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/, оно прекрасно работает!

  2. Теперь я должен сделать это без Ubuntu, поэтому я открываю командную строку и набираюта же команда, но с wsl в начале.wsl rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/ Вот доказательство: enter image description here Если я затем введу пароль, синхронизация работает отлично!

  3. Теперь наступает момент, когда я хочу это сделатьиз C #.Вот рабочее решение с более простой командой: https://stackoverflow.com/a/56159293/637142

  4. Теперь я готов выполнить настоящую команду из c #!И это не работает.Почему?

          var cmd = @"wsl rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/";
    
            using (var proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = @"cmd.exe",
                    //Arguments = cmd,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    RedirectStandardInput = true,
                    CreateNoWindow = true,
                    WorkingDirectory = @"C:\Users\Antonio"
                }
            })
            {
                proc.Start();
    
    
                // send command
                proc.StandardInput.WriteLine(cmd);
                proc.StandardInput.Flush();
    
                // wait
                System.Threading.Thread.Sleep(500);
    
                // send password
                proc.StandardInput.WriteLine("MyPassword!");
                proc.StandardInput.Flush();
                proc.StandardInput.Close();
    
                // wait for sync to complete
                proc.WaitForExit();
                Console.WriteLine(proc.StandardOutput.ReadToEnd());
            }
    

Я даже не могу получить часть, где он запрашивает пароль

...