magnusjt / socketty
基于Web Sockets的SSH终端
1.0.0
2015-08-24 06:47 UTC
Requires
- cboden/ratchet: ^0.3.3
- psr/log: 1.0.0
- react/react: ^0.4.2
Requires (Dev)
- monolog/monolog: 1.*
- phpunit/phpunit: 4.2.*
This package is not auto-updated.
Last update: 2024-09-28 17:49:19 UTC
README
基于Web Sockets的交互式终端,后端为PHP。例如,可以用来创建交互式SSH会话,但也应适用于任何命令。同时,可以使用现有的PHP后端来执行授权和认证。
使用以下技术
- ratchet - PHP中的Web Sockets
- reactphp - PHP中的异步IO通过事件循环
- term.js - 浏览器中的终端仿真
- reactjs - 用于UI的其余部分
- python的pty模块 - 用于仿真pty,php可以通过正常管道与之交互
用法
该项目由一个管理客户端连接的PHP后端和一个仿真终端的前端组成。为了运行后端服务器,创建对此项目的composer依赖项,并遵循./server.php中的示例。
composer require magnusjt/socketty
在此处可以进行自定义
- 认证 - 实现AuthenticatorInterface。如果您想从现有网站重用会话,您需要通过memcached来完成此操作。
- 授权 - 与认证相同,但在此情况下,您还可以授权命令和命令参数。
- 用于Web Sockets的端口
- 允许的主机
- 日志记录 - 项目使用psr LoggerInterface,所以任何东西都行(Monolog是一个不错的选择)
- 生成器 - 生成要执行的命令字符串。可以在此处启用和禁用命令。
后端示例:参见./server.php
前端:通过将以下内容添加到npm依赖项中安装:"socketty": "git://github.com/magnusjt/socketty.git#master"
前端示例(需要使用browserify和babelify编译)
var Socketty = require('socketty');
var domNodeId = 'app'; // ID of the dom node to open the app in
var wssUrl = 'wss://:5678'; // Websocket URL
// Create some presets
var opts = [
{
name: 'SSH',
open: true,
list: [
{cmd: 'ssh vagrant@127.0.0.1', 'name': 'Vagrant SSH'},
]
},
{
name: 'Ping',
open: false,
list: [
{cmd: 'ping 127.0.0.1', 'name': 'Ping localhost'},
]
}
];
Socketty.start(domNodeId, wssUrl, opts);
开发
- 使用
npm install安装前端依赖项。 - 使用
composer install安装后端依赖项。 - 复制并重命名Vagrantfile和vagrant_bootstrap.sh文件
- 使用
vagrant up启动虚拟服务器 - 使用
php server.php启动Web Sockets服务器 - 在浏览器中打开https://:5678/login.php以模拟登录
- 在浏览器中打开https://:5678并在虚拟服务器中生成一些终端
- 使用
gulp build和gulp watchify构建前端内容 - 注意:重新启动后可能需要手动启动apache和haproxy
service httpd start
/usr/local/sbin/haproxy -f /vagrant/haproxy.cfg -p /var/run/haproxy.pid -D
关于SSL
为了具有安全的Web Sockets,vagrant安装包括haproxy,该程序终止所有SSL请求。
工作原理
首先,reactphp与事件循环一起使用,以实现PHP的异步调用。reactphp的一个子组件child-processes使用PHP的proc_open连接到子进程及其管道。对于需要tty的程序(如ssh及其交互式密码提示),我们真的很想使用PHP的pty管道,但遗憾的是,这些管道在大多数系统上不可用。为了解决这个问题,所有命令都通过一个Python脚本打开,该脚本使用pty模块来模拟pty。