2015-12-22 135 views
9

我正在使用PHP编写常见服务器管理任务的快捷方式(我正在使用deployer.org,但这不应该很重要)。我想添加一个任务,用于在SSH服务器之后启动交互式bash提示符。例如,你可以运行“./dep ssh”(其中“dep”是一个PHP脚本),这与运行例如。 “ssh user @ server”来自终端。有没有办法在PHP中做到这一点?对于上下文,我有大约5个我经常想要SSH进入的服务器,或者读取日志,或者复制文件等等,所以我想要这个快捷方式。从PHP启动交互式SSH bash会话

最近我已经能够得到的是这样的:

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

这使您可以发送命令,以及从bash的,但你看不到正常的bash提示符或获取标签完成。我需要类似这样的东西,但所有正常的bash功能都能正常工作。

+0

我正在解决方案:)。希望我能尽快完成。 – robert

+0

为什么不把你的快捷方式作为别名写在.bashrc中? –

+0

我在编写我的所有任务时都保持一致,因此所有开发人员都可以轻松完成任务。我希望能够运行“./dep ssh stage”,“./dep release stage”,“。/ del日志阶段“交互ssh登台服务器,释放和查看日志分别('释放'任务是一个非交互式的一组SSH任务) – fstr

回答

1

如果你只是希望做网络浏览器SSH这就是你可能会寻找以下产品的一个东西:

  • 谷歌的安全Shell扩展Chrome和铬
  • Anyterm
  • Ajaxterm
  • 门一分
  • 的WebMux
  • WEBSHELL
  • EC2Box
  • 钥匙箱
  • 钥匙箱,OpenShift
  • Mist.io

这里is a link,你可能会喜欢考虑看看。

+0

也许我不清楚,但这将是我从命令行运行的PHP脚本。 – fstr

+1

@fstr这意味着你将不得不自己开发它,ssh2具有开发类似于在命令行中使用的SSH实用程序的bash所需的所有功能,请参阅[此链接](http ://phpseclib.sourceforge.net/ssh/intro.html)并开始开发。 – anand

-1

看看this ssh2模块在PHP中,文档是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"); 

} 

?> 
+1

这是否给我一个互动的bash提示,但我不 – fstr

+0

其编程库不是一个产品,因此它不能做你想要的东西,你需要开发它;也许你可以把它作为一个进程来运行保持连接打开并创建一个HTML页面,您可以在其中发送命令请求,然后在服务器上使用'ssh2'运行它们,然后将响应回显并显示在屏幕上,等待下一个输入,即它变成交互 – anand

+1

你会看到正常的bash提示符吗?请问tab完成工作吗?如果它不能在我发布的示例中工作,我不确定为什么特定的SSH库允许它。 – fstr

0
#!/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的参数和选项(即用户输入命令或文件名)。