将别名<cmd>透明地改为“do X then <cmd>”

标题很糟糕,但我不确定我想要做什么的正确术语,如果我知道我现在可能已经find了答案!

问题:

由于每当端口23被扫描,一个过分热心的端口扫描器(客户的networking监视器)和一个过于简单化的telnet守护进程(busybox linux),telnetd启动另一个 /bin/login实例,等待用户通过telnetinput。

由于端口扫描器并没有真正尝试login,所以没有会话,所以不会有会话超时,所以我们很快就会运行一个百万个僵尸拷贝/bin/login

我想要做的是:

telnetd给了我们启动一些其他东西-l )而不是/bin/login所以我想我们可以用一个bash脚本来replace/bin/login ,这个脚本会杀死旧的login进程,然后正常运行/bin/login

 #!/bin/sh # First kill off any existing dangling logins # /bin/login disappears on successful login so # there should only ever be one killall -q login # now run login /bin/login 

但是这似乎立即返回(没有错误,但没有login提示)。 我也尝试在telnetd的参数中链接命令:

telnetd -- -l "killall -q login;/bin/login"

但是,这似乎并没有工作(再次 – 没有错误,但没有login提示)。 我确定这里有一些明显的皱纹。

系统是embeddedLinux 2.6.x运行Busybox,所以保持简单是最好的select。

编辑 :好吧,我是一个没有使脚本可执行的克拉,做了我得到login:提示符,但input用户名后,我什么都没有进一步。

检查您的脚本是否设置了执行位。 权限应该与包含所有权的原始二进制文件相同。

至于-l :我的猜测是它试图执行命令killall -q login;/bin/login (这是一个字)。

由于这是一个嵌入式系统,它可能不会写日志。 但是,你应该检查/var/log反正错误消息。 如果没有,您应该可以使用文档进行配置: http : //wiki.openwrt.org/doc/howto/log.overview

对,我修好了,正如我怀疑我失去了一个皱纹:

exec / bin / login

我需要exec来把控制权交给/bin/login而不是仅仅调用它。

所以telnet守护进程是这样​​启动的:

 /usr/sbin/telnetd -l /usr/sbin/not_really_login 

not-really-login脚本的内容是:

 #!/bin/sh echo -n "Killing old logins..." killall -q login echo "...done" exec /bin/login 

和所有的作品,因为它应该在telnet连接我们得到这个:

 **MOTD Etc...** Killing old logins......done login: zero_cool password: 

我们可以照常登录。

我唯一没有想到的是,如果我们可以检测到/bin/login (如果我们杀了它)的退出状态并打印一条消息Too slow, sucker! 或类似的。 TBH虽然,这可以等待一个下雨天,我只是很高兴我们的东西不能通过Telnet DDOS'ed了!