private SysDiag.ProcessStartInfo CreatePlinkProcessStartInfo( string smuxiHostname, int smuxiPort, int remotingPort, string sshProgram, string sshUsername, string sshPassword, string sshKeyfile, string sshHostname, int sshPort) { Trace.Call(sshProgram, sshUsername, "XXX", sshKeyfile, sshHostname, sshPort); string sshArguments = String.Empty; // don't ask for SSH key fingerprints // TOO NASTY! //sshArguments += " -auto_store_key_in_cache"; // no interactive mode please sshArguments += " -batch"; // don't execute a remote command sshArguments += " -N"; // HACK: force SSH to always flush the send buffer, as needed by // .NET remoting just like the X11 protocol sshArguments += " -X"; if (String.IsNullOrEmpty(sshUsername)) { throw new ApplicationException(_("PuTTY / Plink requeries a username to be set.")); } sshArguments += String.Format(" -l {0}", sshUsername); if (!String.IsNullOrEmpty(sshPassword)) { sshArguments += String.Format(" -pw {0}", sshPassword); } if (sshPort != -1) { sshArguments += String.Format(" -P {0}", sshPort); } // ssh tunnel sshArguments += String.Format(" -L 127.0.0.1:{0}:{1}:{2}", smuxiPort, smuxiHostname, smuxiPort); // ssh back tunnel sshArguments += String.Format(" -R {0}:127.0.0.1:{1}", remotingPort, remotingPort); // ssh host sshArguments += String.Format(" {0}", sshHostname); SysDiag.ProcessStartInfo psi = new SysDiag.ProcessStartInfo(); psi.FileName = sshProgram; psi.Arguments = sshArguments; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; return psi; }
private SysDiag.ProcessStartInfo CreateOpenSshProcessStartInfo( string smuxiHostname, int smuxiPort, int remotingPort, string sshProgram, string sshUsername, string sshPassword, string sshKeyfile, string sshHostname, int sshPort) { Trace.Call(sshProgram, sshUsername, "XXX", sshKeyfile, sshHostname, sshPort); string sshArguments = String.Empty; // don't ask for SSH key fingerprints // TOO NASTY! //sshCommand += " -o StrictHostKeyChecking=no"; // exit if the tunnel setup didn't work somehow sshArguments += " -o ExitOnForwardFailure=yes"; // run in the background (detach) // plink doesn't support this and we can't control the process this way! //sshArguments += " -f"; // don't execute a remote command sshArguments += " -N"; // HACK: force SSH to always flush the send buffer, as needed by // .NET remoting just like the X11 protocol sshArguments += " -X"; if (!String.IsNullOrEmpty(sshUsername)) { sshArguments += String.Format(" -l {0}", sshUsername); } if (!String.IsNullOrEmpty(sshPassword)) { // TODO: pass password, but how? } if (sshPort != -1) { sshArguments += String.Format(" -p {0}", sshPort); } // ssh tunnel sshArguments += String.Format(" -L 127.0.0.1:{0}:{1}:{2}", smuxiPort, smuxiHostname, smuxiPort); // ssh back tunnel sshArguments += String.Format(" -R {0}:127.0.0.1:{1}", remotingPort, remotingPort); // ssh host sshArguments += String.Format(" {0}", sshHostname); SysDiag.ProcessStartInfo psi = new SysDiag.ProcessStartInfo(); psi.FileName = sshProgram; psi.Arguments = sshArguments; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; return psi; }