我一直在尝试plink.exe
(从 PuTTY 制造商处)建立到远程站点的本地 SOCKS 代理以及一些隧道。
行动只是plink.exe
从正确的参数开始。没有问题。
条件将开始与可用的网络连接联系起来,我认为这是合理的。
然后我也将其设置为:
- 允许按需运行任务
- 错过预定的启动时间后尽快运行任务
- 如果任务失败,则每隔 [1 分钟] 重新启动一次
- 如果正在运行的任务没有按要求结束,则强制停止
现在,这一切在系统启动时都运行正常。然而,当我让机器进入睡眠状态并再次唤醒它时,一切却失败了。
事实上,在唤醒后,plink.exe
控制台窗口仍然可见,但消失了(可能是因为睡眠前的 SSH 会话长时间超时)。但是,任务的状态仍然列为跑步虽然它显然已经消失了(例如,如果我使用CreateProcess
,我会收到该过程已消失的通知)。
状态意味着我必须明确结尾然后明确地跑步再次。
有人知道一种方法,让我能够告诉计划任务,当进程消失时,它应该重新启动该作业吗?我不知道确切的指标是什么,但很明显跑步我观察到的状态是假的。
这个想法是,plink.exe
当 SOCKS 代理关闭时,它会重新启动(从而重新建立 SOCKS 代理)。无论是在启动并尝试连接失败后,还是在将机器从睡眠状态唤醒后。
注意:我正在寻找一种可以在 Windows 7 上运行的解决方案和Windows 10。
根据评论中的建议,以下两个设置已被更改:
答案1
我是 plink/ssh 的重度用户,并且使用其 SOCKS5 代理和端口转发功能。以下是我的想法:
仅依靠 plink.exe 进程的状态来确定 SOCKS5 代理或任何 SSH 端口转发的连接性会很困难。有时,您的 SSH 连接可能因任何随机原因而中断,但 plink.exe 将无法检测到它并继续“运行”。
为了确保您的 SOCKS5 端口转发仍然有效,我将监控本地SOCKS5代理端口。这是您使用浏览器连接到的端口,以便使用代理(plink CLI -D 8008
)。一旦 plink.exe 完成 SSH 握手,它将执行端口转发并监听您选择的本地端口(我之前示例中的 8008)。如果 SSH 连接不成功、崩溃、被拒绝、关闭或拒绝,SOCKS5 端口将不会打开并监听。在这种情况下,端口 8008 将不可用。
我有一个小型 PHP 脚本,它将尝试连接到该本地端口(8008):
function check_open_port($host, $port, $timeout)
{
$connection = @fsockopen($host, $port, $errno, $errstr, $timeout);
if (is_resource($connection))
{
fclose($connection);
return true;
}
else return false;
}
这几乎不会产生任何流量。而且用任何其他语言编写代码都很容易。
您也可以运行 curl 并查看是否可以通过 SOCKS5 代理从热门网站获得返回结果(会产生更多流量):
curl --socks5 127.0.0.1:8008 http://checkip.amazonaws.com/
因此,你可以设置第二个计划任务,每隔 X 分钟运行一次此监视脚本,如果出现错误,则终止 plink.exe 进程并重新启动(使用技能)。
您还可以编写一个脚本来启动 plink.exe,监视它并在需要时重新启动。要将 plink.exe 启动到后台(在 PHP 中),请使用执行 exec("psexec -d plink.exe")
。现在立即运行监控循环并确保端口转发的本地端口保持打开状态。
这一切听起来可能很复杂,但这是一个非常可靠的解决方案。它可以与任何类型的 ssh 端口转发(不仅仅是 SOCKS5)配合使用。在过去的 5 年里,我已经进行了许多设置,以使所有这些工作可靠……我认为你不能仅使用计划任务和 plink 来做到这一点。
我还使用了 klink.exe (KiTTY) 而不是 plink.exe,后者是 PuTTY 的一个分支。它为您提供了更多选项来自动化该过程。