2017-05-10 14 views
2

我試圖編寫一個實況控制檯/終端。 對於我使用phpseclib庫,起初我包括所有的東西&登錄:phpseclib實況控制檯/終端使用AJAX

use phpseclib\Net\SSH2; 

include('vendor/autoload.php'); 

$ssh = new SSH2('127.0.0.1'); 
if(!$ssh->login('user', 'pass')) { 
    exit('Login Failed'); 
} 

$ssh->setTimeout(1); 

後,我檢查了一個Ajax請求(顯示,用於執行):

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    if($_POST['request'] == 'read') { 
     echo $ssh->read(); 
    } elseif($_POST['request'] == 'write') { 
     $ssh->write($_POST['command']."\n"); 
     echo $ssh->read(); 
    } 
    exit(); 
} 

HTML標記:

<textarea readonly>...</textarea> 
<div> 
    <input type="text" placeholder="Command"> 
    <button> 
     Do it 
    </button> 
</div> 

一些jQuery的:

$('div button').click(function(e) { 
    $('div button').text('Loading...'); 
    e.preventDefault(); 
    $.ajax({ 
     type: 'POST', 
     url: 'index.php', 
     data: { 
      request: 'write', 
      command: $('div input').val() 
     }, 
     success: function(data) { 
      $('textarea').append(data); 
      $('textarea').scrollTop($('textarea')[0].scrollHeight - $('textarea').height()); 
      $('div input').val(''); 
      $('div button').text('Do it'); 
     } 
    }); 
}); 

的問題(一個或多個) 每次我要求CMD與寫()它會顯示Debian的登錄信息(時間,如果我更改使用CD當前目錄之後,我使用ls它重置 - 因爲我認爲新的登錄),也不知道如何創建一個間隔,所以我得到當前輸出不斷 - 前如果我ping一個網站。試過了。像這樣:

setInterval(function() { 
    $.ajax({ 
     type: 'POST', 
     url: 'index.php', 
     data: { 
      request: 'read' 
     }, 
     success: function(data) { 
      $('textarea').append(data); 
      $('textarea').scrollTop($('textarea')[0].scrollHeight - $('textarea').height()); 
     } 
    }); 
}, 300); 

我很感激任何幫助!

+0

看起來像是交叉發佈到https://github.com/phpseclib/phpseclib/issues/1124? – neubert

+0

@neubert是的,但只有一些鏈接,到目前爲止我可以使用:/ – Aaroniker

+0

你還在搞這個嗎? –

回答

1

我已經做到了!

我能夠做到這一點,但沒有SSH lib。你應該能夠接受這個答案並將其應用到現有的代碼中。

信息第一

是的,爲什麼你把看到的登錄,爲什麼目錄的變化不會持續存在是因爲你重新連接,並每次創建一個新的會話的原因。此外,由於PHP會在退出時刪除所有資源(您的SSH連接),因此無法通過序列化或其他任何方式使其持續存在。

基本上,你需要的是一個bash會話,你可以使用PHP進行交互。您可以使用netcatfifo以及一些PHP system()調用完成此操作。

例子有 「運行命令」 腳本(堅持!):

  • SSH到你的服務器。
  • 運行screen(這是爲了讓netcat命令保持運行在註銷後也)
  • 運行以下(持續監聽1234端口上的本地主機,寫入FIFO和貓的FIFO的內容到一個shell)。

    rm /tmp/f 
    mkfifo /tmp/f 
    cat /tmp/f | /bin/sh -i 2>&1 | nc -k -l 127.0.0.1 1234 > /tmp/f 
    
  • 使用CTRL + A + d從screen會話分離(或再拍SSH連接,保持上面的命令運行)

  • 創建以下PHP腳本,並使其可執行(chmod +x

    #!/usr/bin/php 
    <?php 
    $com = $argv[1]; 
    
    $junk = system('(echo "'.$com.'") | nc localhost 1234'); 
    $data = system('(echo "") | nc localhost 1234'); 
    
    echo $data 
    ?> 
    

腳本的說明:

所以,我們echo要碰上netcat(NC),它連接到其他持久netcat運行shell,命令的輸出寫入到fifo但不是fifo的當前內容之前的命令讀取寫入$junk變量。接下來我們echo ""和pipe到netcat,再次發送到其他netcat,寫入我們的fifo,只有當這個時候fifo被讀取,它包含我們運行的前一個命令的結果。整潔,嗯?腳本中使用的

例子:

[email protected]:/tmp# ./run_command.php "mkdir /tmp/stackoverflow" 
    $ $ $ [email protected]:/tmp# ./run_command.php "cd /tmp/stackoverflow" 
    $ $ [email protected]:/tmp# ./run_command.php "ls -al" 
    total 8 
    drwxrwxr-x 2 ttucker ttucker 4096 May 22 07:38 . 
    drwxrwxrwt 11 root root 4096 May 22 07:39 .. 
    $ $ $ [email protected]:/tmp# ./run_command.php "touch a b c d" 
    $ $ $ [email protected]:/tmp# ./run_command.php "ls -l" 
    total 0 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:39 a 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:39 b 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:39 c 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:39 d 
    $ $ $ [email protected]:/tmp# ./run_command.php "mkdir subdir" 
    $ $ $ [email protected]:/tmp# ./run_command.php "cd subdir" 
    $ $ [email protected]:/tmp# ./run_command.php "ls -al" 
    total 8 
    drwxrwxr-x 2 ttucker ttucker 4096 May 22 07:40 . 
    drwxrwxr-x 3 ttucker ttucker 4096 May 22 07:40 .. 
    $ $ $ [email protected]:/tmp# ./run_command.php "touch q w e r t y" 
    $ $ $ [email protected]:/tmp# ./run_command.php "ls -al" 
    total 8 
    drwxrwxr-x 2 ttucker ttucker 4096 May 22 07:40 . 
    drwxrwxr-x 3 ttucker ttucker 4096 May 22 07:40 .. 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 e 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 q 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 r 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 t 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 w 
    -rw-rw-r-- 1 ttucker ttucker 0 May 22 07:40 y 
    $ $ $ $ 

一車的東西:

它似乎運行命令時返回$幾次。這是因爲它在命令完成後仍然返回shell的$。我想你可以很容易地擦洗了這一點,但...

更多的想法/安全問題:

  • 這惡臭兩輪牛車的。
  • 網頁外殼的想法似乎是一個超級壞主意。
  • 請記住,系統上的任何其他用戶都可以通過管道命令進入端口1234,並以您正在運行此腳本的用戶身份運行它們。
  • 我有沒有提到我認爲這是一個壞主意?
+0

噢,解決這個問題的另一種方法是在每個命令之後'echo $ PWD>/tmp/mypwd',在每個命令之前'cd(cat/tmp/mypwd)'......它並不是一個真正的持久shell,但是......它會做到這一點。但是,我的回答更好,因爲您不必等待SSH – varlogtim

+0

哦,關於「ping!」,您將繼續運行任何程序時遇到問題。只要總是使用一個計數標誌與平。 'ping -c 10 derp.com' – varlogtim

+0

你也可以創建一個可以通過HTTP進行通信的Node.JS守護進程。快一點,增加了靈活性。 –