簡體   English   中英

在PHP中打開Linux終端命令

[英]Open Linux terminal command in PHP

我有一台在Linux上運行的服務器,它可以執行12個節點的命令(其中12個運行Linux的計算機)。 我最近在服務器上下載了PHP,以創建可以通過打開特定的PHP文件來執行命令的網頁。

我使用了exec()passthru()shell_​exec()system() system()是唯一一個返回我的代碼的一部分。 我希望PHP在linux中像開放的termainal命令一樣,我無法弄清楚如何做到這一點!

下面是一個現在正在發生的事情的例子(Linux直接與PHP):當直接使用linux open terminal命令時:

user@wizard:/home/hyperwall/Desktop> /usr/local/bin/chbg -mt

我得到一個輸出:

The following settings will be used:
  option = mtsu   COLOR =    IMAGE = imagehereyouknow!
  NODES  = LOCAL
and additional code to send it to 12 nodes.

現在使用PHP:

switch($_REQUEST['do'])
{ case 'test':
    echo system('/usr/local/bin/chbg -mt');
    break;
}

輸出:

The following settings will be used:
  option = mtsu   COLOR =    IMAGE = imagehereyouknow!
  NODES  = LOCAL

然后停下來! 任何人都有解釋發生了什么? 以及如何解決它? 只有系統顯示部分代碼,其他功能不顯示任何內容!

我的第一個想法是它可能是關於std和輸出錯誤的東西。 有些軟件會在std out上轉儲一些信息,有些則在std錯誤中轉儲。 當您沒有將std錯誤重定向到std out時,大多數系統調用僅返回stdout部分。 聽起來這就是為什么你在終端看到整個輸出而不能在系統調用中。 所以試試吧

 /usr/local/bin/chbg -mt 2>&1  

編輯:也可以通過臨時工作,嘗試其他一些事情。 例如,將輸出重定向到腳本旁邊的文件並在執行命令后讀取其內容,這樣就可以使用exec:

exec("usr/local/bin/chbg -mt 2>&1 > chbg_out");
//Then start reading chbg_out and see is it work

Edit2此外,為什么其他人不為你工作也沒有意義。 例如,這段用c編寫的代碼,在stderr中轉儲一個字符串,stdout中還有其他代碼。

#include <stdio.h>
#include<stdlib.h>
int main()
{

    fputs("\nerr\nrro\nrrr\n",stderr);
    fputs("\nou\nuu\nuttt\n",stdout);
    return 0;
}

和這個PHP腳本,嘗試通過exec運行:

<?php

exec("/tmp/ctest",&$result);

foreach ( $result as $v )
{
echo $v;
}
#output ouuuuttt
?>

看到它仍然傾倒了標准輸出。 但它沒有收到stderr。 現在考慮一下:

<?php

exec("/tmp/ctest 2>&1",&$result);

foreach ( $result as $v )
{
    echo $v;
}
//output: errrrorrrouuuuttt
?>

看,這次我們得到了整個產出。

這次系統:

<?php
     echo system("/tmp/ctest 2>&1");
     //output: err rro rrr ou uu uttt uttt
?>

等等 ...

也許你的chbg -mt將額外的代碼寫入stderr而不是stdout? 嘗試在php中執行你的腳本,如下所示:

/usr/local/bin/chbg -mt 2>&1

其他回復適用於通用建議。 但在這種特定情況下,您似乎正在嘗試更改桌面背景。 由於“用戶上下文”,這需要許多特殊注意事項:

  • 首先,您的Web服務器可能以不同的用戶身份運行,因此無權更改您的桌面。

  • 其次,程序可能需要來自用戶上下文的一些環境變量。 例如,X程序需要一個DISPLAY變量,ssh-agent需要SSH_AGENT_PIDSSH_AUTH_SOCK等。我不太了解更改背景,但我猜它涉及D-Bus,這可能需要像DBUS_SESSION_BUS_ADDRESSKONSOLE_DBUS_SERVICE這樣的東西, KONSOLE_DBUS_SESSIONKONSOLE_DBUS_WINDOW 可能還有很多其他人。 請注意,每次登錄時都會更改其中一些變量,因此您無法在PHP端對其進行硬編碼。

對於測試,直接從用戶會話啟動自己的Web服務器可能更簡單。 (即不要使用系統,它必須像你一樣運行。你需要在備用端口上運行它,如8080)。 您手動啟動的Web服務器將具有所需的所有“上下文”。 我會提到websocketd,因為它剛剛出來,看起來很整潔。

對於“生產”,您可能需要始終在用戶上下文中運行守護程序,並讓Web服務器與該守護程序通信以在用戶上下文中“完成任務”。

PHP的system只返回最后一行執行:

返回值:成功時返回命令輸出的最后一行,失敗時返回FALSE。

您很可能想要使用execpassthru exec有一個可選參數,用於將輸出放入數組中。 您可以內爆輸出並使用它來回顯它。

switch($_REQUEST['do'])
{ case 'test':
    exec('/usr/local/bin/chbg -mt', $output);
    echo implode('\n', $output); // Could use <br /> if HTML output is desired
    break;
}

我認為執行的結果,可以在用戶之間進行更改。 首先,嘗試將PHP腳本直接運行到終端php yourScript.php
如果它按預期運行,請轉到Apache服務並更新它以使用您自己的憑據運行

您正在嘗試更改當前登錄用戶的背景...他們正在使用桌面時。 就像我正在輸入這條消息一樣。 我最小化了我的瀏覽器,“我的桌面背景不同”。 希望這是一個重要的事情,比如它在反應堆或過熱時變紅。

無論如何我的回答:

而不是嘗試遠程連接和運行作為個人用戶的項目。 設置每個用戶在重復計時器上運行bash腳本(在他們自己的帳戶中,在他們自己的shell中)。 每隔10分鍾說一次。 讓它從網絡位置選擇SAME文件../somenetworkshare/backgrounds/images/current.png

然后你可以通過在/somenetworkshare/backgrounds/images/current.png中更改圖像本身來更新所有節點(1到100萬)

我剛才寫了一些東西就是這樣 - 你可以運行命令解釋器(/ bin / sh),發送命令,回讀響應,發送更多命令等。它使用proc_open()來打開子進程和跟它說話。

它位於http://github.com/andrasq/quicklib,Quick / Proc / Process.php

使用它會看起來像(如果你有一個靈活的自動加載器會更容易;我也在Quicklib中編寫了其中一個):

include 'lib/Quick/Proc/Exception.php';
include 'lib/Quick/Proc/Exists.php';
include 'lib/Quick/Proc/Process.php';

$proc = new Quick_Proc_Process("/bin/sh");
$proc->putInput("pwd\n");
$lines = $proc->getOutputLines($nlines = 10, $timeoutSec = 0.2);
echo $lines[0];
$proc->putInput("date\n");
$lines = $proc->getOutputLines(1, 0.2);
echo $lines[0];

輸出

/home/andras/quicklib
Sat Feb 21 01:50:39 EST 2015

php和進程之間的通信單元是換行終止行。 所有命令必須以換行符終止,並且所有響應都以行為單位檢索。 不要忘記換行符,之后很難識別。

我正在開發一個項目,它使用機器A上的終端A輸出到機器B上的終端B,現在都使用Linux。 我沒有看到它提到,但也許你可以使用重定向,這在你的網絡服務器中是這樣的:

switch($_REQUEST['do'])
 { case 'test':
    #process ID on the target (12345, 12346 etc)
    echo system('/usr/local/bin/chbg -mt > /proc/<processID>/fd/1'); 
    #OR
    #device file on the target (pts/0,tty0, etc) 
    echo system('/usr/local/bin/chbg -mt > /dev/<TTY-TYPE>/<TTYNUM>');
    break;
 }

絕對需要正確設置權限才能使其正常工作。 終端中的命令“mesg y”也可以幫助...希望有所幫助。

PHP打開標簽“

[英]PHP open tag “<?php” appears in the terminal/command line (Yii2 framework)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM