Linux 中是否有等待终止的命令?

stu*_*net 11 linux ssh terminal bash putty

我正在尝试构建一个 Windows 批处理文件,它以端口转发启动 putty/plink,仅此而已。到目前为止,Windows 部分已准备就绪:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1
Run Code Online (Sandbox Code Playgroud)

因为我不希望允许执行身份验证之后其他命令,我使用ForceCommandMatch User声明:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'
Run Code Online (Sandbox Code Playgroud)

问题是,运行我的批处理文件会正确启动 putty,但在执行回显我指定的文本后它会立即关闭。

我的想法是使用这样的东西:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC
Run Code Online (Sandbox Code Playgroud)

这样,putty/SSH 应该保持连接有效并且不会退出我的端口转发。

我想过像yes, pingor 之类的命令read,但它们

  • 正在向我的终端窗口发送垃圾邮件
  • 实际上是在做事/产生不必要的 CPU 负载
  • 可能会意外关闭,如果有人按 Enter

是否有一个命令永远不会做任何事情,直到有人用 Ctrl+C 终止它或通过关闭腻子窗口来关闭 SSH 连接?

我应该用来做waitTillControlC什么?

jll*_*gre 14

我不明白为什么所有其他回复都想在这里使用循环,睡眠能够为任何实际目的等待足够长的时间,并且不会使用任何时钟周期。

例如,它会尝试在这里沉睡 100 年,并且可能会做足够的事情来满足请求:

echo "Something"; sleep 36500d
Run Code Online (Sandbox Code Playgroud)

或者,这也应该阻止,直到您键入Enter密钥:

echo "Something"; read foo
Run Code Online (Sandbox Code Playgroud)


che*_*ner 9

-N改为尝试该选项。从plink文档

-N        don't start a shell/command (SSH-2 only)
Run Code Online (Sandbox Code Playgroud)

这与sshoption 的行为相同-N,如手册页中所述

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。其他人说如何制定解决方法,但这个人说如何*正确*。 (2认同)

nit*_*k01 8

这应该永远休眠而不消耗任何(明显)数量的 CPU 功率。

echo "Something" && while true; do sleep 9999; done
Run Code Online (Sandbox Code Playgroud)

我也不确定你是否可以在ForceCommand子句中给出一个命令。您可能需要将命令放在 shell 脚本中。

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done
Run Code Online (Sandbox Code Playgroud)

这个脚本当然应该放在一个地方并且有权限,这样服务器上的普通用户就不能写入它。

Match User sampleUser
    ForceCommand /usr/bin/waitforever
Run Code Online (Sandbox Code Playgroud)

编辑

我找到了一个看起来更优雅的命令:

echo "Something" && tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

tail -f等待文件或流返回字节。(否则对于实时查看日志很有用。)/dev/null永远不会返回字节。因此该命令将永远休眠。