【问题标题】:Launch interactive SSH bash session from PHP从 PHP 启动交互式 SSH bash 会话
【发布时间】:2016-03-28 06:19:23
【问题描述】:

我正在使用 PHP 为常见的服务器管理任务编写快捷方式(我正在使用 deployer.org,但这应该不重要)。我想添加一个任务,用于在 SSH 连接到服务器后启动交互式 bash 提示符。例如,您将运行“./dep ssh”(其中“dep”是一个 PHP 脚本),这与运行 e.g. 的效果相同。来自终端的“ssh user@server”。有没有办法在 PHP 中做到这一点?就上下文而言,我有大约 5 台服务器,我经常想要通过 SSH 连接、读取日志或复制文件等,因此我需要快捷方式。

我能得到的最接近的是这样的:

$ph = popen("bash","w");
  while(($line = fgets(STDIN)) !== false){
      fputs($ph,$line);
 }
 pclose($ph);

这使您可以向 bash 发送命令或从 bash 发送命令,但您看不到正常的 bash 提示或获得制表符完成。我需要这样的东西,但所有正常的 bash 功能都可以工作。

【问题讨论】:

  • 我正在研究解决方案:)。希望我能尽快完成。
  • 你为什么不把你的快捷方式写成 .bashrc 中的别名?
  • 我在编写所有任务的脚本时保持一致,因此所有开发人员都可以轻松完成它们。我希望能够运行“./dep ssh stage”、“./dep release stage”、“./del logs stage”以交互方式 ssh 进入登台服务器,分别发布和查看日志(“发布”任务是例如一组非交互式 SSH 任务)

标签: php bash shell


【解决方案1】:

如果您只是想在网络浏览器中进行 SSH,那么您可能正在寻找以下产品之一:

  • Google 针对 Chrome 和 Chromium 的 Secure Shell 扩展程序
  • 任意项
  • Ajaxterm
  • 一号门
  • webmux
  • WebShell
  • EC2Box
  • 钥匙盒
  • KeyBox-OpenShift
  • Mist.io

这里是is a link,您可能想看看。

【讨论】:

  • 也许我不清楚,但这将是我从命令行运行的 PHP 脚本。
  • @fstr 这意味着您必须自己开发它,ssh2 具有为 bash 开发 tty 所需的所有功能,类似于您在命令行上使用的 SSH 实用程序 看看在this link 并开始开发。
【解决方案2】:
#!/usr/bin/php
# This doesn't work, but it might lead you in the right direction.
<?
$ph = popen("bash","w");

function getCharacter() {
    $cmd = '
        read -n 1 char;
        if [ "$char"==" " ]; then
            echo space
        elif [ "$char"=="\n" ]; then
            echo newline
        else 
            echo "$char"
        fi
    ';
    return trim(shell_exec($cmd));
}

$command = "";

while (false !== ($char = getCharacter())) {
    if ($char === "space") {
        $command .= ' ';
    } elseif ($char === "newline") {
        fputs($ph, $command);
        $command = "";
    } elseif ($char === "\t") {
        # Do something fancy with the `compgen` bash utility.
        echo shell_exec("compgen -d $command");
    } else {
        $command .= $char;
    }
}

很遗憾,时间不早了,我没能看完=D。这里的主要问题是读取输入(fgets 仅在用户输入换行符后发生,因此无法检测到“\t”)。我尝试用read 伪造它,但它确实有问题。

fgetc 也不起作用,需要完成用户输入。

我的下一步是研究tty 的工作原理,并尝试以这种方式破解它。但是,当然,您仍然需要做很多工作才能尝试使compgen 的输出具有相关性。这将涉及确定要发送到 compgen 的参数和选项(即,用户是键入命令还是文件名)。

【讨论】:

    【解决方案3】:

    看看PHP中的this ssh2模块,文档是here

    这是连接和执行命令的方式:

    <?php
    
    /* Notify the user if the server terminates the connection */
    function my_ssh_disconnect($reason, $message, $language) {
      printf("Server disconnected with reason code [%d] and message: %s\n",
             $reason, $message);
    }
    
    public function my_exec_cmd($connection, $cmd) {
        if (!($stream = ssh2_exec($connection, $cmd))) {
            throw new Exception('SSH command failed');
        }
        stream_set_blocking($stream, true);
        $data = "";
        while ($buf = fread($stream, 4096)) {
            $data .= $buf;
        }
        fclose($stream);
        return $data;
    } 
    
    $methods = array(
      'kex' => 'diffie-hellman-group1-sha1',
      'client_to_server' => array(
        'crypt' => '3des-cbc',
        'comp' => 'none'),
      'server_to_client' => array(
        'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
        'comp' => 'none'));
    
    $callbacks = array('disconnect' => 'my_ssh_disconnect');
    
    $connection = ssh2_connect('shell.example.com', 22, $methods, $callbacks);
    if (!$connection){
     die('Connection failed');
    }else{
    
       my_exec_cmd($connection, "ls -la");
    
    }
    
    ?>
    

    【讨论】:

    • 这会给我一个交互式 bash 提示吗?我不想发送一个命令,我想启动一个交互式 bash 会话。
    • 它是一个编程库而不是一个产品,因此它不能做你想要的,你需要开发它;可能您可以将它作为一个进程运行,保持连接打开并创建一个 HTML 页面,您可以从该页面发送命令请求并在服务器上使用 ssh2 运行它们,然后将响应取回并在屏幕上显示并等待对于下一个输入,这就是它变成交互式的方式。
    • 你会看到正常的 bash 提示吗?制表符完成工作吗?如果它在我发布的示例中不起作用,我不确定为什么特定的 SSH 库会允许它。
    • 不,它不允许制表符完成。如果你想要它,那么也有办法做到这一点。我可能误解了您的问题,因为我认为您正在寻找从监控站远程执行 SSH 到您的主机,这不适用于您发布的示例。
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多