gpt4 book ai didi

与登录 shell 断开连接时 Docker 容器不退出

转载 作者:行者123 更新时间:2023-12-05 05:37:30 26 4
gpt4 key购买 nike

我有一个在服务器端运行的 docker 容器作为用户的登录 shell,这样任何人都可以通过 ssh 进入服务器并访问其中的一些资源。

比如,我有一个名为 test 的用户,我希望人们能够使用一些公开可用的密码通过 SSH 连接到 test 的帐户。这是我在 /etc/passwd

中的内容
test:1000:1000::/:/bin/test-shell

并且在/bin/test-shell

#!/bin/bash
docker run -it --rm --network none python:3.10-alpine /bin/sh

现在,每当有人使用 ssh test@example.com ssh 进入我的机器时,他们会立即被放入一次性 docker 容器中。到目前为止一切顺利。

我遇到的问题是,如果用户没有通过调用 exit 或按 Ctrl-D 退出 shell,而是只是关闭了他们的终端窗口,容器将无限期运行并占用有限的服务器资源。我想知道是否有可能(如果可以,如何)确保容器在用户断开连接时正确停止(并因此被删除)。

我看过Why does SIGHUP not work on busybox sh in an Alpine Docker container?并尝试了捕获 SIGHUP 和 SIGPIPE 的方法(在容器内运行 trap exit SIGHUP SIGPIPE),不幸的是没有任何反应。我怀疑信号可能是由主机 shell 接收的,而不是在容器内的 shell 中接收到的,但我不确定如何利用它(如果真的发生了这种情况),因为我无法获得动态生成的信号容器名称,我无法命名容器,因为我希望每次 ssh 尝试都生成一个不同的容器。

最佳答案

我认为这个答案可能对您有所帮助:https://unix.stackexchange.com/a/85429
例如你可以尝试这样的事情:

#!/bin/bash
[[ "$PAM_USER" -ne "test" ]] && exit 0

SESSION_COUNT="$(w -h "$PAM_USER" | wc -l)"

if (( SESSION_COUNT == 0 )) && [[ "$PAM_TYPE" == "close_session" ]]; then
docker kill <containerId>
fi

你应该为 containerId 使用一些唯一的标签,也许你可以将容器的 id 与 session id 相关联

关于与登录 shell 断开连接时 Docker 容器不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73106311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com