LinuxサーバーへのSSHトンネルが常に2つあるようにWindowsコンピューターをセットアップしようとしています。
現在、PuTTYを使用して2つのSSHトンネルを開いています。PuTTYでサーバーにログインし、最小化したままにして、決して触れないようにします。 SSH接続が切断された場合を除いて、これは適切に機能します。PuTTYはエラーメッセージを表示し、手動でエラーを閉じてサーバーに再接続する必要があります。
私がやりたいのは、2つのSSHトンネルをセットアップでき、パスワードの入力など手動で何もしなくても自動的に再接続できるアプリケーションです。 2つのトンネルを介して送信するデータはVNC接続であるため、エラーをクリアしてパスワードを入力するためにマシンにアクセスすることはあまりありません。 2つのトンネルは、1つのローカルトンネルと1つのリモートトンネルです。
(はい、SSHに自動的にログインすることの危険性を認識しています。私は特権のない専用ユーザーを作成し、対話的にログインすることを許可されないようにし、それを使用することを計画しています。)
私はこの質問を見つけました: SSHトンネルを確実に開いたままにする方法は? ですが、これはSSHクライアントとしてLinuxを使用しており、Windowsを使用しています。
試してみてください Bitvise Tunnelier -私にとってはうまくいきます。トレイアイコンとしてのみ表示されている間にSSHトンネルを確立するように設定しました。起動時にSSH接続を確立し、切断後またはシステムがスリープ状態になった後に接続が復元されるとすぐに、SSH接続を再確立します。私はまだPuTTYコンソールの外観を好むので、それを使い続けていますが、トンネルを維持するために、現在はTunnelierを使用しています。私が見つけた唯一の主な欠点は、PuTTYがユーザーのアクションを必要とせずに提供するIPv6サポートの欠如です。
MyEnTunnel を試してください。接続障害時に再接続できます。
私はSSHトンネルマネージャーのような多くのソリューションを試しましたが、すべてが私にとって不便でした:構成画面が多すぎて、バグが発生することがありました(SSHトンネルマネージャーが一度にすべてを削除しました!持っていた設定をすべて削除しました!したがって、30のトンネルすべての設定を復元する必要がありました)。だから彼らはみんな私の信頼を失った。だからこそ、簡単に構成でき、変更可能で、小さいながらも機能するカスタムPowershellスクリプトを思いつきました。投稿 ここ 以下:
それを使い始めるには、このような設定が必要です:
# LocalPort TargetHost TargetPort SshHost SshUsername SshKeyPath
18080 google.com 80 bastion.example.com User D:\secure\path\to\private_key.ppk
Config.csvとして保存します。そして、それを維持するためにPowerShellスクリプトを使用します:
<#
.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();
}
}
}
設定したら、次のように実行します。
powershell -File autossh.ps1
Xshell をご覧ください。PuTTYよりもスクリプト化が可能で、家庭での使用は無料です(使用する必要がある場合)。自動再接続機能があると言われていますが、私はそれを試したことがなく、Linuxベースのラップトップを使い始めて数ヶ月になります。そのため、moでテストする手段はありません。
2つの優れたツール:
どちらにもこれらの機能があります。
1。 Mobaxterm
サイト: http://mobaxterm.mobatek.net/
キャプチャー :
2。 SSHトンネルマネージャー
サイト: https://code.google.com/archive/p/ssh-tunnel-manager/
キャプチャー :
PuTTYのファンなら、 PuTTYトレイ を試してみてください。
これには、接続障害後に自動再接続を試行したり、コンピューターがスタンバイから復帰したときに再接続したりするなど、いくつかの追加機能があります。
他の誰かがすでに述べたように、これをパスフレーズなしの公開鍵認証と組み合わせます。
理論的にはこれはかなり信頼できるはずですが、私はセキュリティの専門家ではないので、その点についてアドバイスすることはできません。
私はPuTTYも使用しましたが、より良い解決策が見つかるまで同じ問題が発生しました-ADVSoft Persistent SSHを試してください https://persistentssh.com Windowsサービスとして機能し、SSHトンネルを実行状態に保ちます。個人使用は無料で、他に何もインストールする必要はありません。
私はそれをググって、あなたの質問のいくつかの結果を得ました、基本的にあなたはいつも私がやったautomate PuTTY login
の検索コンボを試すことができました。ここにあなたに合うはずの特に有用な結果があります:
http://www.neox.net/w/2008/04/22/PuTTY-auto-login-macro-PuTTY-connection-manager/
PuTTYのマクロを設定する方法について説明します。また、PuTTY接続マネージャーをここからダウンロードします(リンクが最初のリンクから壊れているため)。