Linux 如何从perl脚本中注销ssh会话?

Linux 如何从perl脚本中注销ssh会话?,linux,perl,ssh,debian,Linux,Perl,Ssh,Debian,我有一个perl脚本,用于在打开ssh外壳后执行第二层身份验证。它要求输入密码,在n次无效尝试后,脚本应该注销用户。这在Debian系统上运行 现在的问题是,ssh shell通常是通过命令exit交互关闭的 当从backticks运行时,或者从perl脚本中的system()运行时,exit不会被识别为有效命令。那么,如何从ssh会话中,从perl脚本中注销用户呢?该脚本不负责ssh会话。它在远程上运行,并从.bashrc启动 这是代码的相关部分: while ($actualpass ne

我有一个perl脚本,用于在打开ssh外壳后执行第二层身份验证。它要求输入密码,在n次无效尝试后,脚本应该注销用户。这在Debian系统上运行

现在的问题是,ssh shell通常是通过命令
exit
交互关闭的

当从backticks运行时,或者从perl脚本中的system()运行时,
exit
不会被识别为有效命令。那么,如何从ssh会话中,从perl脚本中注销用户呢?该脚本不负责ssh会话。它在远程上运行,并从.bashrc启动

这是代码的相关部分:

while ($actualpass ne $password) {
    ++$attempts;
    if ( $attempts > $maxattempts ) {
        `/bin/bash /root/ascii_breach`;
        `/bin/bash exit`;
    }

/bin/bash退出
显然不起作用。

听起来你有点倒退了。我认为您正在做的是ssh到运行shell的远程主机,shell运行perl,然后perl想要退出shell。更好的方法是通过ssh连接到主机直接运行perl脚本。只有通过了身份验证,perl脚本才会启动shell


您可以将sshd配置为在authorized_keys文件中运行您的身份验证脚本,假设用户是这样进入的。

您可以启动身份验证脚本,检查退出状态,并在失败时注销shell:

perl auth.pl; if [ $? -ne 0 ]; then exit; fi
然后在Perl脚本中:

if ( $attempts > $maxattempts ) {
    die 'Authentication failed';
}
您还需要使用ctrl+c或ctrl+z停止用户跳过身份验证:

trap "echo no" SIGINT SIGTSTP
perl auth.pl; if [ $? -ne 0 ]; then exit; fi

这应该是双重身份验证。sshd运行pam身份验证。用户认为他可以进入,但perl脚本已经启动。如果该层失败,用户需要再次通过pam进入。确定。我的评论站得住脚-您的身份验证过程应该在成功时启动实际的shell,而不是在失败时尝试退出启动它的shell。授权的\u密钥不只是存储可接受的公钥吗?它还可以为用户配置命令。这里有各种可能的解决方案-关键是在连接时,auth脚本是运行的,而不是shell。一个向父级(shell PID)发送信号的黑客(shell PID)
perl-e'kill HUP=>getppid()”
@mpapec,这太棒了。这正是我想要的,无需编辑系统文件。如果我没记错的话,在bash脚本中退出只会停止该程序。