【问题标题】:How to logout an ssh session from within a perl script?如何从 perl 脚本中注销 ssh 会话?
【发布时间】:2014-06-02 19:01:56
【问题描述】:

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

现在,问题是通常使用命令exit 以交互方式关闭 ssh shell。

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

这是相关的代码段:

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

/bin/bash exit 显然不起作用。

【问题讨论】:

  • 向父级(shell PID)perl -e 'kill HUP => getppid()'987654325@发送信号的技巧
  • @mpapec 太棒了。正是我想要的,无需编辑系统文件。做出这样的回答?

标签: linux perl ssh debian


【解决方案1】:

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

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

【讨论】:

  • 这应该是双层身份验证。 sshd 运行 pam 身份验证。用户认为他进入了,但启动了 perl 脚本。如果该层失败,用户需要再次通过 pam 进入。
  • 当然。我的意见是 - 您的身份验证过程应该在成功时启动实际的外壳,而不是尝试退出在失败时启动它的外壳。
  • 授权密钥不只存储可接受的公钥吗?
  • 它还可以为用户配置命令。这里有各种可能的解决方案 - 关键是在连接时运行身份验证脚本,而不是 shell。
【解决方案2】:

您可以启动身份验证脚本,检查退出状态并在失败时注销 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

【讨论】:

  • 如果我没记错的话,退出 bash 脚本只会停止该程序。
猜你喜欢
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2011-02-20
  • 2023-02-22
  • 2014-01-19
  • 2020-05-19
相关资源
最近更新 更多