我不知道该怎么称呼我的问题。
我有一个服务器,它有一套适合我需要的TUI程序。
我希望网络的其他用户打开一些更小的东西,比如raspi或恐龙计算机,当它启动时,用户将不会像正常的那样为本地登录提供getty .相反,它们将向服务器提供ssh。只有当服务器没有应答时,用户才会显示本地登录。
我想这种类型的风景不是新的或激进的..。在我看来,这基本上是一个通过ssh通过tcp/ip连接的瘦客户机的概念。
发布于 2021-08-28 23:33:38
这确实是可以实现的:早在1998年左右的时候,我在大学里就做过类似的事情。
基本上,您需要配置RasPi的RasPi进程,以调用您自己的login程序的自定义版本,而不是标准的/bin/login。那部分很简单。
您的自定义login替换甚至可以是一个脚本,如果您不需要它是特别安全的,或者只是原型。但是对于一个严肃的实现,我认为它应该是一个编译好的程序,为了安全起见:删除脚本解释器可以最小化运行代码的数量,从而使设置竞争条件或其他针对它的攻击变得更加困难。
然而,我在您的设计中看到了一个可能的用户体验问题:当用户已经输入了他们的登录名时,他们可能会在密码提示出现时立即开始输入他们的密码,这几乎是一种没有太多思考的反射行为。如果SSH连接尝试失败,并且本地登录尝试自动重用相同的登录名,用户可能会认为他们已经连接到服务器,当他们发现自己与本地登录时会感到困惑。
最好是需要经过深思熟虑的操作,例如切换到具有未经修改的getty配置的第二个虚拟控制台,以便进行本地登录。您可以向/etc/issue添加所需击键的说明,以便getty在登录提示符之前显示它。作为一个副作用,您的自定义login脚本或二进制文件可以大大简化为基本上如下:
#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example-oEscapeChar=none选项将防止使用OpenSSH转义键击键,因此用户将无法配置端口转发或与SSH客户端进行其他恶作剧(感谢Ferrybig提醒我!)
由于login (或它的任何替代品)将作为根用户运行,所以最好在exec()执行ssh命令之前切换到一些非根用户。这是编译后的程序更加灵活的地方。
如果您在编程方面有一点点经验,我建议您下载您所选择的Linux发行版的/bin/login源代码包,并查看是否可以将其黑客化。
基本上,您需要做两个更改:不要使用getty给它的用户名作为参数来选择要登录的用户名,而是让替代的login使用一个硬编码的用户名,您将只为传出的SSH连接保留一个用户名。而不是在登录过程结束时对用户的shell进行exec(),而是将exec()命令作为参数提供从getty获得的用户名和服务器的名称。
发布于 2021-08-30 03:32:16
我倾向于在/etc/profile中这样做(假设用户的shell是bash或ksh或其他使用/etc/profile的东西):
if [[ $(ps h -o cmd $(ps h -o ppid $)) =~ $(basename "$SHELL") ]] \
|| id | grep -q '(sshgroup)' \
&& fping -q remotehost; then
set -e # exit on any error, incl. user pressing ^C during
# ssh-keygen or ssh-copy-id
# generate a key if it doesn't already exist
if [ ! -e ~/.ssh/id_rsa ] then
ssh-keygen
fi
# install it on remote host if ~/.ssh/key-installed doesn't exist
if [ ! -e ~/.ssh/key-installed ] ; then
ssh-copy-id -i ~/.ssh/id_rsa.pub remotehost
touch ~/.ssh/key-installed
fi
# rewrite the following if any users have a shell which doesn't
# support arrays (ash, dash, posix sh, etc)
ssh_args=(-oEscapeChar=none)
exec ssh "${ssh_args[@]}" remotehost
fi如果父进程不是用户的shell 和,则远程主机是sshgroup 和的成员,然后ssh响应远程主机(而且因为ssh是exec-ed,因此用户将在ssh会话结束后被注销)。否则,登录将继续如常进行。在fping之前对组成员进行测试,这样非成员就不必等待‘`fping结果’。
本地和远程主机上的/etc/motd文件中的适当消息可以用来突出显示它们在哪台机器上结束。
如果用户在远程主机上的~/.ssh/authorized_keys中没有ssh密钥,那么它也会询问他们的密码。脚本片段中的ssh-keygen和ssh-copy-id是如何防止这种情况的最起码的例子。它可能还应该使用ssh-agent运行-t 86400,因此他们只需要每天输入一次密钥的密码,而不是每次登录时都输入密码。
这样检查组成员可以很容易地将用户(如root或非根管理帐户)排除在远程主机上。您可以将测试和自动ssh转换为任何<#>不是特定组的成员的用户。
https://unix.stackexchange.com/questions/666673
复制相似问题