Tự động đào hầm SSH từ Windows


32

Tôi đang cố gắng thiết lập một máy tính Windows để luôn có hai đường hầm SSH đến máy chủ Linux của mình.

Hiện tại, tôi đang sử dụng PuTTY để mở hai đường hầm SSH: Tôi đăng nhập vào máy chủ trong PuTTY, để nó được thu nhỏ và không bao giờ chạm vào nó. Điều này hoạt động tốt, ngoại trừ khi kết nối SSH giảm: PuTTY hiển thị thông báo lỗi và tôi cần đóng lỗi thủ công và kết nối lại với máy chủ.

Những gì tôi muốn làm là có một ứng dụng có thể thiết lập hai đường hầm SSH và có thể tự động kết nối lại mà không cần phải làm thủ công bất cứ điều gì, kể cả nhập mật khẩu. Dữ liệu tôi gửi qua hai đường hầm là các kết nối VNC, vì vậy tôi thường không có mặt ở máy để xóa lỗi và nhập mật khẩu. Hai đường hầm là một đường hầm địa phương và một đường hầm từ xa.

(Có, tôi nhận thức được các mối nguy hiểm khi tự động đăng nhập vào SSH. Tôi dự định tạo một người dùng chuyên dụng không có đặc quyền và không được phép đăng nhập tương tác và sử dụng điều đó.)

Tôi đã tìm thấy câu hỏi này: Làm thế nào để giữ một đường hầm SSH mở một cách đáng tin cậy? , nhưng đó là sử dụng Linux làm máy khách SSH và tôi đang sử dụng Windows.


2
Đăng nhập tự động không phải là một mối nguy hiểm nếu được thực hiện đúng. Tra cứu xác thực khóa công khai SSH .
grawity

Tôi hiện đang làm điều đó cho đăng nhập thủ công, nhưng tôi tin rằng PuTTY không cho phép khóa có mật khẩu trống.
David Yaw

Tất nhiên nó.
grawity

Tôi đã hiểu nhầm một số tài liệu PuTTY. Tôi có thể đọc "chúng tôi sẽ không bao giờ tự động nhập mật khẩu PuTTY cho bạn" và giả sử rằng mật khẩu cũng được yêu cầu trên khóa.
David Yaw

Câu trả lời:


14

Hãy thử Bitvise Tunnelier - nó hoạt động với tôi. Tôi đặt nó để thiết lập các đường hầm SSH trong khi chỉ hiển thị dưới dạng biểu tượng khay. Nó thiết lập kết nối SSH khi khởi động và thiết lập lại ngay khi kết nối được khôi phục sau khi bị cắt hoặc sau khi hệ thống chuyển sang chế độ ngủ. Tôi vẫn thích giao diện của giao diện điều khiển Putty, vì vậy tôi tiếp tục sử dụng nó - nhưng để giữ đường hầm, giờ tôi sử dụng Tunnelier. Nhược điểm lớn duy nhất tôi tìm thấy là thiếu hỗ trợ IPv6, mà Putty cung cấp mà không cần hành động của người dùng.


Tôi đã sử dụng điều này trong một vài tháng nay. Điều đó hoàn toàn đúng: ngồi trong khay hệ thống, tắt bất kỳ cửa sổ bật lên nào phàn nàn về việc ngắt kết nối và như vậy, và nó giữ cho các đường hầm mở. Tôi vẫn sử dụng PuTTY nếu tôi sẽ thực hiện nhiều công việc qua kết nối, nhưng đối với các đường hầm và công cụ đầu cuối nhanh, Tunnelier hoạt động tốt.
David Yaw

2
Có thể không rõ ràng, nhưng bạn đã thiết lập các đường hầm trong tab C2S và các đường hầm ngược trong tab S2C . Nó là viết tắt của client2serverserver2client , tương ứng.
fracz

@ Jean-Marc Liotier Có lẽ bạn có thể giúp tôi. Nhìn vào đây: superuser.com/questions/1353398/ khăn
Người thành công

@SuccessMan - Tôi xin lỗi, đã nhiều năm kể từ khi tôi sử dụng bất kỳ sản phẩm nào của Microsoft nhiều hơn bề ngoài. Bây giờ tôi là tất cả Debian, nơi loại vấn đề này được giải quyết một cách tầm thường ...
Jean-Marc Liotier


2

Hãy xem Xshell - nó có nhiều kịch bản hơn PuTTY và miễn phí khi sử dụng tại nhà (nếu đó là nơi bạn cần sử dụng). Nó tuyên bố có tính năng tự động kết nối lại nhưng tôi đã không dùng thử và đã sử dụng máy tính xách tay dựa trên Linux được vài tháng rồi nên không có cách nào để kiểm tra tính năng này.


Xshell thật tuyệt vời, tôi đã chuyển sang nó từ SecureCRT 3-4 năm trước và không nhìn lại
alexeit

2

Hai công cụ tuyệt vời:

Cả hai đều có những tính năng:

  • Có thể được tự động khi khởi động
  • Mã nguồn mở
  • Quản lý nhiều đường hầm cùng một lúc
  • Có thể nằm trong khay hệ thống
  • Miễn phí (Mobaxterm có phiên bản miễn phí)
  • Mã hóa mật khẩu được lưu trữ

1. Động cơ

Trang web: http://mobaxterm.mobatek.net/

Chụp:

nhập mô tả hình ảnh ở đây

2. Trình quản lý đường hầm SSH

Trang web: https://code.google.com.vn/archive/p/ssh-tunnel-manager/

Chụp:

nhập mô tả hình ảnh ở đây


2

Tôi đã thử nhiều giải pháp như trình quản lý đường hầm SSH, nhưng tất cả đều bất tiện cho tôi: quá nhiều màn hình cấu hình, đôi khi có lỗi (trình quản lý đường hầm SSH đã xóa tất cả! Tôi đã khôi phục cài đặt cho tất cả 30 đường hầm). Vì vậy, tất cả họ đã mất niềm tin của tôi. Đó là lý do tại sao tôi đưa ra kịch bản Powershell tùy chỉnh, cấu hình dễ dàng, có thể thay đổi, nhỏ, nhưng hoạt động. Đăng ở đây và dưới đây:

Để bắt đầu sử dụng, bạn cần một cấu hình như thế này:

# LocalPort TargetHost  TargetPort  SshHost SshUsername SshKeyPath 
18080   google.com  80  bastion.example.com User    D:\secure\path\to\private_key.ppk

Lưu nó dưới dạng config.csv. Và sử dụng một tập lệnh powershell để theo kịp nó là:

<#
.SYNOPSIS
  Powershell script for keeping ssh tunnel up and running

.DESCRIPTION
  This script uses configuration of tunnels located in config.csv. For more information visit http://tsherlock.tech/2019/03/13/simple-ssh-tunnel-auto-reconnect-using-putty-and-powershell/

.NOTES
  Version:        1.0
  Author:         Anton Shkuratov
  Creation Date:  2019-03-13
  Purpose/Change: Initial script development

#>

$currentDir = $PSScriptRoot
if (-not $env:PATH.Contains($currentDir)) {
  $env:PATH="$env:PATH;$currentDir"
}

# Check plink is accessible
try {
  Start-Process plink.exe -WindowStyle Hidden
} catch {
  Write-Host Error running plink.exe Please make sure its path is in PATH environment variable
  EXIT 1
}

# Parse config
$config = [System.IO.File]::ReadAllLines("$currentDir\config.csv");
$bindings = New-Object System.Collections.ArrayList
$regex = New-Object System.Text.RegularExpressions.Regex("(\d)+\s([^ ]+)\s(\d+)\s([^ ]+)\s([^ ]+)\s([^ ]+)", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase);
$keyPasswords = @{}
$procs = @{}

foreach($line in $config) {
  $match = $regex.Match($line)

  if ($match.Success) {
    $sshKey = $match.Groups[6];

    $bindings.Add(@{
      LocalPort = $match.Groups[1];
      TargetHost = $match.Groups[2];
      TargetPort = $match.Groups.Groups[3];
      SshHost = $match.Groups[4];
      SshUser = $match.Groups[5];
      SshKey = $match.Groups[6];
    });

    if (-not $keyPasswords.ContainsKey($sshKey)) {
      $pass = Read-Host "Please enter password for key (if set): $sshKey" -AsSecureString
      $keyPasswords.Add($sshKey, $pass);
    }
  }
}

# Starting Processes
function EnsureRunning($procs, $keyPasswords, $binding) {

  if ($procs.ContainsKey($binding) -and $procs[$binding].HasExited) {

    $proc = $procs[$binding]
    $sshKey = $binding.sshKey
    $out = $proc.StandardError.ReadToEnd()

    if ($out.Contains("Wrong passphrase")) {
      Write-Host "Wrong pass phrase for $sshKey, please re-enter"
      $pass = Read-Host "Please enter password for key: $sshKey" -AsSecureString
      $keyPasswords[$sshKey] = $pass;
    } else {
      $exitCode = $proc.ExitCode
      $tHost = $binding.sshHost

      Write-Host "Connection to $tHost is lost, exit code: $exitCode"
    }
  }

  if (-not $procs.ContainsKey($binding) -or $procs[$binding].HasExited) {
    $sshUser = $binding.SshUser
    $sshHost = $binding.SshHost
    $sshKey = $binding.SshKey
    $lPort = $binding.LocalPort
    $tPort = $binding.TargetPort
    $tHost = $binding.TargetHost
    $sshKeyPass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyPasswords[$sshKey]))

    $psi = New-Object System.Diagnostics.ProcessStartInfo;
    $psi.FileName = "plink.exe";
    $psi.UseShellExecute = $false;

    $psi.CreateNoWindow = $true;
    $psi.RedirectStandardInput = $true;
    $psi.RedirectStandardError = $true;

    $psi.Arguments = "-ssh $sshUser@$sshHost -i `"$sshKey`" -batch -pw $sshKeyPass -L $lPort`:$tHost`:$tPort"

    $proc = [System.Diagnostics.Process]::Start($psi);

    Start-Sleep 1

    if (-not $proc.HasExited) {
      Write-Host Connected to $sshUser@$sshHost
    }

    $procs[$binding] = $proc;
  }
}

function EnsureAllRunning($procs, $keyPasswords, $bindings) {
  while($true) {
    foreach($binding in $bindings) {
      EnsureRunning $procs $keyPasswords $binding
    }
    Start-Sleep 1
  }
}


try {
  # Waiting for exit command
  Write-Host Working... Press Ctrl+C to stop execution...
  EnsureAllRunning $procs $keyPasswords $bindings
} finally {
  # Clean up
  Write-Host Clean up

  foreach($proc in $procs.Values) {
    if ($proc -ne $null -and -not $proc.HasExited) {
      $proc.Kill();
    }
  }
}

Sau khi được cấu hình, chỉ cần chạy nó như sau:

powershell -File autossh.ps1

1

Nếu bạn là người hâm mộ của Putty, hãy thử dùng Putty Khay .

Nó có một vài chức năng bổ sung, bao gồm cố gắng tự động kết nối lại sau khi kết nối bị lỗi và kết nối lại khi máy tính của bạn thức dậy từ chế độ chờ.

Như đã được đề cập bởi người khác, tôi kết hợp điều này với xác thực khóa công khai không có cụm từ.

Về lý thuyết, điều này khá đáng tin cậy, nhưng tôi không phải là chuyên gia bảo mật nên không thể tư vấn cho bạn về mặt đó.


0

Tôi đã googled nó và gota một vài kết quả cho câu hỏi của bạn, về cơ bản bạn luôn có thể thử một kết hợp tìm kiếm automate putty loginmà tôi đã làm. Đây là một kết quả đặc biệt hữu ích phù hợp với bạn:

http://www.neox.net/w/2008/04/22/putty-auto-login-macro-putty-connection-manager/

Nó hướng dẫn bạn cách thiết lập macro cho putty. Đồng thời tải xuống trình quản lý kết nối Putty tại đây (vì liên kết bị hỏng từ liên kết ban đầu):

http://sourceforge.net/projects/puttycm/


Liên kết SourceForge cho PuttyCM bị hỏng. Xem câu hỏi này .
Craig McQueen

@CraigMcQueen, bạn có nhận ra rằng điều này đã được trả lời vào ngày 19/1/2011!? đúng?
Jakub

1
Vâng, tôi nhận ra. Và tôi đã tìm thấy nó trong một tìm kiếm Google ngày hôm qua, và những người khác có thể làm như vậy trong một hoặc hai năm tới.
Craig McQueen

0

Tôi cũng đã sử dụng Putty và gặp vấn đề tương tự cho đến khi tôi tìm thấy một giải pháp tốt hơn - Hãy thử ADVSoft Persistent SSH https://persistentssh.com hoạt động như một dịch vụ Windows và giữ cho các đường hầm SSH ở trạng thái chạy. Miễn phí cho sử dụng cá nhân, không cần phải cài đặt bất cứ điều gì khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.