首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当SSH连接打开时,防止机器休眠

当SSH连接打开时,防止机器休眠
EN

Ask Ubuntu用户
提问于 2014-09-08 18:30:49
回答 2查看 11.1K关注 0票数 23

当桌面不活动时,我正试图通过切换到挂起模式来节省电源。但是许多台式机的所有者也可以通过SSH访问。部署了一个wakeonlan解决方案,使所有者能够打开机器,但问题是,即使SSH连接已经打开,机器在10分钟内也会再次自动挂起。

我要做的是将活动SSH会话包含在“活动”定义中。

问题是,它能通过设置polkit规则来完成吗?它能通过在实际挂起之前运行的脚本来完成吗?如果找到SSH会话,就中止它吗?我需要一个干净合法的方法来做这件事。如果不是这样的话,那么黑客的方式也是受欢迎的。

当前朴素的黑客解决方案:编辑/usr/sbin/pm-suspend

代码语言:javascript
复制
#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

这是为了达到目的。但是我不知道更新什么时候会覆盖文件/usr/sbin/pm-suspend。我也不知道这将如何与其他挂起实现,如tuxonice。

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2014-09-08 18:45:17

直到Ubuntu14.10(基于Upstart的)

查看pm-action(8)并在“文件”部分搜索/etc/pm/sleep.d。如果其中一个脚本以非零退出状态返回,则防止暂停。

更新说明,以求澄清:

  1. 所以创建一个文件/etc/pm/sleep.d/05_ssh_keepawake
  2. 放入一个谢邦 (#!/bin/sh)和这个文件中问题中提到的代码。
  3. 设置对它的执行权限: chmod +x /etc/pm/轨枕.d/05_ssh_使保持清醒

自Ubuntu15.04(基于系统的)

systemd不使用pm-utils来管理它的电源状态挂钩,但是它有自己的基础设施来达到相同的目的。睡眠抑制剂检查不再在睡眠中执行,但必须通过抑制睡眠的操作来设置(参见1)。

因此,您必须向SSH会话登录和注销添加命令,以便向systemd (例如,通过systemd-inhibit(1))注册睡眠抑制器,然后释放该抑制器。如果有人知道如何连接到SSH登录和注销,我会欢迎评论或编辑,以便我们可以制定相关的步骤和命令。

--以下部分正在进行中--只在您知道正在做什么时才使用它!

您可能可以编写一个systemd单元/etc/systemd/system/ssh-inhibt-sleep.service,它使用RequiredBy选项使自己成为sleep.target的依赖项。如果您的新单元失败(其被调用的进程的退出状态为非零),它将生成sleep.target,从而导致后续的睡眠操作。

代码语言:javascript
复制
[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv "\(:0\)"'

[Install]
RequiredBy=sleep.target

与往常一样,您需要激活系统单元以使它们生效:

代码语言:javascript
复制
sudo systemctl enable ssh-inhibt-sleep.service

有关更多信息,请参见systemd.unit(5)systemd.service(5)

票数 23
EN

Ask Ubuntu用户

发布于 2021-12-20 21:22:07

在现代的systemd系统中,您还可以将ssh.socket服务与systemd抑制一起使用。您可以让系统管理传入的连接,而不是运行通常的ssh.service独立。现在,每个开放会话都由ssh.socket处理,后者基于ssh@.service创建实例单元,因此只需创建一个直接绑定到它的服务。这具有跟踪和记录与systemd的每个ssh连接的额外好处。然后,我们可以使用此标识符在阻塞睡眠时提供更有用的信息。该方法还与其他一些示例一样,防止出现故障单元的系统降级。

首先,如果您尚未使用ssh.socket,则需要进行检查以确保启用它。

代码语言:javascript
复制
systemctl is-active ssh.socket

应该说是主动的,否则您需要启用它:

代码语言:javascript
复制
sudo systemctl disable ssh
sudo systemctl stop ssh
sudo systemctl enable ssh.socket
sudo systemctl start ssh.socket

然后,您只需要创建/etc/systemd/system/ssh-no-休眠@..service

代码语言:javascript
复制
[Unit]
Description=ssh no sleep
BindsTo=ssh@%i.service

[Service]
ExecStart=/usr/bin/systemd-inhibit --mode block --what sleep --who "ssh session "%I --why "session still active" /usr/bin/sleep infinity

[Install]
WantedBy=ssh@.service

并通过以下方式启用:

代码语言:javascript
复制
sudo systemctl enable ssh-no-sleep@

现在,当有人试图挂起时,他们将得到所有阻塞ssh会话的有用消息。

代码语言:javascript
复制
sudo systemctl suspend

然后返回如下内容:

代码语言:javascript
复制
Operation inhibited by "ssh session 1/127.0.0.1:22/127.0.0.1:12345" (PID 12345 "systemd-inhibit", user root), reason is "session still active".
Operation inhibited by "ssh session 2/2001:db8:1::1:22/2001:db8:2::1:12345" (PID 54321 "systemd-inhibit", user root), reason is "session still active".
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl suspend -i'.

ssh.socket的另一个好处是您还可以使用:

代码语言:javascript
复制
systemctl status ssh.socket

它返回活动用户和系统状态:

代码语言:javascript
复制
* ssh.socket - OpenBSD Secure Shell server socket
     Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; vendor preset: enabled)
     Active: active (listening) since Mon 2021-12-20 14:46:05 EST; 1h 6min ago
   Triggers: * ssh@2-2001:db8:1::1:22-2001:db8:2::1:12345.service
             * ssh@1-127.0.0.1:22-127.0.0.1:12345.service
     Listen: [::]:22 (Stream)
   Accepted: 2; Connected: 2;
      Tasks: 0 (limit: 18775)
     Memory: 16.0K
        CPU: 2ms
     CGroup: /system.slice/ssh.socket
票数 5
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/521620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档