1

我有一个bluehost帐户,可以让我ssh访问,但没有sudo,所以我不能使用yum(它是一个 CentOS 服务器)。

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

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

当询问是否没有办法时,他们回答说

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

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

4

2 回答 2

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

  • 登录远程服务器并将文件复制过来;然后运行类似:

    #!/bin/sh

    $(< my-required-libs ) 中 lib 的缺失库 do if [ -f "$lib" ] then echo "OK $lib" else echo "NO $lib" echo "$lib" >> missing-libs fi完毕

  • 复制missing-libs回您的虚拟主机和mkdir名为 eg 的文件夹~/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,那么您需要在该 RPATH 的路径 ~/my-app/lib 前面加上一个:- 例如,如果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和可插入的身份验证模块。

于 2014-01-21T19:12:28.430 回答
0

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

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

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

于 2014-01-21T17:25:32.810 回答