2014-01-21 65 views
1

我有bluehost,讓我ssh訪問權限的帳戶,但沒有sudo,所以我不能使用yum(這是一個CentOS的服務器)。利用/服務器安裝庫,沒有sudo

我想運行一個依賴於phantomjs的腳本,但它失敗了,顯然是因爲我沒有訪問freetypefontconfig。與他們聯繫,他們已經告訴我

聽起來我們既有所需的字體庫,但因爲這不是我們爲您提供的軟件,對它的支持是有限的。

當詢問是否有沒有辦法做到這一點,他們回覆說

這是可能的,但我們不會爲其提供任何支持或將其設置爲你。

所以我的問題是我怎樣才能獨立安裝這些庫(最好已編譯/就緒),並讓幻影使用它們?

回答

1

一種可能性是加載,你需要成爲一個「私人」位置的輔助庫,然後改變的頭您的程序來搜索該位置。

模仿你的目標環境

  • 在自己的機器上安裝一個虛擬機運行相同的CentOS的建設作爲託管公司。這意味着相同的CentOS版本和相同的CPU架構。 (cat /etc/*-release應該給你一個信息; uname -a會給你另一個信息,具體來說,你要確保你有一個類似/相同的C庫版本; /lib/libc.so.?應該是可執行的,並給你一些關於正在使用的C庫的細節)
  • 在虛擬主機上使用YUM安裝必需的軟件包。
  • 確保您的二進制可執行文件有效。

弄清楚什麼目標環境中缺少

  • 運行ldd /usr/bin/your-app獲取庫列表它所指。 具體來說,要清理該列表: ldd/usr/bin/your-app | cut -d'('-f 1 | cut -d'>'-f 2 | sed -e's,[\ t] ,, g'| sort | uniq> my-required-libs

  • Log到遠程服務器並複製文件;然後運行類似:

    #/ bin/sh的

    失蹤庫 在$ LIB(<我要求的函數庫), 做 if [-f「$ lib」] then echo「OK $ lib」 else echo「NO $ lib」 回聲「$ LIB」 >>失蹤庫 網絡 做

  • 複製missing-libs回到你的虛擬主機和一mkdir例如命名的文件夾~/my-app/lib;然後cp $(<missing-libs) /home/myself/my-app/lib

注意,你需要建立共享的主機上,確切路徑,包括用戶名等等 - 所以如果共享主機上的可寫目錄是/home/myself確保該目錄也位於虛擬主機上的/home/myself之下。

改變可執行文件的RPATH指向您的備選庫的位置

  • 找到你的應用程序的可執行文件,並改變使用chrpath其頭文件(你可能會需要yum install chrpath在你的虛擬機,因爲這是一個不尋常的程序需要):

    chrpath --list在/ usr/bin中/你的應用程序內

    如果報告任何現有RPATH,那麼你要預先考慮的路徑〜/我的應用程序內/ lib目錄到RP ATH與: - 例如如果chrpath --list顯示/usr/lib/my-app/plugins,則可以使用/home/myself/my-app/lib:/usr/lib/my-app/plugins。在更常見的情況下,只需使用--replace以及複製必備庫的目錄名稱即可。

    chrpath --replace〜/我的應用程序內/ lib目錄的/ usr/bin中/你的應用程序內

  • 現在,複製可執行文件與新的RPATH和目錄十足的證明庫與您共享主機。

這對於多用戶共享主機設置來說都是「友好的」,而不像其他解決方案使用的是其他解決方案。 chroot監獄。

或者,創建一個LD_LIBRARY_PATH包裝

如果chrpath不適合您的設置工作(例如極其嚴格的SELinux上下文),你可以跳過chrpath一步,而不是做這樣的事情:

mv ~/my-app/bin/my-app ~/my-app/bin/my-app.real 

,並進行包裝腳本像

#!/bin/sh 
    export LD_LIBRARY_PATH=/home/myself/my-app/lib 
    exec /home/myself/my-app/bin/my-app.real 

...以及與此替換原來的二進制文件的名稱腳本。

注意,在理論上,你幾乎可以代替任何圖書館這樣,但是當庫需要在特定地點的數據文件(例如/etc)或動態調用的系統位置的子庫(如/usr/lib64),你可能會面臨不得不在他們的./configure腳本中用新路徑重新編譯它們,或者編輯它們的源代碼,除了最極端的情況外,它們可能都不值得付出努力。

EG:以這種方式不友好重新定位的東西:libc和可插入認證模塊。

+0

我已經使用虛擬機了好幾年了,即使這樣,它也只是VMWare(簡稱)和Virtualbox。虛擬機不會使用一堆資源嗎?可能有一些我不知道的虛擬機解決方案。我正在考慮像[docker](https://www.docker.io/)這樣的東西,但它似乎也需要sudo。你爲什麼說'chroot'會對這個不友好(除了它需要sudo,所以它不會工作)? – user137369

+0

我成功地使用了這個解決方案的一個變種,這真的幫助我達到了這個目標。謝謝 – user137369

+0

對不起,說明一下,假設你沒有可用於模擬系統的備用機器,虛擬機在你的本地機器上是暫時的。而且,是的,'sudo'就是爲什麼'chroot'在這裏很難使用,以及需要扭曲來從監獄外部運行'chroot'ed app – BRFennPocock

0

聽起來你需要託管公司的幫助,如果你不能運行YUM來自己安裝軟件包的話。在Linux中,除非可以sudo或成爲root用戶,否則您不能安裝任何軟件。如果他們不會幫助你(從它的聲音),那麼我會轉向VPS而不是共享主機。這將使您能夠靈活地運行YUM,並在管理員級別對服務器進行所需的更改。

*他們不會在共享機器上爲您提供sudo或根級別訪問的原因是因爲您在此時擁有管理員權限,並且可以訪問該服務器上的任何人的數據,甚至可以進行配置更改以說出...網卡,存儲等

來源:供職於一家大型託管公司多年

+0

我當然明白他們爲什麼不這樣做,但這並不意味着它不能做到。可以通過'yum'獲得的軟件可以手動安裝而不需要root權限,它們只能鎖定到一個用戶(這裏沒有問題)。我不需要*'yum',我只需要那些庫 - 我問的是如何安裝它們。 – user137369

+0

您是否嘗試過從源代碼構建它?它可能會讓你這樣做,具體取決於安全設置。下一個問題是,如果他們說這是它顯示在phpinfo?像這樣:FreeType Support => enabled FreeType Linkage => with freetype FreeType Version => 2.3.7 –

+0

是的,freetype顯示在phpinfo中。我沒有嘗試從源代碼編譯,主要是因爲我不知道如何處理它們(如何設置它們以便phantomjs可以看到並使用它們)。 – user137369