Linux

Linux 程序在 Ubuntu 機器上執行,但不在 Unix 網路伺服器上

  • April 12, 2012

我已經下載了適用於 Linux 和 Windows 等的命令行程序“Whitaker’s Words”。

有一個名為 的主程序words。我試圖在我的 Ubuntu (11.10) 機器上的命令行上執行它並且它有效:

./words

當我在我的 Linux 網路伺服器(Linux 2.6.37-he-xeon-64gb+1 i686)上對其進行測試時,它執行良好。

然後我決定對原始碼進行一些更改並重新編譯它。為此,我使用了以下命令(後四個是支持程序):

gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static

結果程序再次在我的 Ubuntu 機器上正常執行,因為我可以在終端中看到正確的輸出。

但是當我嘗試使用 PHP 的shell_exec()or在我的網路伺服器上執行它時passthru(),根本沒有輸出!根據ldd,該程序statically linked應該真的可以工作,不是嗎?

我已經測試和調試了好幾個星期了,但我找不到任何原因。你能幫助我嗎?

您可以在此處獲取該程序:filedropper.com 上的下載連結

(我想這不是程式問題,因為我的問題只是:如何讓該程序在我的網路伺服器上執行?)

我想在以下系統上編譯程序:

Linux ubuntu 3.0.0-12-generic #20-Ubuntu x86 GNU/Linux

這是 Ubuntu 的最新五筆(32 位)版本。

ldd --version輸出ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13

我想在(網路伺服器)上執行編譯程序的系統:

Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux

ldd --version輸出ldd (GNU libc) 2.7

筆記:

如果我只是用預編譯的程序替換我自己的 Linux 程序,則可以排除伺服器端的錯誤,因為一切正常。

更新#1:

我嘗試在 Ubuntu 5.10 下的 VirtualBox 中執行該程序(在 Ubuntu 11.10 下執行良好),但它也不起作用。好消息,所以這絕對不是伺服器的錯。Ubuntu 5.10 剛剛說:floating point exception. 這有幫助嗎?為什麼在 Ubuntu 11.10 下有異常但沒有?

更新#2:

現在使用 GNAT 3.4 使用 Ubuntu 5.1 編譯。但是所有人都沒有希望 - 仍然沒有輸出,lddstatically linked(因為我已經這樣編譯了)並strace給出了相同的錯誤消息。這是什麼意思?有沒有文件失去?這是它不起作用的原因嗎?

execve("./words", ["./words"], [/* 15 vars */]) = 0
brk(0)                                  = 0x811e000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

當您從網路伺服器或任何其他程序執行任何作為 shell 轉義的操作時,環境設置很可能不會被應用。例如:PATH,LD_LIBRARY_PATH等變數有它們的預設設置或沒有任何設置,所以當你進行 shell 轉義時,你至少應該執行以下操作:

  • 通過完整路徑呼叫程序:例如/usr/local/bin/gnatmake/usr/local/bin/words
  • 獲取的輸出/usr/bin/env以確保在 shell 轉義中它具有正確的設置。檢查終端外殼中的相同設置。
  • 如果您可以控製網路伺服器,請嘗試將其作為您的 UID 執行以避免權限問題。
  • 檢查程序需要哪些庫(如果有)ldd /usr/local/bin/words

額外的可能性

不要直接執行程序,而是使用以下腳本:

#!/bin/sh
. /etc/profile

/usr/bin/env
pwd
./words 2>&1

並發布輸出。這將告訴您程序是否執行以及是否崩潰。

要檢查的另一件事是使用者www-data或正在執行的任何東西./words是否能夠訪問./words需要的數據庫(如果有)。

引用自:https://unix.stackexchange.com/questions/35646