如何在 Debian 中用户登录时启动程序但禁止交互式 shell

如何在 Debian 中用户登录时启动程序但禁止交互式 shell

我想要 Debian 7.x 中的一个用户,并且受到以下限制:

  1. 当用户登录时,命令行程序会自动在用户 shell 会话中启动。然后该程序会一直解析用户输入,并执行命令,直到用户输入特定的退出命令。
  2. 当程序终止时,用户必须自动注销。
  3. CTRL+C必须不执行任何操作或中止程序并注销用户。
  4. 总而言之,除了这个自动启动的程序之外,用户不得以任何其他方式与系统交互。无论会话以何种方式启动,无论是 SSH 还是其他方式,这都是正确的。

作为起点,我在新用户的末尾添加了以下几行.bashrc(用户的 shell 是 bash):

exec /path/to/myprogram
logout

一般来说,它可以工作。但是,如果会话启动速度很慢,(不是特别快的)用户可以按 CTRL-C 并在myprogram启动前在终端上愉快地得到提示。我该如何避免这种情况?

为用户分配一个虚假的shell(如/usr/sbin/nologin/bin/false将不起作用,因为它也不允许启动该程序。

答案1

普通用户登录身份验证(又名 user/pass),然后由 shell 呈现。系统在他们的密码文件中查找要启动哪个 shell。

用户可以使用 change shell ( ) 命令更改其 shell chsh,尽管这可能仅限于 /etc/shells 中列出的 shell 列表。

在这种情况下,我们不想启动交互式 shell。我们不想启动 bash,然后让 bash 用另一个程序覆盖自身,而是立即启动另一个程序。

结果是:

  1. 程序启动了。中间没有 shell,也没有 shell 来捕获快速的 control-C
  2. 程序终止时发生的情况与 shell 终止时发生的情况相同(例如 exit 或 之后controld)。用户被注销。

请注意,这假设用户无法脱离程序。但事实并非总是如此。(例如,像 elm 这样的邮件阅读器可以退出到 shell。vim 也是如此)。除这些情况外,用户将别无选择,只能登录或使用单个指定程序。

PS:这也意味着无法访问密码。我希望密码永远不会过期。

相关内容