2011-06-21 67 views
36

我正在尋找一種免費的開源工具集,可以編譯各種「經典」腳本語言,例如Korn Shell,ksh,csh,bash等作爲可執行文件 - 如果腳本調用其他程序或可執行文件,則將它們包含在單個可執行文件中。如何將linux shell腳本編譯爲獨立的可執行程序* binary *(即不僅僅是例如chmod 755)?

原因:

  1. 混淆交付代碼給客戶,從而不向外界透露我們的知識產權 - 交付到客戶自己的機器/系統,我有無法控制什麼我可以設置有關訪問的權限,因此程序文件必須是二進制文件,因此在文本編輯器或查看器中查看時無法輕鬆看到工作。

  2. 爲客戶創建一個簡單部署的程序,而不需要/或最少量的任何外部依賴項。

我寧願簡單的東西,而不需要包管理器,因爲:

  1. 我不能依賴客戶的知識來進行(聯合國)包裝指令和

  2. 我不能依賴關於安裝軟件包(實際上來自第三方)的機器策略。

最簡單的優選的方法是能夠編譯到適當的機器代碼的單個可執行將運行開箱沒有任何依賴關係。

回答

32

完全滿足我需求的解決方案是SHC - 一種免費工具或CCsh商業工具。兩個編譯shell腳本到C,然後可以使用C編譯器編譯。

鏈接關於SHC:

約CCSH鏈接:

+0

我很可能會將此作爲接受的答案。 – therobyouknow

+0

我從來沒有聽說過這個,但它似乎是做OP的要求。請注意,它可能與bash或ksh的某些功能相似,但這對於OP的目的無關緊要。它也有一個函數來給編譯的二進制文件一個到期日期。 – ConcernedOfTunbridgeWells

+1

這是確定的答案。我一直在使用SHC來編譯我的shell腳本,如果我沒有弄錯的話,那是2002年左右。 SHC由Francisco Javier RosalesGarcía製作。雖然有點被告知,但它仍然有效。 –

3

您可以使用something like ofbsh對shell腳本進行混淆。不過,您不會輕易將其他程序捆綁到unix的單個可執行文件中。通常,安裝的方法是爲平臺的軟件包管理器製作一個軟件包(例如rpm,deb,pkg),或者提供一個tarball以解開相應的目錄。

如果您需要一個可解壓內容的可執行文件,您可以使用shell歸檔。看看shar(1)的文檔,看看它是否會得到你想要的

如果你確實需要一個腳本功能來粘合多個C程序,看看Tcl語言。它有一個旨在簡單包裝C程序的API,該程序可以看到argv[]樣式參數。您甚至可以將C代碼塊嵌入到自定義的Tcl解釋器中,並將其與各種Tcl腳本粘合在一起。

如果你確實需要使它變得不透明,你可以加密tcl腳本,並將所有東西包裝成不加密的tcl腳本到緩衝區,然後在其上運行Tcl解釋器。 Tcl可以接受來自文件或char*緩衝區的腳本,因此未加密的腳本永遠不必擊中文件系統。

+0

我寧願簡單的東西,而不需要包管理器:1)我可以不依賴於客戶的知識來執行這些指令,以及2)我不能依賴關於安裝軟件包(以及實際上來自第三方)的機器策略。最簡單的首選方法是能夠編譯適當的機器代碼一個單獨的可執行文件,該文件可以在沒有任何依賴的情況下運行。 – therobyouknow

+0

將此添加到答案。 – therobyouknow

+0

+1對於ofbsh,這在某些情況下可能會有用。雖然如果代碼看起來不可讀,它可能會損害客戶的認知,但也許客戶可能會擔心質量問題,除非向他們解釋代碼被故意混淆以致於無法理解它 - 這不一定有助於構建基於信任的關係,如果我們試圖隱藏第三方的東西,付費客戶。 – therobyouknow

5

您可以使用此:http://megastep.org/makeself/

這會產生一個shell腳本,自動提取捆綁tar.gz壓縮到臨時目錄中,然後就可以提取時運行任意命令。

使用此工具,您只能爲客戶端提供一個shell腳本。

該腳本會將您的ofbsh混淆的腳本和二進制文件解壓到/ tmp中,然後透明地運行它們。

+1

+1包裝獨立建議。 – therobyouknow

+0

接受的答案是使用SHC,如下所示:http://stackoverflow.com/questions/6423007/how-to-compile-a-linux-shell-script-to-be-a-standalone-executable-binary-ie/ 6438272#6438272 – therobyouknow

+0

@therobyouknow,接受的答案重新:SHC不支持捆綁在其他可執行文件中,您的問題說這是一個需求。 –

1

arx是一款出色的打包程序,您可能可以在其工作流程中集成混淆器。

2

shc

我已經修改了原來source並升級到新版本的一些功能添加和bug修復。 這是here

實例應用:

shc -f script.sh -o binary_name 

script.sh將被編譯到一個名爲binary_name

需要注意的是,你還需要必要的外殼被安裝在你的系統運行二進制這可執行文件

1

選項是提供給您:

  • 寫在你的代碼邏輯是,當代碼運行在第一次上一個盒子,它會檢查是否所有需要的軟件包存在。如果他們不這樣做,代碼會自動獲取包並自行安裝它們,而不要求用戶做任何事情。 (Y/N)「,用戶需要問的唯一問題是」是否可以繼續安裝上述軟件包?「。除此之外的任何東西都太多了。

  • 一旦上面的代碼完成(是的,我知道它可能不是那麼簡單的代碼,或者可能是這樣,我不知道你的編碼能力),複製和粘貼您完成的代碼到像kinglazy.com這樣的網站,並且會爲您生成一個實際的可執行文件。

有此特定選項的相當多的好處:

  • 是的,你將能夠在不暴露任何專有信息運行腳本的加密版本。
  • 沒有人可以嘗試「查看」你的腳本,因爲如果他們這樣做,他們什麼都看不到,但是不會加密的,加密的術語對他們不合理。
  • 沒有人可以嘗試修改您的腳本,因爲如果他們這樣做,該腳本將立即變得無法操作。
  • 沒有人可以在腳本上運行調試器來查看它的工作原理。如果他們這樣做,腳本將中止。
  • 此外,沒有人可以在同一臺服務器上創建腳本的副本。如果他們這樣做,它會中止,不會工作。它只允許用戶創建符號鏈接到腳本所在位置的原始位置。

我可能會錯過你所要求的一些東西,但我相信上述內容可以滿足你想要的很多部分。

不確定這是否適用於其他腳本,但它確實適用於shell腳本。

相關問題