我正在尝试构建一个 Windows 批处理文件,它启动带有端口转发的 putty/plink,而不执行其他任何操作。到目前为止,Windows 部分已准备就绪:
start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]
由于我不想允许在身份验证后执行其他命令,因此我使用ForceCommand
声明Match User
:
Match User sampleUser
ForceCommand echo 'Success! Close this window to log out.'
问题是,运行我的批处理文件可以正确启动腻子,但是在执行回显我指定的文本后它会立即关闭。
我的想法是使用这样的东西:
ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC
这样,putty/SSH 应该保持连接活跃并且不会退出我的端口转发。
我想到过像 或 这样的命令yes
,ping
但read
它们
- 向我的终端窗口发送垃圾邮件
- 正在执行某些操作/产生不必要的 CPU 负载
- 如果有人按下 Enter 键,可能会意外关闭
是否有一个命令永远不执行任何操作,直到有人使用 Ctrl+C 终止它或通过关闭 putty 窗口来关闭 SSH 连接?
我该用它做什么waitTillControlC
?
答案1
我不明白为什么所有其他回复都想在这里使用循环,睡眠能够等待足够长的时间以用于任何实际目的,并且不会使用任何时钟周期来执行此操作。
例如,它会尝试在这里沉睡可疑的一百年,并且无论如何都会尽力满足请求:
echo "Something"; sleep 36500d
或者,这也应该被阻止,直到您键入以下Enter命令:
echo "Something"; read foo
答案2
答案3
这应该永远处于休眠状态而不会消耗任何(明显的)CPU 能力。
echo "Something" && while true; do sleep 9999; done
我也不确定您是否可以像ForceCommand
子句中那样给出命令。您可能需要将命令放在 shell 脚本中。
#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done
这个脚本当然应该放在某个地方并具有权限,使得服务器上的普通用户无法对其进行写入。
Match User sampleUser
ForceCommand /usr/bin/waitforever
编辑
我发现了一个看起来更优雅的命令:
echo "Something" && tail -f /dev/null
tail -f
等待文件或流返回字节。(否则可用于实时查看日志。)/dev/null
永远不会返回字节。因此该命令将永远处于休眠状态。
答案4
您正在尝试从错误的角度解决这个问题。您不希望 shell 不退出,而是希望 putty 让窗口保持打开状态。
http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit- 准确描述您需要更改的内容。如果您想使用“仅在干净退出时”选项,只需exit 1
在 ForceCommand 末尾添加即可。
编辑:我误解了;您只想维护转发的端口,而不想保留 ForceCommand 的输出。在这种情况下,http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell做你想做的事?