Debian 和 pure-ftpd-mysql(MariaDB)上的 ISPConfig 3

Debian 和 pure-ftpd-mysql(MariaDB)上的 ISPConfig 3

我将 Mariadb 从 10.0 更新到 10.2,现在 pure-ftpd-mysql 无法重新启动:

service pure-ftpd-mysql restart

输出:

Job for pure-ftpd-mysql.service failed. See 'systemctl status pure-ftpd-mysql.service' and 'journalctl -xn' for details.

系统控制

systemctl status pure-ftpd-mysql.service -l

输出

● pure-ftpd-mysql.service - (null)
 Loaded: loaded (/etc/init.d/pure-ftpd-mysql)
 Active: failed (Result: exit-code) since Sun 2017-07-09 23:12:23 CEST; 53s ago
Process: 3887 ExecStart=/etc/init.d/pure-ftpd-mysql start (code=exited, status=127)

  Jul 09 23:12:23 s***.h****.net pure-ftpd-mysql[3887]: Starting ftp server: Running: /usr/sbin/pure-ftpd-mysql-virtualchroot -l mysql:/etc/pure-ftpd/db/mysql.conf -l pam -E -j -D -A -H -J ALL:!aNULL:!SSLv3 -O clf:/var/log/pure-ftpd/transfer.log -b -8 UTF-8 -Y 1 -u 1000 -B
  Jul 09 23:12:23 s***.h****.net pure-ftpd-mysql[3887]: /usr/sbin/pure-ftpd-mysql-virtualchroot: /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18: no version information available (required by /usr/sbin/pure-ftpd-mysql-virtualchroot)
  Jul 09 23:12:23 s***.h****.net pure-ftpd-mysql[3887]: /usr/sbin/pure-ftpd-mysql-virtualchroot: relocation error: /usr/sbin/pure-ftpd-mysql-virtualchroot: symbol my_make_scrambled_password, version libmysqlclient_18 not defined in file libmysqlclient.so.18 with link time reference
  Jul 09 23:12:23 s***.h****.net systemd[1]: pure-ftpd-mysql.service: control process exited, code=exited status=127
  Jul 09 23:12:23 s***.h****.net systemd[1]: Failed to start (null).
  Jul 09 23:12:23 s***.h****.net systemd[1]: Unit pure-ftpd-mysql.service entered failed state.

日志控制

-- Unit pure-ftpd-mysql.service has begun starting up.
Jul 09 23:15:22 s***.h****.net pure-ftpd-mysql[4170]: Starting ftp server: Running: /usr/sbin/pure-ftpd-mysql-virtualchroot -l mysql:/etc/pure-ftpd/db/mysql.conf -l pam -
Jul 09 23:15:22 s***.h****.net pure-ftpd-mysql[4170]: /usr/sbin/pure-ftpd-mysql-virtualchroot: /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18: no version information avai
Jul 09 23:15:22 s***.h****.net pure-ftpd-mysql[4170]: /usr/sbin/pure-ftpd-mysql-virtualchroot: relocation error: /usr/sbin/pure-ftpd-mysql-virtualchroot: symbol my_make_s
Jul 09 23:15:22 s***.h****.net systemd[1]: pure-ftpd-mysql.service: control process exited, code=exited status=127
Jul 09 23:15:22 s***.h****.net systemd[1]: Failed to start (null).
-- Subject: Unit pure-ftpd-mysql.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit pure-ftpd-mysql.service has failed.
-- 
-- The result is failed.
Jul 09 23:15:22 s***.h****.net systemd[1]: Unit pure-ftpd-mysql.service entered failed state.

mariadb-v 版本

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17831
Server version: 10.2.6-MariaDB-10.2.6+maria~jessie-log mariadb.org binary distribution

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Reading history-file /root/.mysql_history

输入“help;”或“\h”获取帮助。输入“\c”清除当前输入语句。

答案1

这绝对是 Debian pureftpd 软件包的一个已知错误。以下是完整的故事:在早期,大约 20 年前,libmysqlclient 没有版本符号,也没有限制它们的可见性。一些功能已记录在案 - 它们是客户端 API,我们承诺保持它们的稳定性,多年使用。其他功能没有记录,它们是内部的,没有承诺。但它们被导出并可用。后来,在 MariaDB 时代,RedHat 对 libmysqlclient 符号进行了版本控制。来自 libmysqlclient.so.16.0.0 的旧符号的版本为 libmysqlclient_16,较新的符号的版本为 libmysqlclient_18。内部符号被隐藏,只有少数例外。其中一个例外是 my_make_scrambled_pa​​ssword,因为 pureftpd 自从过去一切都被允许的时候就开始使用它。Debian 有一种不同的、更简单(且不太正确)的版本控制方法,所有符号都有 libmysqlclient_18 版本。在 MariaDB 中,我们设法创建了一个与这两种方法兼容的库。 my_make_scrambled_pa​​ssword 未被隐藏,注释为“for pureftpd”。my_make_scrambled_pa​​ssword 的使用已从 pureftpd 中删除,但 debian 版本尚未更新,因此,目前唯一的选择是从源代码安装:

apt-get remove pure-ftpd-mysql
cd /tmp
wget https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.47.tar.gz
tar xzvf pure-ftpd-1.0.47.tar.gz
cd pure-ftpd-1.0.47
./configure --with-tls --with-virtualchroot --with-puredb --with-quotas --with-throttling --with-mysql
make install-strip

此后系统开始工作

答案2

对于使用 Debian 9 (stretch) 和 pure-ftpd-mysql v1.0.43 以及 mariadb 10.3(我使用的是 Ispconfig)的用户,你可以从这个 gitlab

这是针对此错误进行了修补的同一版本

感谢 jisse44 提供此编译版本,并感谢 luckyluk3 提供howtoforge 上提供的链接

答案3

Debian Stretch 搭配 MariaDB 10.2
必下载https://packages.debian.org/stretch/amd64/libmariadb-dev/download 然后在 dpkg -i libmariadb-devxxxxx.deb ./configure --with-tls --with-virtualchroot --with-puredb --with-quotas --with-throttling --with-mysql make install-strip 之后 apt-get install libmariadb2

答案4

Debian 和 pure-ftpd-mysql(MariaDB)上的 ISPConfig 3

所以我尝试了 @spacebiker 的答案,并按照答案评论设法让服务运行 - 但是,出于某种奇怪的原因 - 它仍然无法正常工作。所以我清除了所有内容。
sudo apt purge pure-ftpd*以获得干净状态。
然后我应用了 @psyray 提供的修复程序,该链接指向 gitlab 用户的 howto jisse44,然后从 ISPConfig 重新配置了 pure-ftpd-mysql 服务php更新脚本:

https://gitlab.com/jisse44/pure-ftpd/blob/master/HowTo.txt

支持并感谢 gitlab.com/jisse44

为了完整性和更持久的答案,我将在这里引用所有内容

gitlab.com/jisse44/pure-ftpdHowTo.txt

We will rebuild the pure-ftp-1.0.43-3 package from official Debian sources, with patch applied:

You may need to install this packages before:
apt-get install build-essential fakeroot dpkg-dev autoconf-archive libcap2-dev default-libmysqlclient-dev po-debconf debhelper

cd /usr/local/src
mkdir pure-ftp-1.0.43-3
cd pure-ftp-1.0.43-3
wget http://deb.debian.org/debian/pool/main/p/pure-ftpd/pure-ftpd_1.0.43-3.dsc
wget http://deb.debian.org/debian/pool/main/p/pure-ftpd/pure-ftpd_1.0.43.orig.tar.gz
wget http://deb.debian.org/debian/pool/main/p/pure-ftpd/pure-ftpd_1.0.43-3.diff.gz
tar zxvf pure-ftpd_1.0.43.orig.tar.gz
mv pure-ftpd-1.0.43.orig/ pure-ftpd-1.0.43
mkdir pure-ftpd-1.0.43/debian
gunzip pure-ftpd_1.0.43-3.diff.gz
patch -p0 < pure-ftpd_1.0.43-3.diff
wget https://gitlab.com/jisse44/pure-ftpd/raw/master/configure.ac.diff
wget https://gitlab.com/jisse44/pure-ftpd/raw/master/log_mysql.c.diff
patch -p0 < configure.ac.diff
patch -p0 < log_mysql.c.diff
chmod +x pure-ftpd-1.0.43/debian/rules
cd pure-ftpd-1.0.43/
dpkg-buildpackage -uc -b
cd ..
dpkg -i pure-ftpd-mysql_1.0.43-3_amd64.deb pure-ftpd-common_1.0.43-3_all.deb
  • 如果失败/由于缺少某些软件包而出现错误 => 只需使用以下命令安装它们
    sudo apt install missingPackageMissing
  • 如果由于某些权限问题而失败 - 只需将 tu sudo 模式切换到 su
  • 这个过程需要很长时间(几分钟,这是一个完整的重建和安装过程),但之后 pure-ftpd-mysql 服务就可以启动了——而且 pure-ftpd-mysql 服务就是你所需要的——程序方面你只需要pure-ftpd-commonpure-ftpd-mysql

您不需要 pure-ftpd(服务),您只需要 pure-ftpd-mysql(服务)!

重新配置 ISPConfig 服务

在此之后,我最终运行了 pure-ftpd-mysql 服务,但显然它无法与 ISPConfig 的数据库一起使用。

您需要做的是在 ISPConfig 更新过程中重新配置服务 - 问题是,更新如果您已经更新了 ISPConfig,则脚本将不会运行。

因此你需要获取当前的 ispconfig 安装并运行php从此更新

  • 首先,您需要知道 ispconfig-interface 的 config.inc.php 的数据库连接信息
    => 您可以像这样找到它
    cat /usr/local/ispconfig/interface/lib/config.inc.php | grep --context=5 "db_password"
    (显示文件并仅过滤掉带有“db_password”+前后 5 行上下文的行)
  • 转到 tmp 目录cd /tmp
  • 下载当前安装wget https://ispconfig.org/downloads/ISPConfig-3.1.15p2.tar.gz
  • 解开它tar zxvf ISPConfig-3.1.15p2.tar.gz
  • 进入安装目录(必须)cd /tmp/ispconfig3_install/install/
  • 跑过PHP(重要)更新脚本php /tmp/ispconfig3_install/install/update.php
  • 在安装过程中当被问及reconfigure services回答是的!
  • config.inc.php当要求输入数据库密码(或其他数据库连接信息)时,请使用之前找到的信息

跑步service pure-ftpd-mysql restart,你会一切都好

gitlab 上的文件不再可用?

将来,可能会发生此 gitlab 补丁文件不存在的情况
https://gitlab.com/jisse44/pure-ftpd/raw/master/configure.ac.diff
https://gitlab.com/jisse44/pure-ftpd/raw/master/log_mysql.c.diff
但它们是纯文本,所以我也会将它们放在这里(我希望 debian 链接能够保留)

gitlab.com/jisse44/pure-ftp configure.ac.diff

--- pure-ftpd-1.0.43/configure.ac   2018-11-30 15:12:17.024657198 +0100
+++ pure-ftpd-1.0.43/configure.ac   2018-11-30 14:32:32.046763067 +0100
@@ -1317,7 +1317,6 @@
         AC_MSG_ERROR(Your MySQL client libraries aren't properly installed)
     ],[])
     AC_MSG_RESULT(yes)
-    AC_CHECK_FUNCS(my_make_scrambled_password make_scrambled_password)
   fi ])

 AC_ARG_WITH(pgsql,

gitlab.com/jisse44/pure-ftp log_mysql.c.diff

--- pure-ftpd-1.0.43/src/log_mysql.c    2018-11-30 15:07:55.673325041 +0100
+++ pure-ftpd-1.0.43/src/log_mysql.c    2018-11-30 14:34:45.002421780 +0100
@@ -470,33 +470,24 @@
     if (crypto_mysql != 0) {
         char scrambled_password[42]; /* 2 * 20 (sha1 hash size) + 2 */

-# ifdef HAVE_MY_MAKE_SCRAMBLED_PASSWORD
-        my_make_scrambled_password(scrambled_password, password,
-                                   strlen(password));
-# elif defined(HAVE_MAKE_SCRAMBLED_PASSWORD)
-        make_scrambled_password(scrambled_password, password);
-# else
-        {
-            SHA1_CTX       ctx;
-            unsigned char  h0[20], h1[20];
-            char          *p;
-
-            SHA1Init(&ctx);
-            SHA1Update(&ctx, password, strlen(password));
-            SHA1Final(h0, &ctx);
-            SHA1Init(&ctx);
-            SHA1Update(&ctx, h0, sizeof h0);
-            pure_memzero(h0, sizeof h0);
-            SHA1Final(h1, &ctx);
+        SHA1_CTX        ctx;
+        unsigned char  h0[20], h1[20];
+        char          *p;
+        SHA1Init(&ctx);
+        SHA1Update(&ctx, password, strlen(password));
+        SHA1Final(h0, &ctx);
+        SHA1Init(&ctx);
+        SHA1Update(&ctx, h0, sizeof h0);
+        pure_memzero(h0, sizeof h0);
+        SHA1Final(h1, &ctx);
             *scrambled_password = '*';
-            hexify(scrambled_password + 1U, h1,
-                   (sizeof scrambled_password) - 1U, sizeof h1);
-            *(p = scrambled_password) = '*';
-            while (*p++ != 0) {
-                *p = (char) toupper((unsigned char) *p);
-            }
+        hexify(scrambled_password + 1U, h1,
+               (sizeof scrambled_password) - 1U, sizeof h1);
+        *(p = scrambled_password) = '*';
+        while (*p++ != 0) {
+            *p = (char) toupper((unsigned char) *p);
         }
-# endif
+
         if (pure_strcmp(scrambled_password, spwd) == 0) {
             goto auth_ok;
         }

相关内容