Linux中是否有一条命令等待被终止?


11

我正在尝试构建Windows批处理文件,该文件通过端口转发启动腻子/链接。到目前为止,Windows部分已准备就绪:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

由于我不想允许身份验证后执行其他命令,因此我使用ForceCommandMatch 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应该使连接保持活动状态,并且不会退出我的端口转发。

我想喜欢的命令yesping或者read,但他们

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

在有人用Ctrl + C终止它或通过关闭腻子窗口来关闭SSH连接之前,有没有永远不会做的命令?

我应该做什么用waitTillControlC


我发现了诸如superuser.com/questions/587629/…之类的问题,但这些问题会使用户拥有现成的外壳。
stuXnet

Answers:


13

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

例如,它将在这里尝试睡眠一百年,并且可能足以满足请求:

echo "Something"; sleep 36500d

另外,这也应该阻塞,直到您键入Enter密钥:

echo "Something"; read foo

9

尝试使用该-N选项。从plink文档中

-N        don't start a shell/command (SSH-2 only)

手册页所述,此行为与sshoption 相同:-N

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

2
这应该是公认的答案。其他人说如何解决,但是这说对了
Moshe Katz 2013年

感谢您的编辑;没有Windows框可以检查,我不认为可以在线查找plink文档。
chepner 2013年

这个答案不符合我的需求,因为I don't want to allow to execute other commands after authentication-N可以在客户端完成此操作,因此您只需删除-N即可在身份验证后执行其他命令。
stuXnet 2015年

8

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

echo "Something" && while true; do sleep 9999; done

我也不确定您是否可以像在ForceCommand子句中那样给出命令。您可能需要将命令放入外壳脚本中。

#!/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将永远不会返回字节。这样,该命令将永远休眠。


在这一刻,我正在为自己尝试一个睡眠循环-是的,这肯定有效!甚至直接使用ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet

tail -f /dev/null从技术上讲比9999循环差。该过程将每秒唤醒一次,而不是每2小时56分钟唤醒一次。
jlliagre

我在这里找到它:unix.stackexchange.com/questions/42901/…回答该问题的人说:“(假设此方法在内部使用inotify,应该没有轮询或唤醒,因此,除了外观怪异之外,应该足够了) ”“这种说法还是假设尾巴使用inotify不正确?
nitro2k01

该假设是正确的,tail已进行了优化以inotify在可用时加以利用。对于大多数(如果不是全部)最近的足够分布,这应该是默认情况。但是,我刚刚在Linux笔记本电脑上进行了测试,并观察到了tail监视的虚假活动,/dev/null因此就时钟周期而言,睡眠肯定会更糟。
2013年

我不相信那tail会永远每秒唤醒。结果的可能原因是您在可能tail出于某种原因而与之通信的终端中运行它,而sleep不会。没有理由为什么tail要不合逻辑醒来只是监控/dev/null
nitro2k01

0

您可以简单地尝试以下方法:

echo "your commands" && while :; do sleep 1; done

1
对于将来的访客,您应该提供其工作原理的摘要。许多人可能知道,但您不能假设所有的意愿。
nerdwaller

sleep尽管sleep 1在过去二十年中构建的任何东西都应该足够安全,但更长的时间将在CPU上更容易...
Shadur

:是的简写true。我也希望更长的sleep时间只是不合原则。
nitro2k01

0

您正试图从错误的角度解决这一问题。您不希望外壳不退出,而希望腻子使窗口保持打开状态。

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不会做什么吗?


问题不是窗口关闭,而是ssh隧道已关闭。告诉PuTTY让窗口保持打开状态还会维护ssh隧道吗?
Adrian Pronk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.