加入收藏 | 设为首页 |

海市蜃楼-自定义构建交互式SSH应用程序,以Python为例

海外新闻 时间: 浏览:151 次

SSH的运用形式分两种办法交互式和非交互式的形式。在主动化体系中,更常用的对错交互式SSH,主动化东西都是根据这种形式,比方ansiable和salt-ssh,还有文件同步东西 rsync的SSH形式。本文咱们就来说说交互式SSH运用的构建,并以Python为例完结了一个根本的交互式运用。

自界说shell

在服务器上,能够运用OpenSSH完结三个过程来取得shell:身份验证,shell会话和指令。咱们能够随意装备shell(经过/etc/passwd)。例如,假如将用户的登录shell设置为/usr/bin/cshell,登陆后,就会运转cshell(能够为自界说的交互式程序)。shell界说也十分简略,只需以root权限修正/etc/passwd修正最终一个字段为自界说的shell程序既可。假如用户经过分配的TTY(默许情况下已完结)衔接到服务器,那就将能够运转自界说的运用程序或交互式运用程序。

authorized_keys装备

需求留意的是,假如运用自界说的shell运用程序,无法承受用户传递的额定指令行参数,例如ssh user@host ls -a履行时会丢掉最终的-a参数。为了处理这个问题,需求经过掩盖运转的指令办法,为了完结掩盖运转指令的操作,咱们能够运用用户证书验证文件authorized_keys文件。在该海市蜃楼-自定义构建交互式SSH应用程序,以Python为例文件每行之前,能够增加适用于运用该密钥登录的用户的选项。这些选项中有一个选海市蜃楼-自定义构建交互式SSH应用程序,以Python为例项是"command"选项。比方给将/home/user/.ssh/authorized_keys增加一下句子:

command ="/usr/bin/Ccommand" ssh-rsa ... user

用户的shell(或许应该是/bin/sh)就能够主动运转nethack,不管装备何种comma海市蜃楼-自定义构建交互式SSH应用程序,以Python为例nd,(假如需求,都存储在环境中的SSH_ORIGINAL_COMMAND中)都会先履行。出于驼背安全原因,一般会设置一下约束装备:

restrict,pty,command ="…" ssh-rsa ... user

更具体的设置选项,能够参阅sshd官方手册。默许会约束封闭大多数东西,经过pty显式从头启用TTY分配,这样就能够做自界说自己的终端运用(比方Python下curses编写的运用)。咱们再来看一个典型的gitlab下典型的多用户约束登陆型的authorized_keys装备实例:

sshd_config装备

另一个能够用来装备发动指令的当地sshd装备文件:/etc/ssh/sshd_config。经过sshd_config的AuthorizedKeysCommand来装备额定履行指令。它设置履行恣意程序,并从规范输出stdout获取authorized_keys文件。比方能够装备为:

AuthorizedKeysCommand /usr/bin/Ccommand "%u" "%h" "%t" "%k"
AuthorizedKeysUser root

上面装备中的格局字符串的作用是为指令供应测验登录的用户名(%u),用户的主目录(%h),正在运用的密钥类型(%t,例如ssh-rsa)和用base64编码的公钥(%k)。这儿供应的密钥可用于辨认用户,能够将用户公钥存储在数据库中,经过运用查询并供应给sshd用于认证。能够在此处嵌入自界说的指令行运用。

Python交互式SSH实例

下面是一个一个简略的的AuthorizedKeysCommand和python实例:

上面脚本中buildrht-shell指令告知用户运用ssh builds@buildhost connect 之类的指令进行衔接,能够运用SSH_ORIGINAL_COMMAND变量来获取其指令行:

然后是身份验证,查看其密钥和衔接:

交互式SSH中最重要的是对的输入指令进行实时的反应。tail程序便是用来完结这个功用构建和打印日志给规范输出:

以上咱们就构建了一个自界说的个性化的交互式SSH运用实例。

总结

本文咱们咱们介绍了自界说构建交互式SSH运用的办法,并经过Python为例完结了一个简略比方。抛砖引玉,自界说的交互式SSH运用在许多情况下都能够用来作为很有用的东西,比方可不能够对github的git ssh做一个扩展,把一些功用增加到曩昔,而不是简略的一个信息提示:

Hi bollwarm! You've successfully authenticated, but GitHub does not provide shell access