我有一个带有bluehost的帐户,该帐户可让我访问ssh
,但没有sudo
,所以我无法使用yum
(这是Centos Server)。
我想运行一个取决于phantomjs的脚本,但它失败了,显然是因为我无法访问freetype
和fontconfig
。与他们联系,他们告诉我
听起来我们都需要两个字体库,但是由于这不是我们为您提供的软件,因此支持它是有限的。
询问是否没有办法这样做时,他们回答
这可能是可能的,但是我们不会为此提供任何支持或为您设置它。
所以我的问题是我如何独立安装这些库(最好是已经编译/准备就绪),并让Phantomjs使用它们?
一种可能性是要加载所需的辅助库中的辅助库,然后更改程序的标题以搜索该位置。
模仿您的目标环境
- 在您自己的机器上安装与托管公司相同的CentOS构建的机器。这意味着相同的CentOS版本和相同的CPU架构。(
cat /etc/*-release
应该给您一个信息;uname -a
将为您提供另一个信息。具体来说,您要确保拥有相似/相同的C库版本;/lib/libc.so.?
应该可执行,并为您提供有关C库中的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-quired-libs)的lib 做 如果[-f" $ lib"] 然后 回声" OK $ lib" 别的 回声"否$ lib" 回声" $ lib">>失踪libs fi 完成
-
复制
missing-libs
返回您的虚拟主机和mkdir
一个名为e.g的文件夹。~/my-app/lib
;然后cp $(<missing-libs) /home/myself/my-app/lib
请注意,您 Will 需要在您的共享主机上创建此 Exact 路径,包括用户名等 - 因此,如果您在共享主机上的可写目录是/home/myself
确保此目录在虚拟主机上也位于/home/myself
下。
更改可执行文件的rpath以指向您的替代库位置
-
找到您的应用程序可执行文件并使用
chrpath
更改其标题(您可能需要在虚拟机中使用yum install chrpath
,因为这是一个不寻常的程序):chrpath-list/usr/bin/your-app
如果报告了任何现有的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
和可插入身份验证模块。
如果您无法运行百胜即可自己安装软件包,听起来您需要托管公司的帮助。在Linux中,除非您可以Sudo或成为根,否则您将无法安装任何内容。如果他们不会为您提供帮助(从听起来),那么我将移至VPS而不是共享主机。这将使您灵活地运行百胜并在管理级别上进行服务器所需的更改。
*他们不会在共享计算机上为您提供sudo或根级访问的原因是因为您当时具有管理员电源,并且可以在该服务器上访问任何人的数据,甚至可以更改配置,以说...网络卡,存储等
资料来源:在一家大型托管公司工作了很多年