关于如何从c#运行命令提示符命令的例子很多。例如,这是一个很好的例子:
https://stackoverflow.com/a/32872174/637142
我需要从c#运行此linux命令:
rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/
您可以跳过此部分:
WSL代表“ Linux的Windows子系统” https://docs.microsoft.com/en-us/windows/wsl/install-win10。该Windows应用程序使您可以在Windows计算机上安装Ubuntu。为了安装它,您必须在Windows上使用WSL。该答案说明了如何:https://stackoverflow.com/a/36465000/637142。启用WSL后,您可以从Windows应用商店中安装Ubuntu。
rsync是我在ubuntu上使用的命令,用于在两台计算机之间同步文件。如果我在Windows上打开Ubuntu应用程序并运行
rsync -av -e 'ssh -i /root/key.rsa' /root/sourceDir/ root@someDomain.com:/root/destDir
,它会要求我输入密码,那么同步就很好了。这是一个很棒的链接,它解释了如何在Windows上运行wsl命令:https://devblogs.microsoft.com/commandline/a-guide-to-invoking-wsl/
如果有人能告诉我我做错了,我将不胜感激。无论如何,这就是我在做什么: *要使其正常工作,您必须定位x64 **
首先确保我的命令有效。如果我打开ubuntu Windows应用程序,然后运行rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/
,那么效果很好!
现在,我必须在没有Ubuntu的情况下执行,因此我打开命令提示符并键入相同的命令,但开头应使用wsl
。 wsl rsync -av -e 'ssh -i /root/k/ws.k' /mnt/c/GIT/Ublux root@ws.ublux.com:/ublux/
以下是证明:
如果再输入密码,同步效果会很好!
现在是我想从C#中执行此操作的部分。这是使用更简单命令的可行解决方案:https://stackoverflow.com/a/56159293/637142
现在,我准备从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());
}
我什至无法找到要求输入密码的部分