我正在将应用程序从 OpenVMS 迁移到 RedHat Linux 6。该应用程序是一个绿屏终端应用程序。用户将通过 SSH 登录 Linux,应用程序应自动启动,但他们永远无法访问 shell。一旦应用程序关闭或崩溃,它应该自动注销他们。解决这个问题的最佳方法是什么?
我尝试使用以下命令创建一个新用户。
useradd -s /sbin/nologin test
然后,我将 ftp & 添加到用户的 .bash_profile 中,希望它能立即打开 ftp 控制台,然后一旦用户退出,它就会将他们注销。然而,在 SSH 上进行身份验证时,会话被终止。有什么想法吗?
答案1
我过去 12 年支持的“绿屏”应用程序就是通过修改.bash_profile
和包装脚本来启动应用程序来实现这一点的。
系统建立并创建服务用户后,我们会修改目录.bash_profile
中的默认设置/etc/skel
。这可确保在系统上创建的新用户能够采用登录设置。
让我们调用该应用程序“桃”
在 .bash_profile 中,
# Source any peach-specific variables
. /etc/default/peach
# Set up the search paths:
PATH=$PATH:.
# Set up the shell environment:
set +u
trap "echo 'logout'" 0
# Run the peach application or start script:
/opt/peach/bin/run-peach
实际的“run-peach”包装器脚本将如下所示:
#!/bin/bash
set -e
<blah blah> # do stuff, set MOAR variables
/opt/peach/bin/peach # run application binary
答案2
Match
对该组用户使用一个块,并ForceCommand
使用一个包装脚本强制执行 OpenVMS 程序,该脚本使用自己的脚本exit
来注销用户。
ForceCommand Forces the execution of the command specified by ForceCommand, ignoring any command supplied by the client and ~/.ssh/rc if present. The command is invoked by using the user's login shell with the -c option. This applies to shell, command, or subsystem execution. It is most useful inside a Match block. The command originally supplied by the client is available in the SSH_ORIGINAL_COMMAND environment variable. Specifying a command of “internal-sftp” will force the use of an in-process sftp server that requires no support files when used with ChrootDirectory.
由于这不是一个登录 shell,所以不需要注销,只需退出:
Match Group oldies
ForceCommand /usr/local/bin/wrapper
包装器脚本的示例可能如下所示:
# cat /usr/local/bin/wrapper
#!/usr/bin/env bash
dialog --title "Message" --yesno "Wrapper around your OpenVMS program" 6 25
exit 0
ssh
这对于访问有效。
您还可以强制执行相同的包装脚本/etc/passwd
:
bob:x:1100:1100:Sponge Bob:/home/bob:/usr/local/bin/wrapper
并具有来自登录控制台的相同功能。
答案3
为什么不直接将应用程序设置为用户的 shell?这意味着它是用户登录时唯一运行的东西,并且(除非应用程序本身有某种访问权限)他们实际上不能做任何其他事情。