在服务器上使用/安装库,不带sudo

时间:2014-01-21 17:19:20

标签: centos shared-libraries phantomjs freetype fontconfig

我的bluehost帐户授予ssh sudo访问权限,但没有yum,因此我无法使用freetype(它是CentOS服务器)。

我想运行一个依赖于phantomjs的脚本,但它失败了,显然是因为我无法访问fontconfig和{{1}}。联系他们,他们告诉我了

  

听起来我们需要两个字体库,但由于这不是我们为您提供的软件,因此对它的支持是有限的。

当询问是否无法做到时,他们回复了

  

这可能是可能的,但我们不会为它提供任何支持或为您设置它。

所以我的问题是如何独立安装这些库(最好已经编译/准备好),并让phantomjs使用它们?

2 个答案:

答案 0 :(得分:1)

一种可能性是将您需要的辅助库加载到“私有”位置,然后更改程序的标题以搜索该位置。

模仿您的目标环境

  • 在您自己的计算机上安装VM,该计算机运行与托管公司相同的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&# 39; | sort | uniq> my-required-libs

  • 登录远程服务器并复制文件;然后运行类似的东西:

    #!/ bin / sh的

      

    缺库     for $ in(< my-required-libs)     做       如果[-f" $ lib" ]       然后         echo" OK $ lib"       其他         echo" NO $ lib"         echo" $ 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 / your-app

    如果报告任何现有的RPATH,那么您希望使用:将路径〜/ my-app / lib预备到该RPATH - 例如如果chrpath --list显示/usr/lib/my-app/plugins,您可以使用/home/myself/my-app/lib:/usr/lib/my-app/plugins。在更常见的情况下,只需使用--replace和您已复制必备库的目录名称。

    chrpath --replace~ / my-app / lib / usr / bin / your-app

  • 现在,将带有新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和可插入的身份验证模块。

答案 1 :(得分:0)

如果您无法自行运行YUM来安装软件包,那么您需要托管公司的帮助。在Linux中你不能安装任何东西,除非你可以sudo或成为root。如果他们不会帮助你(从它的声音),那么我会转移到VPS而不是共享主机。这将使您可以灵活地运行YUM并在管理员级别对服务器进行更改。

*他们不会在共享计算机上为您提供sudo或root级别访问权限的原因是因为您在该点拥有管理员权限并且可以访问该服务器上的任何人的数据,甚至可以进行配置更改...卡片,存储等。

资料来源:多年来为一家大型托管公司工作