【问题标题】:deny parallel ssh connection to server for specific host / IP拒绝特定主机/IP 与服务器的并行 ssh 连接
【发布时间】:2014-10-01 20:33:53
【问题描述】:
  1. 我有一台机器人(通过移动设备控制),它 通过方法 os 连接到服务器并从中获取信息 “ssh、shell 脚本、操作系统命令、sql 查询等”比它提供的 互联网上的信息(私人)
  2. 我想禁止通过 仅限bot机器..还有其他机器连接到服务器,不能受到影响

假设

客户端 A 从他的移动访问机器人机器(通过网页)而不是机器人 机器现在连接到服务器(第一个会话),如果这个过程 在此期间连接时间为 5 分钟,机器人机器将 创建、查询、删除、追加、更新等

在那 5 分钟的持续时间内(假设 2 分钟后 第一个会话开始)客户端 B 从他的移动访问机器人机器 (通过网页)比机器人机器现在连接到服务器(第二次会话) 它将与第 1 次会话冲突并造成 Havoc...

限制

  1. 现在首先我不想编辑服务器上的任何设置 任何事情
  2. 我不想编辑网页/手机等
  3. 我已经知道并行shell脚本的锁定文件方法和 它是在脚本级别实现的,但是操作系统命令和 类似 bash 脚本中没有的东西

我的想法

每当我们与服务器建立连接时,我的想法是什么 创建一个名为 what ever (SSH) 的进程,可在 ps -fu 中查看 OSUSER 因此,通过将唯一的 id/tag/name 应用于我们的连接,我们可以 确定一个会话是否处于活动状态。这将尽快检查 当机器人连接到服务器时。但我不知道该怎么做 那....还请就它提出更多信息。 还有办法确定现有进程是否被挂起或 进程开始或过去的时间?

【问题讨论】:

  • 没有神奇的“操作系统命令和类似的东西”可以实现您似乎想要做的事情。锁文件似乎是最明显和最简单的事情
  • 那么简而言之,您的意思是说在建立 SSH 会话连接后检查锁定文件吗?因为它旨在避免并行运行相同的 shell Shell 脚本?即使是这样,我的下一个问题将是如何识别上一个会话是否被挂起或花费很长时间等。在不知道下一个连接(在挂起的会话之后)将看到锁定文件并且根本无法连接的情况下。 ..如何处理这个问题?
  • 另外你在限制点三上弄错了,我提到我知道 abt lock 方法并解释了它。但我不想在这里使用 lock 方法,就像他们在 shell 脚本中所做的那样。所以我想知道替代方法..当它是一个真正的问题时为什么-1分?也请检查我之前的评论以了解下一个问题。
  • -1 因为这个问题很难阅读,并且可以说是关于服务器配置而不是编程
  • 至少回答我关于这个主题的其他问题..另外请建议哪种锁定方法会好

标签: bash session unix ssh parallel-processing


【解决方案1】:

也许可以尝试使用limits.conf 对用户/组实施1 次登录的硬性限制。

您可能需要定期 cron 作业来检查并删除任何过时的登录。

锁/互斥锁很难正确处理并增加复杂性。 Limits.conf 是大多数 unix/linux 系统的标准特性,应该更可靠,重点应该...

这里提出了一个类似的问题: https://unix.stackexchange.com/questions/127077/number-of-ssh-connections-on-a-single-linux-machine

这里的详细信息: http://linux.die.net/man/5/limits.conf

【讨论】:

  • 我想问一下 limis.conf 解决方案是针对 bot 还是针对服务器?我们应该在哪里实施它?如果服务器比它是不可能的。如果机器人比它是可能的,但只是它不是正确的解决方案。但在我的情况下,这是一个很好的解决方案
  • 这是服务器上的设置。我将您的“限制 #1”解释为不是每次登录都做的事情,而不是在服务器上只做一次的事情。 lockfile解决方案也是对服务器上的登录脚本的改动,所以也是服务器端的解决方案……
  • 我无法执行limits.conf,因为同时登录了许多其他ip。我的意思是机器人将24/7登录,但许多其他电脑也会登录,所以“我认为” limits.conf 将禁用所有登录。还想对您说,所有远程登录的用户使用的用户/组是通用的和相同的。没有单独的用户/组。
  • 如果所有用户都共享相同的id和组,因此在服务器端用户之间没有区别,并且您无法对服务器进行任何更改,那么您的选择就很少了。我看到的唯一可能性是在每次登录时手动运行您自己的锁定文件创建和检查命令。
【解决方案2】:

我假设您的 ssh 帐户只有一次登录,并且在登录时会运行一个脚本

在登录时向脚本添加类似的内容

#!/bin/bash
LOCK_FILE="/tmp/sshlock"
trap "rm $LOCK_FILE; exit" SIGHUP SIGINT SIGTERM

if [ $(( (`date +%s` - `stat -L --format %Y $LOCK_FILE`) < (30*60) )) ]; then
   exit 0
fi
touch $LOCK_FILE

当ssh登录调用的进程结束时,删除$LOCK_FILE

trap 语句是这种锁定方式的重要组成部分,请务必使用它

“30*60”是 30 分钟超时,感谢对这个问题的回答 How can I tell if a file is older than 30 minutes from /bin/sh?

【讨论】:

  • 这是一个很好的解决方案,但我需要对此进行一些解释......请先生解释一下它是如何工作的(我第一次看到陷阱命令)......另外请解释一下如果出现问题,例如我的第一个 ssh 会话挂起/花费太多时间,那么在这种情况下它将如何工作。我也可以用新会话杀死那个挂起的会话吗?如果是,比如何(请添加代码)?请不要介意我只是想增强它,我对此很陌生。
  • 这也是一个非常好的解决方案,我正在考虑在我们开始会话时制作脚本的两个部分 A 部分和 B 部分,当我们完成所有活动后,A 部分将运行 B 部分跑到底行不行还是有什么缺陷?
  • 我还想更新上面的代码给出的问题 likestat: cannot stat `/disk1/checkbot/sshlock': No such file or directory script1.sh: line 5: (1412532532 - )
猜你喜欢
  • 2012-05-25
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2022-07-19
  • 2011-12-12
相关资源
最近更新 更多