我正在开发一个项目,将SFTP应用程序包装到实用程序库中,以便在内部公司项目中使用。我们公司使用Tectia,但我们也在寻找像WinSCP这样的其他库。我知道还有其他开源SFTP客户端,但我的公司坚持支持Tectia。我知道Tectia支持使用-B
开关的批处理文件,但我们希望库的使用者能够使用SFTP而无需学习语法并只使用.NET方法,所以我决定使用包装运行sftpg3
的交互式控制台。如果我将凭据作为命令行参数包含,我可以启动该过程,甚至可以成功登录。问题是我无法使用重定向的StandardInput
与流程进行交互。代码如下:
Process sftpproc = new Process();
sftpproc.StartInfo.FileName = @"sftpg3";
sftpproc.StartInfo.UseShellExecute = false;
sftpproc.StartInfo.RedirectStandardInput = true;
sftpproc.StartInfo.RedirectStandardOutput = true;
sftpproc.StartInfo.RedirectStandardError = true;
sftpproc.StartInfo.CreateNoWindow = true;
StringBuilder sb = new StringBuilder();
sftpproc.OutputDataReceived +=
(sender, args) => { sb.AppendFormat("INFO:{0}\n", args.Data); };
sftpproc.ErrorDataReceived +=
(sender, args) => { sb.AppendFormat("WARN:{0}\n", args.Data); };
sftpproc.Start();
sftpproc.BeginOutputReadLine();
sftpproc.BeginErrorReadLine();
StreamWriter input = sftpproc.StandardInput;
input.WriteLine("open USER@SERVER");
input.WriteLine("lcd D:\\");
input.WriteLine("get file.txt");
string messages = sb.ToString();
上面的代码与WinSCP命令行完美配合,或者直接在控制台中使用控制台命令。我尝试将sftpg3
的输出重定向到文本文件,并且能够重定向它,然后我尝试重定向输入控制台重定向(sftpg3 <cmd.txt
)并且无法执行命令(但是, -B
有效,但如上所述,这不是我所需要的)。有没有办法强制控制台应用程序从重定向的stdin
读取?从cmd.exe
调用该应用程序并不适合我。
答案 0 :(得分:1)
如果sftpg3 < cmd.txt
不起作用,则应用程序不会从标准输入读取。
无论你在哪里重定向。你根本无法采取这种方法。