Lua新奇玩法,讓Nginx也可以執行linux的shell命令

2020-10-31 迷神筆記

圖/文:迷神

讓Nginx使用url訪問的模式,也可以執行linux的shell命令是一件很爽的事情。本文就是使用小巧的lua腳本,Nginx我使用春哥的 openresty,當然如果你自己使用原版nginx,那需要編譯下lua環境。

如果大家怕麻煩,可以使用的寶塔安裝的openresty環境。

一、我們先安裝:sockproc

sockproc 是一個伺服器程序, 偵測socket ,unix 或者 tcp , 並把收到的命令,傳遞給子進程執行,執行完畢後,把結果返回給客戶端

git clone https://github.com/juce/sockproc #git克隆代碼cd sockprocmake #編譯./sockproc /tmp/cmd.sockchmod 0666 /tmp/cmd.sock

二、下載lua-resty-shell模塊

一個很小巧的非阻塞的shell執行庫,用來配合openresty 使用,具體大家可以去github上看他使用的的demo

git clone https://github.com/juce/lua-resty-shellcd lua-resty-shellcp lib/resty/shell.lua /openresty/lualib/resty/ #這是你的項目路徑

創建lua腳本

vi /openresty/lualib/cmd.lua --創建文件command.lua,輸入下面代碼local shell = require "resty.shell" local args = { socket = "unix:/tmp/cmd.sock", --這是第一步的unxi socket }local status, out, err = shell.execute("ls", args) --ls 是想調用的命令, ngx.header.content_type = "text/plain"ngx.say("Result:\n" .. out) -- 命令輸出結果

三、寫入nginx配置

vi /openresty/nginx/conf/nginx.conf#增加一個localtion 配置location = /api/ls { content_by_lua_file /southtv/openresty/lualib/cmd.lua; }

然後重啟下openresty,通過http://你的IP/api/ls 就可以訪問啦。

相關焦點

  • 在nginx中使用強大的lua實現定向需求
    然而nginx也提供了使用lua的模塊,並且提供了相關的指令用來執行lua代碼。使用lua在某些情況可以代替後臺的功能實現,直接在nginx中調用lua代碼實現後臺邏輯,比如登錄攔截等功能就可以使用lua實現。
  • 通過lua進行nginx的權限控制
    nginx_lua的安裝nginx使用luajit進行編譯安裝使用openresty進行yum安裝openresty中將lua和nginx進行封裝,詳情可查看openresty官網openresty相關啟動命令service openresty startngx_lua的相關api使用說明及相關使用ngx_lua github地址lua基本語法
  • 利用 tee 命令調試shell腳本
    在編寫shell腳本時,調試是個比較麻煩的事,特別是涉及到多層管道命令的時候,會產生多個中間結果,tee命令的作用是從標準輸入中讀取數據寫入標準輸出或文件中,利用它可以從管道中讀取中間結果並寫入本地臨時文件中
  • Nginx安裝(入門)手冊
    ## linux安裝linux下面有兩種安裝方式,二進位安裝、通過源碼編譯安裝。### 二進位安裝不同的平臺都有支持,具體參考[官網說明](https://nginx.org/en/linux_packages.html),這裡以centos7為示例,使用yum進行安裝。
  • Linux反彈shell命令解析
    今天在看spark stream的sample樣例的時候看到linux的萬金油命令nc。搜索相關的內容突然發現一個很好玩的用處就是反彈shell.下面我們就來講講反彈shell 1.
  • 用lua擴展你的Nginx web
    >make install PREFIX=/opt/luajitexport LUAJIT_LIB=/opt/luajit/libexport LUAJIT_INC=/opt/luajit/include/luajit-2.0( 如果不設置環境變量,在nginx編譯的時候會找不到lua模塊:.
  • Linux命令行與Shell腳本編程學習筆記19
    STDIN文件描述符代表shell的標準輸入。2. STDOUT文件描述符代表標準的shell輸出。3. STDERR文件描述符代表shell的標準錯誤輸出。4. STDERR文件描述符被設成2,你可以選擇值重定向錯誤消息,將該文件描述符值放在重定向符號前。該值必須緊緊地放在重定向符號前,否則不會工作。5.
  • 基於 Nginx+lua+Memcache 實現灰度發布
    灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。:當用戶請求到達前端代理服務Nginx,內嵌的lua模塊解析Nginx配置文件中的lua腳本代碼;Lua變量獲得客戶端IP位址,去查詢memcached緩存內是否有該鍵值,如果有返回值執行@client_test,否則執行@client。
  • Linux命令行與Shell腳本編程學習筆記20
    trap命令允許你來指定shell腳本要觀察哪些linux信號並從shell中攔截。如果腳本收到了trap命令中列出的信號,它會阻止它被shell處理,而在本地處理它。2. trap命令的格式是: trap commands signals3. 當&符放到命令後時,它會將命令和bash shell分離開來,並將它作為系統上的獨立後臺進程運行。
  • Java通過shell腳本監控重啟服務
    簡介最近運維人員提出需求,增加一個運維頁面, 查詢當前的業務進程信息包括:進程名稱、啟動命令、啟動時間、運行時間等,可以通過頁面點擊重啟按鈕,可以重啟後端的一系列系統進程。思路java程序獲取linux進程信息可以通過shell腳本獲取進程信息、通過讀取proc文件系統獲取進程信息。 但是為了系統的安全性、方便維護等角度出發,更多的是java通過shell獲取和linux交互能力。
  • Bash技巧:一個可以通過命令簡寫執行對應命令的Shell腳本
    本篇文章介紹一個在 Linux 系統上可以通過命令簡寫執行對應命令的 shell 腳本。假設這個 shell 腳本的名稱為 tinyshell.sh。所以子 shell 還是可以被 CTRL-C 終止. 即,指定信號處理 命令會運行在子 shell 下,可以用 CTRL-C 終止運行在子 shell 下的命令.
  • Windows下ThinkPHP與Linux互通之exec或shell_exec問題
    最近在做一個項目需要用到PHP調用Linux命令行腳本,在伺服器執行命令是可以的,但是當放在項目代碼中,在web中執行命令就不行了,調試了一天,終於可以了!環境:centos7+nginx+mysql+php7.1首先要解決的就是權限問題和用戶組問題:一、查看啟動你php的進程的用戶是誰。可以通過在命令行執行:ps -ef | grep php來看。或者在php中執行 echo exec('whoami') 來查看。centos下默認會是nobody。nobody默認沒有任何權限。
  • linux下nginx 1.19.5安裝及配置使用
    百度搜索nginx,進入官網,下載linux下的版本文件2.通過Xftp工具,將Windows中下載的文件上傳到linux系統的磁碟中3.進入linux,使用命令終端進行依賴包安裝yum -y install gcc zlib zlib-devel pcre-devel
  • Linux命令行與Shell腳本編程學習筆記8
    環境變量可以作為數組使用,數組是能夠存儲多個值的變量。值可按單個值或整個數組來引用。給某個環境變量設置多個值,可以把值放在括號裡,值與值之間用空格分隔。要引用一個單獨的數組元素,必須要用代表它在數組中位置的數值索引值。數值要用方括號括起來。要顯示整個數組變量,可用星號作為通配符放在索引值的位置。可以用unset命令來刪除數組中的某個值。
  • Linux shell命令總結大全
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言Linux shell命令應該算是非常入門的東西,權當給大家做個記錄。命令會更快$killall -9 xxx3、令我困擾的是我用的那個沒有killall然後我做了下面的操作$adb shell ps |grep speech |awk '{print $2}' > 1.txt
  • CentOS 7安裝openresty和kong流程&經驗分享(基於Nginx)
    那麼nginx和這兩個應用之間的關係是怎樣的呢,借用簡書上一個博主的概述:Nginx、OpenRestry、Kong這三個項目緊密相連: Nginx是模塊化設計的反向代理軟體,C語言開發; OpenResty是以Nginx為核心的Web開發平臺,可以解析執行Lua腳本(OpenResty與Lua的關係,類似於Jvm與Java,不過Java可以做的事情太多了,OpenResty主要用來做Web、API
  • 如何用GNU time查找Linux命令或進程的執行時間
    使用 time 程序,我們可以輕鬆地測量 Linux 作業系統中命令或程序的總執行時間。 time 命令在大多數 Linux 發行版中都有預裝,所以你不必去安裝它。ls 命令的總執行時間。你可以將 ls 替換為任何命令或進程,以查找總的執行時間。
  • 編寫Linux Shell腳本的最佳實踐
    太長要分行 在調用某些程序的時候,參數可能會很長,這時候為了保證較好的閱讀體驗,我們可以用反斜槓來分行: ./configure –prefix=/usr –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf  注意在反斜槓前有個空格。
  • 如何使用pv命令監控Linux命令的執行進度
    也有的時候你執行的命令掛起了,而你只能猜測命令執行的實際情況。 通常 linux 命令不提供和進度相關的信息,而這些信息特別重要,尤其當你只有有限的時間時。然而這並不意味著你是無助的——現在有一個命令,pv,它會顯示當前在命令行執行的命令的進度信息。在本文我們會討論它並用幾個簡單的例子說明其特性。
  • 給你的Nginx加個防火牆
    介紹ngx_lua_waf 是一個高性能的輕量級 web 應用防火牆,基於 lua-nginx-module。增加 ngx_devel_kit、lua-nginx-module 這兩個模塊,然後再修改 nginx 配置來運行 ngx_lua_waf。