C # как я могу запустить Cygwin Scp и ввести пароль с помощью Process и StandardInputWriter? - PullRequest
0 голосов
/ 22 сентября 2011

С этим кодом я вижу окно входа в систему, запрашивающее пароль, но я не могу записать пароль в окно оболочки.

        Process scp = new Process();
        scp.StartInfo.FileName = @"c:\cygwin\bin\scp";
        scp.StartInfo.Arguments = "/cygdrive/c" + path + " " + username + "@" + ServerName + ":/cygdrive/c/Temp/.";
        scp.StartInfo.UseShellExecute = false;
        scp.StartInfo.RedirectStandardOutput = true;
        scp.StartInfo.RedirectStandardError = true;
        scp.StartInfo.RedirectStandardInput = true;
        scp.Start();

        //I've tried this with no success:
        using (StreamWriter sw = scp.StandardInput)
        {
            if (sw.BaseStream.CanWrite)
            {
                sw.WriteLine(pass);
            }
        }
        // Another failed attempt:
        scp.StandardInput.Write(pass + Environment.NewLine);
        scp.StandardInput.Flush();
        Thread.Sleep(1000);

Я знаю, что могу заставить это работать с ожидаемым cygwinно лучше использовать c # для взаимодействия с вводом / выводом Windows.

Ответы [ 2 ]

1 голос
/ 18 июля 2014

Попробуйте это:

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    Process scp = new Process();
    scp.StartInfo.FileName = @"c:\cygwin\bin\scp";
    scp.StartInfo.Arguments = "/cygdrive/c" + path + " " + username + "@" + ServerName + ":/cygdrive/c/Temp/.";
    scp.StartInfo.UseShellExecute = false;
    scp.StartInfo.RedirectStandardOutput = true;
    scp.StartInfo.RedirectStandardError = true;
    scp.StartInfo.RedirectStandardInput = true;
    scp.Start();

    Process[] p = Process.GetProcessesByName("cmd");
    SetForegroundWindow(p[0].MainWindowHandle);
    SendKeys.SendWait(pass);

    scp.WaitForExit();

РЕДАКТИРОВАТЬ: Не забудьте включить \n в конце pass.

0 голосов
/ 22 сентября 2011

этот код работает нормально, как и ожидалось, и нет необходимости вызывать Flush или Sleep:

Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "cmd.exe";
info.RedirectStandardInput = true;
info.UseShellExecute = false;

p.StartInfo = info;
p.Start();

using (StreamWriter sw = p.StandardInput)
{
    if (sw.BaseStream.CanWrite)
    {
        sw.WriteLine("dir");
    }
}

Вы 100% уверены, что ваш cygwin просто ждет pwd?

...