Windows下ThinkPHP與Linux互通之exec或shell_exec問題

2021-01-09 ev學神

最近在做一個項目需要用到PHP調用Linux命令行腳本,在伺服器執行命令是可以的,但是當放在項目代碼中,在web中執行命令就不行了,調試了一天,終於可以了!

環境:centos7+nginx+mysql+php7.1

首先要解決的就是權限問題和用戶組問題:

一、查看啟動你php的進程的用戶是誰。

可以通過在命令行執行:ps -ef | grep php來看。或者在php中執行 echo exec('whoami') 來查看。centos下默認會是nobody。nobody默認沒有任何權限。

此時先自己添加一個用戶和組。

/usr/sbin/groupadd xxxx/usr/sbin/useradd -g xxxx -s /bin/bash xxxx

加完用戶後vim /etc/passwd 裡面就可以看到你添加的用戶了。

二、修改php啟動用戶為您剛添加的用戶

找到你得php安裝的地方的php-fpm.conf 。打開配置文件、編輯裡面的 user = xxxx; group = xxxx; (xxxx為您剛才添加的用戶)

重啟php-fpm(service php-fpm restart)

重複上面查看php啟動進程的用戶、應該已經變了。

三、添加剛才的用戶xxxx到sudoers裡面

visudo //修改/etc/sudoers的內容## Allow root to run any commands anywhere root ALL=(ALL) ALLxxxx ALL=(ALL) ALL //新添加這一行%xxxx ALL=(ALL) NOPASSWD: ALL //設置xxxx組下面的用戶使用sudo不需要輸入密碼

四、執行命令

到這裡已經可以正常在exec中使用sudo your command來執行命令了!!!!

當然、最好不要在生產線上環境使用哦!可以在內網機器上面實現!一切為了安全。

thinkphp3.2框架測試代碼

exec('/usr/local/bin/php test1.php 2>&1',$out,$res);

需要修改aa.py的權限和用戶組

chmod -R 777 aa.py

chown www:www aa.py

另外就是路徑問題,在框架裡要放在和入口文件一致的目錄下

五.配置開啟

exec()是php的一個禁用函數,所以我們解開

解決:

在php.ini 裡面 將disable_functions = …

裡面的 exec刪除

六.函數的使用

exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 18: …mmand [, array &output [, int &$return_var ]] );

下面來寫一個簡單的測試的demo 注意,要在linux環境下運行

七.首頁創建一個test.php

八.最後總結

這兩個函數都是執行Linux命令函數,不同的是獲取返回結果不一樣,exec只能獲取最後一行數據,shell_execu則可以獲取全部數據。使用exec函數的朋友注意了,如果你需要獲取全部返回信息,就應該使用shell_exec函數,如果命令執行結果只有一行返回信息,那哪個都行

相關焦點

  • PHP協程:並發 shell_exec
    在PHP程序中經常需要用shell_exec執行一些命令,而普通的shell_exec是阻塞的,如果命令執行時間過長,那可能會導致進程完全卡住。 在Swoole4協程環境下可以用Co::exec並發地執行很多命令。
  • Linux下find與exec的聯手幹大事
    比如說,我們想把項目文件夾裡的中間文件(*.o文件)找出來,再把它們全部刪除;再如,我們想把日誌文件夾下3天以上的日誌全部轉移到指定文件夾下;等等諸如此類的需求,還有非常多。像這樣的,我們想用find命令找到相關文件,再作進一步操作,該如何進行呢?這時候exec命令就派上用場。我們先來看看exec的基本用法。
  • 「乾貨」Linux環境下一句話反彈shell總結
    主機環境,而在獲取linux主機shell是我們經常需要做的是工作內容之一,其中經常會遇到以下幾個場景。相關的無數事情 ,其功能與netcat類似,不過據說可以看做netcat的加強版,事實上的確也是如此,nc應急比較久沒人維護了,確實顯得有些陳舊了,我這裡只簡單的介紹下怎麼使用它開啟監聽和反彈shell,其他詳細內容可以參加見文末的參考學習。
  • exec執行普通文件和解釋器文件的區別
    從一個問題開始本文引用地址:http://www.eepw.com.cn/article/201609/304180.htm首先要從項目中遇到的一個問題說起。編寫一個python文件test.py,文件test.py內容如下:#! /usr/bin/python....
  • Python中exec()作用域問題詳解
    首先,看一個使用exec的簡單的例子: content = &34;&34;Hello&34;&34; ​ if __name__ == &34;:     exec(content)     print(Tool())這個例子正常地返回了&34
  • Linux命令行與Shell腳本編程學習筆記19
    STDIN文件描述符代表shell的標準輸入。2. STDOUT文件描述符代表標準的shell輸出。3. STDERR文件描述符代表shell的標準錯誤輸出。4. STDERR文件描述符被設成2,你可以選擇值重定向錯誤消息,將該文件描述符值放在重定向符號前。該值必須緊緊地放在重定向符號前,否則不會工作。5.
  • Go語言中用 os/exec 執行命令的五種姿勢
    root 94 Nov 6 05:56 audit-rw-r--r-- 1 root root 185249234 Nov 28 2019 message-rw-r--r-- 2 root root 16374 Aug 28 10:13 boot.log不過在那之前,我卻發現一個小問題
  • 反彈shell的方法總結
    (reverse shell)?以下詳細介紹windows和Linux系統下反彈shell的幾種方式。一、linux下反彈shell實驗環境:(/bin/bash),也就是反彈一個shell給遠程,可以看到遠程已經成功反彈到了shell,並且可以執行命令。
  • python 使用exec的疑惑
    簡介exec 執行儲存在字符串或文件中的Python語句,相比於 eval,exec可以執行更複雜的 Python 代碼。exec函數功能強大,也很容易上手,在做未知變量定義時很好用。但是,當執行下面這段看似正常的代碼時卻報了錯def main(): exec(&34;) print(m)main()報錯信息:NameError: name &39; is not defined報錯信息提示m未定義,明明前一行剛用exec定義了m,下面卻報了未定義的錯
  • 乾貨 | 深度辨析 Python 的 eval() 與 exec()
    大部分函數是我們經常使用的,例如 print、open 與 dir,而有一些函數雖然不常用,但它們在某些場景下,卻能發揮出不一般的作用。內置函數們能夠被「提拔」出來,這就意味著它們皆有獨到之處,有用武之地。因此,掌握內置函數的用法,就成了我們應該點亮的技能。
  • Linux常見的持久化後門匯總
    0x00:前言 持久化後門是指當入侵者通過某種手段拿到伺服器的控制權之後,通過在伺服器上放置一些後門(腳本、進程、連接之類),來方便他以後持久性的入侵,簡單梳理一下日常遇見windows用的比較多的一些持久化方式方便以後排查問題使用.
  • Java通過shell腳本監控重啟服務
    思路java程序獲取linux進程信息可以通過shell腳本獲取進程信息、通過讀取proc文件系統獲取進程信息。 但是為了系統的安全性、方便維護等角度出發,更多的是java通過shell獲取和linux交互能力。
  • 巧用bash的exec進行進程PID記錄
    背景這兩天寫一個功能的時候,遇到一個問題,需要執行一個程序,並且把它的PID記錄到一個文件中,因為這程序可能會運行很多個,如果不把PID記錄下來,等會兒再來殺進程的時候,就不知道殺哪個了.但是這個程序本身並沒有實現記錄自己的PID到文件的功能.
  • 雲計算核心技術Docker教程:exec 命令詳解
    在docker客戶端命令行中我們可以輸入docker exec命令在運行的容器中執行相關命令。語法示例:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]-u :設置用戶名(format: <name|uid>[:<group|gid>])-w :指定容器內的目錄例如,在容器 mynginx 中以交互模式執行容器內 /root/runoob.sh 腳本:docker exec
  • 微信語音Linux-centos下ffmpeg安裝如何amr轉mp3播放
    p=1咱們程序語音存放目錄在 data/weixinrecord目錄下早期如果沒有安裝ffmpeg不會自動轉化微信語音格式,按照上面教程安裝成功後,程序會自動轉化微信微信格式,是否轉化成功可以在上面weixinrecord目錄下查看是否有mp3文件生成,mp3支持pc和wap播放。
  • Python中eval與exec 的相同點和不同點
    不同點 下面從關鍵字類型、第一個輸入參數、內調 compile 函數 這 3 個方面,討論 eval 和 exec 的不同之處。 1.
  • Linux提權備忘錄
    <(wget -q -O - https://raw.githubusercontent.com/diegotreitos/linux-smart-enumeration/master/lse.sh) -l2 -ibash <(curl -s https://raw.githubusercontent.com/diego-treitos/linux-smartenumeration
  • 黑客大神告訴你:Linux下的權限維持
    能否反彈shell,要根據目標的環境來嘗試,有可能bash無法直接反彈,但是python卻可以成功,還要注意白名單問題.實驗環境準備直接用kali,記得做好快照.在 3.4 版更改: spawn() 現在從子進程的 os.waitpid() 返回狀態值有時候提權以後終端也是會出現類似問題,一般這個方法可以解決.
  • JavaRuntime調用Shell腳本,常見的三類問題
    下面的例子中,Linux的/home/目錄下有一個刪除指定日期文件的腳本deletefile.sh,Java調用該腳本的方法如下。如果執行的shell腳本中有等待輸入命令,比如more操作,那麼在使用java進程讀取緩衝區內容的時候,會出現線程阻塞等待的問題。
  • java 執行shell命令及日誌收集避坑指南
    以下Runtime.exec()的實現:// java.lang.Runtime#exec    public Process exec(String[] cmdarray, String[] envp