首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSH登录而不是带有本地回退的getty

SSH登录而不是带有本地回退的getty
EN

Unix & Linux用户
提问于 2021-08-28 21:48:27
回答 2查看 623关注 0票数 5

我不知道该怎么称呼我的问题。

我有一个服务器,它有一套适合我需要的TUI程序。

我希望网络的其他用户打开一些更小的东西,比如raspi或恐龙计算机,当它启动时,用户将不会像正常的那样为本地登录提供getty .相反,它们将向服务器提供ssh。只有当服务器没有应答时,用户才会显示本地登录。

我想这种类型的风景不是新的或激进的..。在我看来,这基本上是一个通过ssh通过tcp/ip连接的瘦客户机的概念。

EN

回答 2

Unix & Linux用户

发布于 2021-08-28 23:33:38

这确实是可以实现的:早在1998年左右的时候,我在大学里就做过类似的事情。

基本上,您需要配置RasPi的RasPi进程,以调用您自己的login程序的自定义版本,而不是标准的/bin/login。那部分很简单。

您的自定义login替换甚至可以是一个脚本,如果您不需要它是特别安全的,或者只是原型。但是对于一个严肃的实现,我认为它应该是一个编译好的程序,为了安全起见:删除脚本解释器可以最小化运行代码的数量,从而使设置竞争条件或其他针对它的攻击变得更加困难。

然而,我在您的设计中看到了一个可能的用户体验问题:当用户已经输入了他们的登录名时,他们可能会在密码提示出现时立即开始输入他们的密码,这几乎是一种没有太多思考的反射行为。如果SSH连接尝试失败,并且本地登录尝试自动重用相同的登录名,用户可能会认为他们已经连接到服务器,当他们发现自己与本地登录时会感到困惑。

最好是需要经过深思熟虑的操作,例如切换到具有未经修改的getty配置的第二个虚拟控制台,以便进行本地登录。您可以向/etc/issue添加所需击键的说明,以便getty在登录提示符之前显示它。作为一个副作用,您的自定义login脚本或二进制文件可以大大简化为基本上如下:

代码语言:javascript
复制
#!/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获得的用户名和服务器的名称。

票数 9
EN

Unix & Linux用户

发布于 2021-08-30 03:32:16

我倾向于在/etc/profile中这样做(假设用户的shell是bash或ksh或其他使用/etc/profile的东西):

代码语言:javascript
复制
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响应远程主机(而且因为sshexec-ed,因此用户将在ssh会话结束后被注销)。否则,登录将继续如常进行。在fping之前对组成员进行测试,这样非成员就不必等待‘`fping结果’。

本地和远程主机上的/etc/motd文件中的适当消息可以用来突出显示它们在哪台机器上结束。

如果用户在远程主机上的~/.ssh/authorized_keys中没有ssh密钥,那么它也会询问他们的密码。脚本片段中的ssh-keygenssh-copy-id是如何防止这种情况的最起码的例子。它可能还应该使用ssh-agent运行-t 86400,因此他们只需要每天输入一次密钥的密码,而不是每次登录时都输入密码。

这样检查组成员可以很容易地将用户(如root或非根管理帐户)排除在远程主机上。您可以将测试和自动ssh转换为任何<#>不是特定组的成员的用户。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666673

复制
相关文章

相似问题

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