예제 #1
0
        /// <summary>
        /// Bind shell to terminal/console
        /// </summary>
        /// <returns></returns>
        public static async Task BindAsync(this ISecureShell shell,
                                           bool forceVTerm, CancellationToken ct)
        {
            var win     = IsWindowsAnniversaryEdition(forceVTerm);
            var inMode  = ~0u;
            var outMode = ~0u;

            if (IsWindowsAnniversaryEdition(forceVTerm))
            {
                EnableVtermOnWindows10AnniversaryEdition(
                    out inMode, out outMode);
            }
            var ctrlC = Console.TreatControlCAsInput;

            Console.TreatControlCAsInput = true;
            using (var input = Console.OpenStandardInput())
                using (var output = Console.OpenStandardOutput()) {
                    await shell.BindAsync(input, output,
                                          Console.WindowWidth, Console.WindowHeight,
                                          Console.BufferWidth, Console.BufferHeight, ct);
                }
            Console.TreatControlCAsInput = ctrlC;
            if (inMode != ~0u && outMode != ~0u)
            {
                RestoreConsoleModes(inMode, outMode);
            }
        }
예제 #2
0
 /// <summary>
 /// Shell into simulation
 /// </summary>
 /// <param name="shell"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 private static async Task RunTerminalAsync(ISecureShell shell,
                                            CliOptions options)
 {
     if (shell == null)
     {
         throw new ArgumentException("Must login first");
     }
     var cts = new CancellationTokenSource(
         options.GetValueOrDefault("-t", "--timeout", -1));
     await shell.BindAsync(cts.Token);
 }