透明地将 <cmd> 别名为 "do X then <cmd>"

Alias <cmd> to "do X then <cmd>" transparently

标题很糟糕,但我不确定我正在尝试做的事情的正确术语,如果我知道我现在可能已经找到答案了!

问题:

由于 over-zealous 端口扫描器(客户的网络监视器)和过于简单的 telnet 守护程序(busybox linux),每次扫描端口 23 时,telnetd 都会启动 另一个 /bin/login 的实例等待用户通过 telnet 输入。

由于端口扫描器实际上并没有尝试登录,所以没有 session,所以不会有 session 超时,所以我们很快就得到了 session 的 squillion 僵尸副本=14=] 运行.

我正在尝试做些什么:

telnetd 为我们提供了启动 其他东西的选项 (-l) 而不是 /bin/login 所以我认为我们可以替换 /bin/login 使用 bash 脚本杀死旧的登录进程,然后正常运行 /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

但这似乎会立即 return(没有错误,但没有登录提示)。我还尝试在 telnetd 的参数中链接命令:

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

但这似乎也不起作用(同样 - 没有错误,但没有登录提示)。我确定这里遗漏了一些明显的皱纹。

系统是嵌入式的Linux 2.6.x运行Busybox所以保持简单是首选。

编辑:好的,我是个笨蛋,因为我没有让脚本可执行,完成后我得到了 login: 提示,但在输入用户名后我什么也得不到进一步。

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

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

由于是嵌入式系统,可能不会写日志。但是你应该检查 /var/log 无论如何错误信息。如果有none,你应该可以使用文档配置它:http://wiki.openwrt.org/doc/howto/log.overview

好的,我修好了,因为我怀疑我遗漏了一条皱纹:

执行 /bin/login

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

这样telnet守护进程就这样启动了:

/usr/sbin/telnetd -l /usr/sbin/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!