Linux 程序在 Ubuntu 機器上執行,但不在 Unix 網路伺服器上
我已經下載了適用於 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 編譯。但是所有人都沒有希望 - 仍然沒有輸出,
ldd
說statically 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
需要的數據庫(如果有)。