{"id":125,"date":"2026-01-22T08:29:37","date_gmt":"2026-01-22T08:29:37","guid":{"rendered":"https:\/\/blog.gpst.net.cn:4008\/?p=125"},"modified":"2026-01-28T06:24:16","modified_gmt":"2026-01-28T06:24:16","slug":"%e8%87%aa%e5%8a%a8%e5%8c%96%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85%e5%b9%b6%e9%85%8d%e7%bd%ae-vsftpd%ef%bc%882-3-4%ef%bc%89-openldap%ef%bc%882-4-37%ef%bc%89-pam_ldap-%e8%ae%a4","status":"publish","type":"post","link":"https:\/\/opshub.com.cn\/?p=125","title":{"rendered":"\u81ea\u52a8\u5316\u90e8\u7f72\u2014\u2014\u5b89\u88c5\u5e76\u914d\u7f6e vsftpd\uff082.3.4\uff09+ OpenLDAP\uff082.4.37\uff09+ pam_ldap \u8ba4\u8bc1\u4f53\u7cfb\uff0c\u5b9e\u73b0\u57fa\u4e8e LDAP \u8ba4\u8bc1\u7684 FTP \u670d\u52a1\u7684bash shell\u811a\u672c"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\u811a\u672c\u6838\u5fc3\u529f\u80fd\u603b\u89c8<\/h3>\n\n\n\n<p>\u811a\u672c\u901a\u8fc7\u4e0d\u540c\u6267\u884c\u53c2\u6570\uff08<code>install_all<\/code>\/<code>config_all<\/code>\/<code>smart_all<\/code> \u7b49\uff09\u5b9e\u73b0\u6a21\u5757\u5316\u90e8\u7f72\uff0c\u6574\u4f53\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5bc6\u94a5\u9a8c\u8bc1<\/strong>\uff1a\u6267\u884c\u4efb\u4f55\u6838\u5fc3\u64cd\u4f5c\u524d\u9700\u8f93\u5165\u6b63\u786e\u5bc6\u94a5\uff0c\u5426\u5219\u76f4\u63a5\u9000\u51fa\uff1b<\/li>\n\n\n\n<li><strong>\u57fa\u7840\u4f9d\u8d56\u5b89\u88c5<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5b89\u88c5 BerkeleyDB\uff08OpenLDAP \u4f9d\u8d56\uff09\u2192 \u5b89\u88c5 OpenLDAP\uff1b<\/li>\n\n\n\n<li>\u5b89\u88c5 vsftpd\uff082.3.4\uff09\uff0c\u81ea\u52a8\u68c0\u6d4b\u5e76\u542f\u7528 TCP Wrappers\/SSL \u652f\u6301\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>pam_ldap \u5b89\u88c5\u4e0e\u914d\u7f6e<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u751f\u6210\u5927\u91cf\u968f\u673a\u9690\u85cf\u76ee\u5f55\uff0c\u5c06 LDAP \u8ba4\u8bc1\u914d\u7f6e\u6587\u4ef6\u9690\u85cf\u5728\u968f\u673a\u76ee\u5f55\u4e2d\uff1b<\/li>\n\n\n\n<li>\u914d\u7f6e pam_ldap \u5173\u8054 OpenLDAP\uff0c\u5b9e\u73b0 FTP \u8ba4\u8bc1\u5bf9\u63a5 LDAP \u670d\u52a1\u5668\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>vsftpd \u5b9a\u5236\u5316\u914d\u7f6e<\/strong>\uff1a\u5f00\u542f\u865a\u62df\u7528\u6237\u3001LDAP \u8ba4\u8bc1\u3001\u88ab\u52a8\u6a21\u5f0f\u7b49\uff0c\u7ed1\u5b9a PAM \u8ba4\u8bc1\u6a21\u5757\uff1b<\/li>\n\n\n\n<li><strong>\u670d\u52a1\u7ba1\u7406<\/strong>\uff1a\u91cd\u542f vsftpd \u670d\u52a1\uff0c\u786e\u4fdd\u914d\u7f6e\u751f\u6548\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n##############################################################################\n# \u811a\u672c\u540d\u79f0: ftp_ldap_deploy.sh\n# \u811a\u672c\u529f\u80fd: \u81ea\u52a8\u5316\u5b89\u88c5\u914d\u7f6evsftpd + openldap + pam_ldap\uff0c\u5b9e\u73b0LDAP\u8ba4\u8bc1\u7684FTP\u670d\u52a1\n# \u7248\u672c\u4fe1\u606f: version:201401171318 since:201401161923\n# \u5f00\u53d1\u4fe1\u606f: Production tools are designed by rattlesnake\u00ae Automation Institute\n# \u5f00\u53d1\u4eba\u5458: Design and R &amp; D engineers: Mr. Zhang\n# \u4f7f\u7528\u8bf4\u660e: \n#   1. \u5b89\u88c5\u5168\u90e8\u7ec4\u4ef6: .\/\u811a\u672c\u540d install_all (\u9700\u8f93\u5165\u6267\u884c\u5bc6\u94a5)\n#   2. \u914d\u7f6e\u5168\u90e8\u7ec4\u4ef6: .\/\u811a\u672c\u540d config_all (\u9700\u8f93\u5165\u6267\u884c\u5bc6\u94a5)\n#   3. \u5b89\u88c5+\u914d\u7f6e+\u91cd\u542f: .\/\u811a\u672c\u540d smart_all (\u9700\u8f93\u5165\u6267\u884c\u5bc6\u94a5)\n#   4. \u91cd\u542fFTP\u670d\u52a1: .\/\u811a\u672c\u540d ftprestart \u6216 ftpstart\n# \u6ce8\u610f\u4e8b\u9879: \n#   1. \u6267\u884c\u811a\u672c\u9700\u8981root\u6743\u9650\n#   2. \u4f9d\u8d56\u5185\u7f51\u5730\u5740172.16.0.123\u7684\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u670d\u52a1\n#   3. \u90e8\u5206\u64cd\u4f5c\u4f1a\u4fee\u6539\u7cfb\u7edf\u6587\u4ef6\uff0c\u5efa\u8bae\u5728\u6d4b\u8bd5\u73af\u5883\u9a8c\u8bc1\u540e\u4f7f\u7528\n##############################################################################\n\n# \u6253\u5370\u7248\u672c\u548c\u5f00\u53d1\u4fe1\u606f\necho \"version:201401171318 since:201401161923\"\necho \"Production tools are designed by rattlesnake\u00ae Automation Institute\"\necho \"Design and R &amp; D engineers: Mr. Zhang\"\n\n# ======================== \u6838\u5fc3\u51fd\u6570\u5b9a\u4e49 ========================\n\n# \u51fd\u6570\u540d: install_openldap\n# \u529f\u80fd: \u5b89\u88c5OpenLDAP\uff08\u4f9d\u8d56BerkeleyDB\uff09\n# \u6b65\u9aa4: \n#   1. \u4e0b\u8f7dBerkeleyDB\u548cOpenLDAP\u8f6f\u4ef6\u5305\u5e76\u6821\u9a8cMD5\n#   2. \u7f16\u8bd1\u5b89\u88c5BerkeleyDB\n#   3. \u7f16\u8bd1\u5b89\u88c5OpenLDAP\uff08\u5173\u8054BerkeleyDB\uff09\n#   4. \u6821\u9a8c\u5b89\u88c5\u7ed3\u679c\uff0c\u5931\u8d25\u5219\u9000\u51fa\u811a\u672c\ninstall_openldap() {\n    # \u5207\u6362\u5230\u4e34\u65f6\u76ee\u5f55\n    cd \/tmp\n    # \u9759\u9ed8\u4e0b\u8f7dBerkeleyDB\u8f6f\u4ef6\u5305\uff08-N:\u53ea\u4e0b\u66f4\u65b0\u7684 -c:\u65ad\u70b9\u7eed\u4f20 -q:\u9759\u9ed8\uff09\n    wget -N -c -q http:\/\/172.16.0.123\/tools\/ywgj\/db-4.5.20.tar.gz &amp;&gt;\/dev\/null\n    \n    # \u6821\u9a8c\u6587\u4ef6\u662f\u5426\u5b58\u5728\u4e14MD5\u503c\u6b63\u786e\n    if &#091;&#091; -f \"db-4.5.20.tar.gz\" ]] &amp;&amp; &#091;&#091; \"$(md5sum db-4.5.20.tar.gz | awk '{print $1}')\" == \"b0f1c777708cb8e9d37fb47e7ed3312d\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mdb-4.5.20.tar.gz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u5b8c\u6574\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u6b63\u786e\uff01\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41mdb-4.5.20.tar.gz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u6b8b\u7f3a\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u9519\u8bef\uff01\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    # \u9759\u9ed8\u4e0b\u8f7dOpenLDAP\u8f6f\u4ef6\u5305\n    wget -N -c -q http:\/\/172.16.0.123\/tools\/ywgj\/openldap-2.4.37.tgz &amp;&gt;\/dev\/null\n    # \u6821\u9a8cOpenLDAP\u8f6f\u4ef6\u5305\n    if &#091;&#091; -f \"openldap-2.4.37.tgz\" ]] &amp;&amp; &#091;&#091; \"$(md5sum openldap-2.4.37.tgz | awk '{print $1}')\" == \"49f0e9a77ddd0d49f88bf7233a51efa8\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mopenldap-2.4.37.tgz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u5b8c\u6574\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u6b63\u786e\uff01\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41mopenldap-2.4.37.tgz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u6b8b\u7f3a\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u9519\u8bef\uff01\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    # \u89e3\u538bBerkeleyDB\uff08\u9759\u9ed8\u6267\u884c\uff09\n    tar zxf db-4.5.20.tar.gz &amp;&gt;\/dev\/null\n    cd db-4.5.20\n    cd build_unix\/\n    # \u914d\u7f6e\u3001\u7f16\u8bd1\u3001\u5b89\u88c5BerkeleyDB\uff08\u6307\u5b9a\u5b89\u88c5\u8def\u5f84\uff0c\u9759\u9ed8\u6267\u884c\uff09\n    ..\/dist\/configure --prefix=\/usr\/local\/BerkeleyDB-4.5.20 &amp;&gt;\/dev\/null &amp;&amp; make &amp;&gt;\/dev\/null &amp;&amp; make install &amp;&gt;\/dev\/null &amp;&amp; touch -f \/usr\/local\/BerkeleyDB-4.5.20\/$(date +\"%Y%m%d.%s\")\n\n    # \u83b7\u53d6\u5b89\u88c5\u76ee\u5f55\u4fee\u6539\u65f6\u95f4\u6233\uff08\u7528\u4e8e\u6821\u9a8c\u5b89\u88c5\u662f\u5426\u5b8c\u6210\uff09\n    modifyt1=$(date -d \"$(stat \/usr\/local\/BerkeleyDB-4.5.20\/ | awk '\/^Modify:\/{print $2,$3}')\" +%s | egrep -o \"&#091;0-9]+\")\n    # \u83b7\u53d6\u5b89\u88c5\u65f6\u521b\u5efa\u7684\u65f6\u95f4\u6233\u6587\u4ef6\u7684\u65f6\u95f4\u6233\n    modifyt2=$(find \/usr\/local\/BerkeleyDB-4.5.20\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | awk '{if(NR==1){gsub(\".*\\\\.\",\"\",$0);print $0}}' 2&gt;\/dev\/null | egrep -o \"&#091;0-9]+\")\n    \n    # \u8ba1\u7b97\u4e24\u4e2a\u65f6\u95f4\u6233\u7684\u5dee\u503c\n    if &#091;&#091; -n \"${modifyt1}\" ]] &amp;&amp; &#091;&#091; -n \"${modifyt2}\" ]]; then\n        modifyt2j1=$((modifyt1 - modifyt2))\n    else\n        modifyt2j1=630720000  # \u8d4b\u4e00\u4e2a\u8d85\u5927\u503c\uff0c\u8868\u793a\u6821\u9a8c\u5931\u8d25\n    fi\n\n    # \u6821\u9a8cBerkeleyDB\u5b89\u88c5\u7ed3\u679c\uff08\u8fd4\u56de\u503c0\u3001\u76ee\u5f55\u5b58\u5728\u3001\u65f6\u95f4\u5dee\u2264300\u79d2\uff09\n    if &#091;&#091; \"$?\" == \"0\" ]] &amp;&amp; &#091;&#091; -d \"\/usr\/local\/BerkeleyDB-4.5.20\" ]] &amp;&amp; &#091;&#091; \"${modifyt2j1}\" -le \"300\" ]]; then\n        # \u5efa\u7acb\u5e93\u6587\u4ef6\u8f6f\u94fe\u63a5\n        ln -svf \/usr\/local\/BerkeleyDB-4.5.20\/lib\/libdb* \/usr\/local\/lib$(getconf LONG_BIT | sed 's\/32\/\/g')\/ &amp;&gt;\/dev\/null\n        echo -e \"\\e&#091;1;4;5;42mBerkeleyDB\u5b89\u88c5\u6210\u529f\uff01\\e&#091;1;0;m\"\n        # \u6e05\u7406\u4e34\u65f6\u6587\u4ef6\n        \\rm -rf \/tmp\/db-4.5.20* &amp;&gt;\/dev\/null\n    else\n        echo -e \"\\e&#091;1;4;5;41mBerkeleyDB\u5b89\u88c5\u5931\u8d25\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/db-4.5.20* &amp;&gt;\/dev\/null\n        exit 1\n    fi\n\n    # \u5b89\u88c5OpenLDAP\n    cd \/tmp\n    tar zxf openldap-2.4.37.tgz &amp;&gt;\/dev\/null\n    cd openldap-2.4.37\n    # \u8bbe\u7f6e\u7f16\u8bd1\u73af\u5883\u53d8\u91cf\uff0c\u5173\u8054BerkeleyDB\uff0c\u7136\u540e\u914d\u7f6e\u3001\u7f16\u8bd1\u3001\u5b89\u88c5\n    env CPPFLAGS=\"-I\/usr\/local\/BerkeleyDB-4.5.20\/include\" LDFLAGS=\"-L\/usr\/local\/BerkeleyDB-4.5.20\/lib\" LD_LIBRARY_PATH=\"\/usr\/local\/BerkeleyDB-4.5.20\/lib\" .\/configure --prefix=\/usr\/local\/openldap &amp;&gt;\/dev\/null &amp;&amp; make &amp;&gt;\/dev\/null &amp;&amp; make install &amp;&gt;\/dev\/null &amp;&amp; touch -f \/usr\/local\/openldap\/$(date +\"%Y%m%d.%s\")\n\n    # \u6821\u9a8cOpenLDAP\u5b89\u88c5\u65f6\u95f4\u6233\n    modifyt1=$(date -d \"$(stat \/usr\/local\/openldap\/ | awk '\/^Modify:\/{print $2,$3}')\" +%s | egrep -o \"&#091;0-9]+\")\n    modifyt2=$(find \/usr\/local\/openldap\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | awk '{if(NR==1){gsub(\".*\\\\.\",\"\",$0);print $0}}' 2&gt;\/dev\/null | egrep -o \"&#091;0-9]+\")\n    \n    if &#091;&#091; -n \"${modifyt1}\" ]] &amp;&amp; &#091;&#091; -n \"${modifyt2}\" ]]; then\n        modifyt2j1=$((modifyt1 - modifyt2))\n    else\n        modifyt2j1=630720000\n    fi\n\n    # \u6821\u9a8cOpenLDAP\u5b89\u88c5\u7ed3\u679c\n    if &#091;&#091; \"$?\" == \"0\" ]] &amp;&amp; &#091;&#091; -d \"\/usr\/local\/openldap\" ]] &amp;&amp; &#091;&#091; \"${modifyt2j1}\" -le \"300\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mopenldap\u5b89\u88c5\u6210\u529f\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/openldap-2.4.37* &amp;&gt;\/dev\/null\n    else\n        echo -e \"\\e&#091;1;4;5;41mopenldap\u5b89\u88c5\u5931\u8d25\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/openldap-2.4.37* &amp;&gt;\/dev\/null\n        exit 1\n    fi\n}\n\n# \u51fd\u6570\u540d: install_vsftpd\n# \u529f\u80fd: \u5b89\u88c5vsftpd FTP\u670d\u52a1\n# \u6b65\u9aa4:\n#   1. \u4e0b\u8f7dvsftpd\u8f6f\u4ef6\u5305\u5e76\u6821\u9a8cMD5\n#   2. \u5b89\u88c5tcp_wrappers\u4f9d\u8d56\uff08\u53ef\u9009\uff09\n#   3. \u68c0\u6d4bSSL\u5e93\uff0c\u51b3\u5b9a\u662f\u5426\u5f00\u542fSSL\u652f\u6301\n#   4. \u5b9a\u5236\u7f16\u8bd1\u914d\u7f6e\uff0c\u7f16\u8bd1\u5b89\u88c5vsftpd\n#   5. \u6821\u9a8c\u5b89\u88c5\u7ed3\u679c\uff0c\u5931\u8d25\u5219\u9000\u51fa\ninstall_vsftpd() {\n    cd \/tmp\n    # \u4e0b\u8f7dvsftpd\u8f6f\u4ef6\u5305\u5e76\u6821\u9a8c\n    wget -N -c -q http:\/\/172.16.0.123\/tools\/ywgj\/vsftpd-2.3.4.tar.gz &amp;&gt;\/dev\/null\n    if &#091;&#091; -f \"vsftpd-2.3.4.tar.gz\" ]] &amp;&amp; &#091;&#091; \"$(md5sum vsftpd-2.3.4.tar.gz | awk '{print $1}')\" == \"2ea5d19978710527bb7444d93b67767a\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mvsftpd-2.3.4.tar.gz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u5b8c\u6574\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u6b63\u786e\uff01\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41mvsftpd-2.3.4.tar.gz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u6b8b\u7f3a\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u9519\u8bef\uff01\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    # \u68c0\u67e5tcp_wrappers\u5e93\u548c\u5934\u6587\u4ef6\u662f\u5426\u5b58\u5728\n    if &#091;&#091; \"$(ls -l \/lib$(getconf LONG_BIT | sed 's\/32\/\/')\/libwrap.* | awk '{print $9}' | sed 's\/\\(\\t\\|\\ \\)\\+$\/\/' | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"1\" ]] &amp;&amp; &#091;&#091; -f \"\/usr\/include\/tcpd.h\" ]] &amp;&amp; &#091;&#091; \"$(find \/usr\/include\/ -maxdepth 1 -iregex \".*\/tcpd\\.h$\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -gt \"0\" ]]; then\n        :  # \u5b58\u5728\u5219\u4e0d\u64cd\u4f5c\n    else\n        # \u4e0d\u5b58\u5728\u5219\u5b89\u88c5tcp_wrappers\n        yum -y install tcp_wrappers &amp;&gt;\/dev\/null\n        wait\n    fi\n\n    # \u518d\u6b21\u68c0\u67e5tcp_wrappers\u662f\u5426\u5b89\u88c5\u6210\u529f\n    if &#091;&#091; \"$(ls -l \/usr\/lib$(getconf LONG_BIT | sed 's\/32\/\/')\/libwrap.* | awk '{print $9}' | sed 's\/\\(\\t\\|\\ \\)\\+$\/\/' | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"1\" ]] &amp;&amp; &#091;&#091; -f \"\/usr\/include\/tcpd.h\" ]] &amp;&amp; &#091;&#091; \"$(find \/usr\/include\/ -maxdepth 1 -iregex \".*\/tcpd\\.h$\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -gt \"0\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mtcp_wrappers\u5b89\u88c5\u6210\u529f\uff0c\u81ea\u52a8\u5f00\u542fvsftpd\u7684tcp_wrappers\u652f\u6301\uff01\\e&#091;1;0;m\"\n        twk=1  # \u6807\u8bb0\u5f00\u542ftcp_wrappers\u652f\u6301\n    else\n        echo -e \"\\e&#091;1;4;5;43mtcp_wrappers\u5b89\u88c5\u5931\u8d25\uff0c\u81ea\u52a8\u5ffd\u7565vsftpd\u7684tcp_wrappers\u652f\u6301\uff01\\e&#091;1;0;m\"\n        twk=0  # \u6807\u8bb0\u5173\u95edtcp_wrappers\u652f\u6301\n    fi\n\n    # \u89e3\u538bvsftpd\u6e90\u7801\u5305\n    tar zxf vsftpd-2.3.4.tar.gz &amp;&gt;\/dev\/null\n    cd vsftpd-2.3.4\n\n    # \u5982\u679ctcp_wrappers\u53ef\u7528\uff0c\u4fee\u6539\u7f16\u8bd1\u914d\u7f6e\u5f00\u542f\u652f\u6301\n    if &#091;&#091; \"$twk\" == \"1\" ]]; then\n        sed -i '\/VSF_BUILD_TCPWRAPPERS\/s\/undef\/define\/' builddefs.h &amp;&gt;\/dev\/null\n    else\n        :\n    fi\n\n    # \u68c0\u67e5SSL\u5e93\u548c\u5934\u6587\u4ef6\u662f\u5426\u5b58\u5728\n    if &#091;&#091; \"$(find \/lib$(getconf LONG_BIT | sed 's\/32\/\/g')\/ -maxdepth 1 -iregex \".*\/libssl.*\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"1\" ]] &amp;&amp; &#091;&#091; \"$(find \/usr\/include\/openssl\/ -maxdepth 1 -iregex \".*\/.*\\.h\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"75\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mssl\u5e93\u6587\u4ef6\u548c\u5934\u6587\u4ef6\u51c6\u5907\u5c31\u7eea\uff0c\u81ea\u52a8\u5f00\u542fvsftpd\u7684ssl\u52a0\u5bc6\u652f\u6301\uff01\\e&#091;1;0;m\"\n        sslk=1  # \u6807\u8bb0\u5f00\u542fSSL\u652f\u6301\n    elif &#091;&#091; \"$(find \/usr\/lib$(getconf LONG_BIT | sed 's\/32\/\/g')\/ -maxdepth 1 -iregex \".*\/libssl.*\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"1\" ]] &amp;&amp; &#091;&#091; \"$(find \/usr\/include\/openssl\/ -maxdepth 1 -iregex \".*\/.*\\.h\" | xargs lsattr -d 2&gt;&amp;1 | grep -vc \"\u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55\\|No such file or directory\\|While reading flags on\")\" -ge \"75\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mssl\u5e93\u6587\u4ef6\u548c\u5934\u6587\u4ef6\u51c6\u5907\u5c31\u7eea\uff0c\u81ea\u52a8\u5f00\u542fvsftpd\u7684ssl\u52a0\u5bc6\u652f\u6301\uff01\\e&#091;1;0;m\"\n        sslk=1\n    else\n        echo -e \"\\e&#091;1;4;5;43mssl\u5e93\u6587\u4ef6\u548c\u5934\u6587\u4ef6\u51c6\u5907\u6b20\u7f3a\uff0c\u81ea\u52a8\u5ffd\u7565vsftpd\u7684ssl\u52a0\u5bc6\u652f\u6301\uff01\\e&#091;1;0;m\"\n        sslk=0  # \u6807\u8bb0\u5173\u95edSSL\u652f\u6301\n    fi\n\n    # \u5982\u679cSSL\u53ef\u7528\uff0c\u4fee\u6539\u7f16\u8bd1\u914d\u7f6e\u5f00\u542f\u652f\u6301\n    if &#091;&#091; \"$sslk\" == \"1\" ]]; then\n        sed -i '\/VSF_BUILD_SSL\/s\/undef\/define\/' builddefs.h &amp;&gt;\/dev\/null\n    else\n        :\n    fi\n\n    # \u521b\u5efavsftpd\u5b89\u88c5\u76ee\u5f55\u7ed3\u6784\n    mkdir -p \/usr\/local\/vsftpd\/{etc,sbin,man,virtual} &amp;&gt;\/dev\/null\n    mkdir -p \/usr\/local\/vsftpd\/man\/man{1..8} &amp;&gt;\/dev\/null\n\n    # \u4fee\u6539\u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n    sed -i '\/VSFTP_DEFAULT_CONFIG\/s\/\\(\\#define VSFTP_DEFAULT_CONFIG\\(\\t\\|\\ \\)\\+\\)\\(.*\\)\/\\1\\\"\\\/usr\\\/local\\\/vsftpd\\\/etc\\\/vsftpd.conf\\\"\/' defs.h &amp;&gt;\/dev\/null\n\n    # \u91cd\u5199Makefile\u6587\u4ef6\uff08\u5b9a\u5236\u7f16\u8bd1\u548c\u5b89\u88c5\u8def\u5f84\uff09\n    cat &gt;.\/Makefile &lt;&lt;EOF\n# Makefile for systems with GNU tools\nCC      =       gcc\nINSTALL =       install\nIFLAGS  = -idirafter dummyinc\n#CFLAGS = -g\nCFLAGS  =       -O2 -Wall -W -Wshadow #-pedantic -Werror -Wconversion\n \nLIBS    =       \\`.\/vsf_findlibs.sh\\`\nLINK    =       -Wl,-s\n \nOBJS    =       main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o \\\\\n                tunables.o ftpdataio.o secbuf.o ls.o \\\\\n                postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o \\\\\n    banner.o filestr.o parseconf.o secutil.o \\\\\n    ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o \\\\\n    tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o \\\\\n    ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o\n \n \n.c.o:\n        \\$(CC) -c \\$*.c \\$(CFLAGS) \\$(IFLAGS)\n \nvsftpd: \\$(OBJS)\n        \\$(CC) -o vsftpd \\$(OBJS) \\$(LINK) \\$(LIBS) \\$(LDFLAGS)\n \ninstall:\n        if &#091; -x \/usr\/local\/vsftpd\/sbin ]; then \\\\\n                \\$(INSTALL) -m 755 vsftpd \/usr\/local\/vsftpd\/sbin\/vsftpd; \\\\\n        else \\\n                \\$(INSTALL) -m 755 vsftpd \/usr\/sbin\/vsftpd; fi\n        if &#091; -x \/usr\/local\/vsftpd\/man ]; then \\\\\n                \\$(INSTALL) -m 644 vsftpd.8 \/usr\/local\/vsftpd\/man\/man8\/vsftpd.8; \\\\\n                \\$(INSTALL) -m 644 vsftpd.conf.5 \/usr\/local\/vsftpd\/man\/man5\/vsftpd.conf.5; \\\\\n        elif &#091; -x \/usr\/share\/man ]; then \\\\\n                \\$(INSTALL) -m 644 vsftpd.8 \/usr\/share\/man\/man8\/vsftpd.8; \\\\\n                \\$(INSTALL) -m 644 vsftpd.conf.5 \/usr\/share\/man\/man5\/vsftpd.conf.5; \\\\\n        else \\\\\n                \\$(INSTALL) -m 644 vsftpd.8 \/usr\/man\/man8\/vsftpd.8; \\\\\n                \\$(INSTALL) -m 644 vsftpd.conf.5 \/usr\/man\/man5\/vsftpd.conf.5; fi\n        if &#091; -x \/etc\/xinetd.d ]; then \\\\\n                \\$(INSTALL) -m 644 xinetd.d\/vsftpd \/etc\/xinetd.d\/vsftpd; fi\n \nclean:\n        rm -f *.o *.swp vsftpd\nEOF\n    # \u683c\u5f0f\u5316Makefile\uff08\u7edf\u4e00\u7528tab\u7f29\u8fdb\uff09\n    sed -i 's\/\\(\\t\\|\\ \\)\\+\/\\t\/g' Makefile &amp;&gt;\/dev\/null\n\n    # \u6839\u636e\u7cfb\u7edf\u4f4d\u6570\u8c03\u6574\u7f16\u8bd1\u914d\u7f6e\uff0864\u4f4d\u7cfb\u7edf\uff09\n    if &#091;&#091; \"$(getconf LONG_BIT)\" == \"64\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42m\u81ea\u52a8\u542f\u7528vsftpd\u7684x86_64\u7f16\u8bd1\u652f\u6301\uff01\\e&#091;1;0;m\"\n        sed -i 's\/\\(\\\/lib\\)\\\/\/\\164\\\/\/g' vsf_findlibs.sh &amp;&gt;\/dev\/null\n    else\n        echo -e \"\\e&#091;1;4;5;44m\u81ea\u52a8\u542f\u7528vsftpd\u7684x86\u7f16\u8bd1\u652f\u6301\uff01\\e&#091;1;0;m\"\n        :\n    fi\n\n    # \u6e05\u7406\u65e7\u7684\u65f6\u95f4\u6233\u6587\u4ef6\n    if &#091;&#091; -d \"\/usr\/local\/vsftpd\" ]]; then\n        find \/usr\/local\/vsftpd\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | xargs rm -f &amp;&gt;\/dev\/null\n    fi\n\n    # \u7f16\u8bd1\u5b89\u88c5vsftpd\u5e76\u521b\u5efa\u65f6\u95f4\u6233\u6587\u4ef6\n    make &amp;&gt;\/dev\/null &amp;&amp; make install &amp;&gt;\/dev\/null &amp;&amp; touch -f \/usr\/local\/vsftpd\/$(date +\"%Y%m%d.%s\")\n\n    # \u6821\u9a8c\u5b89\u88c5\u65f6\u95f4\u6233\n    modifyt1=$(date -d \"$(stat \/usr\/local\/vsftpd\/ | awk '\/^Modify:\/{print $2,$3}')\" +%s | egrep -o \"&#091;0-9]+\")\n    modifyt2=$(find \/usr\/local\/vsftpd\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | awk '{if(NR==1){gsub(\".*\\\\.\",\"\",$0);print $0}}' 2&gt;\/dev\/null | egrep -o \"&#091;0-9]+\")\n    \n    if &#091;&#091; -n \"${modifyt1}\" ]] &amp;&amp; &#091;&#091; -n \"${modifyt2}\" ]]; then\n        modifyt2j1=$((modifyt1 - modifyt2))\n    else\n        modifyt2j1=630720000\n    fi\n\n    # \u6821\u9a8cvsftpd\u5b89\u88c5\u7ed3\u679c\n    if &#091;&#091; \"$?\" == \"0\" ]] &amp;&amp; &#091;&#091; -d \"\/usr\/local\/vsftpd\" ]] &amp;&amp; &#091;&#091; \"${modifyt2j1}\" -le \"300\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mvsftpd\u5b89\u88c5\u6210\u529f\uff01\\e&#091;1;0;m\"\n        # \u7981\u7528xinetd\u7ba1\u7406\u7684vsftpd\uff08\u4f7f\u7528\u72ec\u7acb\u8fd0\u884c\u6a21\u5f0f\uff09\n        sed -i '\/disable.*=\/s\/no\/yes\/' \/etc\/xinetd.d\/vsftpd &amp;&gt;\/dev\/null\n        \\rm -rf \/tmp\/vsftpd-2.3.4* &amp;&gt;\/dev\/null\n    else\n        echo -e \"\\e&#091;1;4;5;41mvsftpd\u5b89\u88c5\u5931\u8d25\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/vsftpd-2.3.4* &amp;&gt;\/dev\/null\n        exit 1\n    fi\n}\n\n# \u51fd\u6570\u540d: makerandomdir\n# \u529f\u80fd: \u751f\u6210\u968f\u673a\u76ee\u5f55\u7ed3\u6784\uff0c\u7528\u4e8e\u5b58\u653epam_ldap\u914d\u7f6e\u6587\u4ef6\n# \u6b65\u9aa4:\n#   1. \u5b9a\u4e49\u968f\u673a\u5b57\u7b26\u96c6\n#   2. \u6e05\u7406\u65e7\u7684\u968f\u673a\u76ee\u5f55\n#   3. \u751f\u621021\u4e2a\u968f\u673a\u76ee\u5f55\n#   4. \u968f\u673a\u9009\u62e9\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u914d\u7f6e\u6587\u4ef6\u5b58\u653e\u4f4d\u7f6e\n#   5. \u6821\u9a8c\u76ee\u5f55\u751f\u6210\u7ed3\u679c\nmakerandomdir() {\n    # \u5b9a\u4e49\u968f\u673a\u5b57\u7b26\u96c6\uff08\u5b57\u6bcd+\u6570\u5b57\uff09\n    rand0m1=\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n    rand0m2=\"0123456789012345678901234567890123456789012345678901\"\n    \n    # \u6e05\u7406\u65e7\u7684\u968f\u673a\u76ee\u5f55\n    find \/usr\/share\/doc\/libsgigml2\/ -maxdepth 1 -type d -iregex \".*\/\\.\\.\\.&#091;a-zA-Z0-9]\" 2&gt;\/dev\/null | xargs rm -rf &amp;&gt;\/dev\/null\n    \n    # \u751f\u621021\u4e2a\u968f\u673a\u76ee\u5f55\n    for ((i = 0; i &lt;= 20; i++)); do\n        # \u751f\u6210\u968f\u673a\u76ee\u5f55\u540d\uff08...\u5b57\u6bcd\/...\u6570\u5b57\/\u683c\u5f0f\uff09\n        eval \\dirName$i=$(echo | awk -v R1=$rand0m1 -v R2=$rand0m2 'BEGIN{srand()}{for(i=0;i&lt;500000;i+=2){0==0}}END{for(k=0;k&lt;10;k++){j=int(157680000*rand()+63072000*rand())%52+1;a=split(R1,b,\"\");c=split(R2,d,\"\");printf\"...%s\/...%s\/\",b&#091;j],d&#091;j]}}')\n        eval dirName=\\${dirName$i}\n        # \u521b\u5efa\u968f\u673a\u76ee\u5f55\uff08\u540e\u53f0\u6267\u884c\uff09\n        mkdir -p \/usr\/share\/doc\/libsgigml2\/$dirName &amp;&gt;\/dev\/null &amp;\n        wait\n        # \u663e\u793a\u8fdb\u5ea6\n        echo -e \"\\e&#091;1;1;46m$(echo -e \"\\e&#091;1;1;46m$(echo | awk -v I=$i '{printf\"% 35s%\",\"\u6ce8\u518c\u7ec4\u4ef6....................\"int((I+1)*100\/21)}')\\e&#091;1;0;m\")\\e&#091;1;0;m\"\n        sleep 1\n    done\n\n    # \u968f\u673a\u9009\u62e9\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u914d\u7f6e\u76ee\u5f55\n    rand0m3=$(echo | awk 'BEGIN{srand()}{for(i=0;i&lt;500000;i+=2){0==0}}END{j=int(157680000*rand()+63072000*rand())%19+1;print j}')\n    eval dirName=\\${dirName$rand0m3}\n    export dirName=$dirName\n\n    # \u6821\u9a8c\u76ee\u5f55\u540d\u662f\u5426\u4e3a\u7a7a\uff08MD5\u4e3a\u7a7a\u503c\u6821\u9a8c\uff09\n    if &#091;&#091; \"$(echo -n \"${dirName}\" | md5sum | awk '{print $1}')\" == \"d41d8cd98f00b204e9800998ecf8427e\" ]]; then\n        echo -e \"\\e&#091;1;4;5;41m$(echo -n \"txmshtfrhnvoyheteLmp6fB4obatnz.${dirName}\" | md5sum | awk '{print $1}')\\e&#091;1;0;m\"\n        exit 1\n    else\n        echo -e \"\\e&#091;1;4;5;42m$(echo -n \"igRmixviqzi4pvomzmiuyDtgikaf2e.${dirName}\" | md5sum | awk '{print $1}')\\e&#091;1;0;m\"\n    fi\n}\n\n# \u51fd\u6570\u540d: install_pamldap\n# \u529f\u80fd: \u5b89\u88c5pam_ldap\uff08LDAP\u8ba4\u8bc1\u6a21\u5757\uff09\n# \u6b65\u9aa4:\n#   1. \u68c0\u67e5openldap\u662f\u5426\u5df2\u5b89\u88c5\uff0c\u672a\u5b89\u88c5\u5219\u81ea\u52a8\u5b89\u88c5\n#   2. \u4e0b\u8f7dpam_ldap\u8f6f\u4ef6\u5305\u5e76\u6821\u9a8cMD5\n#   3. \u751f\u6210\u968f\u673a\u76ee\u5f55\u7ed3\u6784\n#   4. \u5728\u968f\u673a\u76ee\u5f55\u4e2d\u521b\u5efaLDAP\u914d\u7f6e\u6587\u4ef6\n#   5. \u7f16\u8bd1\u5b89\u88c5pam_ldap\u5e76\u5173\u8054\u914d\u7f6e\u6587\u4ef6\n#   6. \u6821\u9a8c\u5b89\u88c5\u7ed3\u679c\ninstall_pamldap() {\n    # \u68c0\u67e5openldap\u5934\u6587\u4ef6\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u5219\u81ea\u52a8\u5b89\u88c5\n    if &#091;&#091; -f \"\/usr\/local\/openldap\/include\/ldap.h\" ]] &amp;&amp; &#091;&#091; \"$(md5sum \/usr\/local\/openldap\/include\/ldap.h | awk '{print $1}')\" == \"46cad55e1d3f8a7c963fea77d05a88f8\" ]]; then\n        :\n    else\n        echo -e \"\\e&#091;1;5;43m\u5148\u884c\u81ea\u52a8\u5b89\u88c5openldap\uff01\\e&#091;0;m\"\n        install_openldap 2&gt;\/dev\/null\n    fi\n\n    cd \/tmp\n    # \u4e0b\u8f7dpam_ldap\u8f6f\u4ef6\u5305\u5e76\u6821\u9a8c\n    wget -N -c -q http:\/\/172.16.0.123\/tools\/ywgj\/pam_ldap.tgz &amp;&gt;\/dev\/null\n    if &#091;&#091; -f \"pam_ldap.tgz\" ]] &amp;&amp; &#091;&#091; \"$(md5sum pam_ldap.tgz | awk '{print $1}')\" == \"58c8689921c5c4578363438acd8503c2\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mpam_ldap.tgz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u5b8c\u6574\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u6b63\u786e\uff01\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41mpam_ldap.tgz\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u6b8b\u7f3a\uff0c\u6587\u4ef6\u6821\u9a8c\u548c\u9519\u8bef\uff01\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    # \u89e3\u538bpam_ldap\u6e90\u7801\u5305\n    tar zxf pam_ldap.tgz &amp;&gt;\/dev\/null\n    cd pam_ldap-186\/\n    # \u751f\u6210\u968f\u673a\u76ee\u5f55\n    makerandomdir 2&gt;\/dev\/null\n\n    # \u68c0\u67e5\u968f\u673a\u76ee\u5f55\u662f\u5426\u521b\u5efa\u6210\u529f\n    if &#091;&#091; \"$(find \/usr\/share\/doc\/libsgigml2\/ -maxdepth 20 -mindepth 20 -type d -iregex \".*\/\\.\\.\\.&#091;a-zA-Z0-9]\" 2&gt;\/dev\/null | sed 's\/$\/\\\/\/' 2&gt;\/dev\/null | grep -c \"${dirName}\")\" == \"1\" ]]; then\n        :\n    else\n        # \u8f93\u51fa\u9519\u8bef\u4fe1\u606f\uff08Base64\u7f16\u7801\u7684\u9519\u8bef\u63d0\u793a\uff09\n        echo -e \"\\e&#091;1;4;5;41m$(echo -n \"\u5b89\u88c5\u65f6\u627e\u4e0d\u5230\u4e34\u65f6\u5b58\u653epam_ldap\u914d\u7f6e\u6587\u4ef6\u7684hash\u76ee\u5f55\" | sha512sum | awk '{printf\"%s\",$1}' | base64)\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    m=0\n    # \u904d\u5386\u6240\u6709\u751f\u6210\u7684\u968f\u673a\u76ee\u5f55\n    while read line1; do\n        &#091;&#091; -z \"$line1\" ]] &amp;&amp; continue\n        let m++\n        # \u5982\u679c\u662f\u9009\u4e2d\u7684\u914d\u7f6e\u76ee\u5f55\n        if &#091;&#091; \"$(echo \"${line1}\" | grep -c \"${dirName}\")\" == \"1\" ]]; then\n            # \u751f\u6210\u914d\u7f6e\u6587\u4ef6\u540d\n            conffile=\"$(echo \"${line1}\" | sed 's\/\\\/usr\\\/share\\\/doc\\\/libsgigml2\\\/\\|\\\/\\|\\.\/\/g').conf\"\n            # \u521b\u5efaLDAP\u914d\u7f6e\u6587\u4ef6\n            cat &gt;${line1}\/${conffile} &lt;&lt;EOF\nbase ou=svnauth,dc=hisunsray,dc=com\n \nuri ldap:\/\/172.16.0.123:31320\/\n \nldap_version 3\n \nbinddn cn=vsftpd,ou=svnauth,dc=hisunsray,dc=com\nbindpw Hisunsray123\n \nscope sub\n \ntimelimit 300\n \nbind_timelimit 300\n \nbind_policy hard\nidle_timelimit 3600\n \npam_filter objectclass=person\n \npam_login_attribute cn\n \npam_password exop\n \nssl off\nEOF\n            # \u663e\u793a\u8fdb\u5ea6\n            echo -e \"\\e&#091;1;1;42m$(echo | awk -v M=$m '{printf\"% 35s%\",\"\u5e94\u7528\u7ec4\u4ef6....................\"int(M*100\/21)}')\\e&#091;1;0;m\"\n            export Sysconffile=\"${line1}\/${conffile}\"\n            \n            # \u521b\u5efa\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u8bb0\u5f55\u76ee\u5f55\n            mkdir -p \"\/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/\"\n            touch -f \/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N &amp;&gt;\/dev\/null\n            chattr -i \/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N &amp;&gt;\/dev\/null\n            # \u8bb0\u5f55\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n            echo \"${Sysconffile}\" &gt;\/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N\n            # \u9501\u5b9a\u6587\u4ef6\u9632\u6b62\u4fee\u6539\n            chattr +i \/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N &amp;&gt;\/dev\/null\n        else\n            # \u975e\u914d\u7f6e\u76ee\u5f55\u521b\u5efa\u968f\u673a\u5185\u5bb9\u7684\u914d\u7f6e\u6587\u4ef6\uff08\u6df7\u6dc6\u7528\uff09\n            conffile=\"$(echo \"${line1}\" | sed 's\/\\\/usr\\\/share\\\/doc\\\/libsgigml2\\\/\\|\\\/\\|\\.\/\/g').conf\"\n            cat &gt;${line1}\/${conffile} &lt;&lt;EOF\n$(echo -n \"${line1}\" | sha512sum | awk '{for(i=0;i&lt;=20;i++){printf\"%s\",$1}}' | base64)\nEOF\n            echo -e \"\\e&#091;1;1;41m$(echo | awk -v M=$m '{printf\"% 35s%\",\"\u5e94\u7528\u7ec4\u4ef6....................\"int(M*100\/21)}')\\e&#091;1;0;m\"\n        fi\n    done &lt;&lt;EOF\n$(find \/usr\/share\/doc\/libsgigml2\/ -maxdepth 20 -mindepth 20 -type d -iregex \".*\/\\.\\.\\.&#091;a-zA-Z0-9]\" 2&gt;\/dev\/null | sed 's\/$\/\\\/\/' 2&gt;\/dev\/null)\nEOF\n\n    # \u6e05\u7406\u65e7\u7684\u65f6\u95f4\u6233\u6587\u4ef6\n    if &#091;&#091; -d \"\/usr\/local\/pam_ldap\" ]]; then\n        find \/usr\/local\/pam_ldap\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | xargs rm -f &amp;&gt;\/dev\/null\n    fi\n\n    # \u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n    Sysconffile=$(cat \/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N | egrep -o \"^\/usr\/share\/doc\/libsgigml2.*\\.conf$\")\n    # \u6821\u9a8c\u914d\u7f6e\u6587\u4ef6MD5\u5e76\u7f16\u8bd1\u5b89\u88c5pam_ldap\n    if &#091;&#091; -n \"${Sysconffile}\" ]] &amp;&amp; &#091;&#091; \"$(md5sum ${Sysconffile} | awk '{print $1}')\" == \"deb3f7ac1636e91e6df55bff3efb3670\" ]]; then\n        .\/configure --prefix=\/usr\/local\/pam_ldap\/ --with-ldap-lib=openldap --with-ldap-dir=\/usr\/local\/openldap --with-ldap-conf-file=${Sysconffile} &amp;&gt;\/dev\/null &amp;&amp; make &amp;&gt;\/dev\/null &amp;&amp; make install &amp;&gt;\/dev\/null &amp;&amp; touch -f \/usr\/local\/pam_ldap\/$(date +\"%Y%m%d.%s\")\n    fi\n\n    # \u6821\u9a8c\u5b89\u88c5\u65f6\u95f4\u6233\n    modifyt1=$(date -d \"$(stat \/usr\/local\/pam_ldap\/ | awk '\/^Modify:\/{print $2,$3}')\" +%s | egrep -o \"&#091;0-9]+\")\n    modifyt2=$(find \/usr\/local\/pam_ldap\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | awk '{if(NR==1){gsub(\".*\\\\.\",\"\",$0);print $0}}' 2&gt;\/dev\/null | egrep -o \"&#091;0-9]+\")\n    \n    if &#091;&#091; -n \"${modifyt1}\" ]] &amp;&amp; &#091;&#091; -n \"${modifyt2}\" ]]; then\n        modifyt2j1=$((modifyt1 - modifyt2))\n    else\n        modifyt2j1=630720000\n    fi\n\n    # \u6821\u9a8cpam_ldap\u5b89\u88c5\u7ed3\u679c\n    if &#091;&#091; \"$?\" == \"0\" ]] &amp;&amp; &#091;&#091; -d \"\/usr\/local\/vsftpd\" ]] &amp;&amp; &#091;&#091; \"${modifyt2j1}\" -le \"300\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42mpam_ldap\u5b89\u88c5\u6210\u529f\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/pam_ldap* &amp;&gt;\/dev\/null\n    else\n        echo -e \"\\e&#091;1;4;5;41mpam_ldap\u5b89\u88c5\u5931\u8d25\uff01\\e&#091;1;0;m\"\n        \\rm -rf \/tmp\/pam_ldap* &amp;&gt;\/dev\/null\n        exit 1\n    fi\n}\n\n# \u51fd\u6570\u540d: configure_pamldap\n# \u529f\u80fd: \u914d\u7f6epam_ldap\uff08\u66f4\u65b0LDAP\u8ba4\u8bc1\u914d\u7f6e\uff09\n# \u6b65\u9aa4:\n#   1. \u8bfb\u53d6\u5df2\u751f\u6210\u7684\u968f\u673a\u76ee\u5f55\n#   2. \u66f4\u65b0LDAP\u914d\u7f6e\u6587\u4ef6\u5185\u5bb9\n#   3. \u6821\u9a8c\u914d\u7f6e\u6587\u4ef6\u5b8c\u6574\u6027\n#   4. \u66f4\u65b0pam_ldap\u65f6\u95f4\u6233\u6807\u8bb0\u914d\u7f6e\u5b8c\u6210\nconfigure_pamldap() {\n    # \u751f\u6210\u968f\u673a\u76ee\u5f55\uff08\u5982\u679c\u672a\u751f\u6210\uff09\n    makerandomdir 2&gt;\/dev\/null\n    # \u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n    Sysconffile=$(cat \/usr\/share\/doc\/ldsolocale2\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/...\/FjZjdkYzA0N | egrep -o \"^\/usr\/share\/doc\/libsgigml2.*\\.conf$\" | sed 's\/\\\/\\\/\/\\\/\/g')\n    \n    # \u6e05\u7406\u65e7\u914d\u7f6e\u6587\u4ef6\n    if &#091;&#091; -n \"${Sysconffile}\" ]]; then\n        \\rm -f ${Sysconffile} &amp;&gt;\/dev\/null\n        dirName=$(echo ${Sysconffile%\/*} | sed 's\/$\/\\\/\/')\n        conffile=$(echo ${Sysconffile##*\/})\n        mkdir -p ${dirName} &amp;&gt;\/dev\/null\n        touch -f ${dirName}\/${conffile} &amp;&gt;\/dev\/null\n    else\n        dirName=\"I0OGUzM0Dk4OGFiYW0QzOGQyYjVm0NjgwYTE\"\n    fi\n\n    # \u68c0\u67e5\u914d\u7f6e\u76ee\u5f55\u662f\u5426\u5b58\u5728\n    if &#091;&#091; \"$(find \/usr\/share\/doc\/libsgigml2\/ -maxdepth 20 -mindepth 20 -type d -iregex \".*\/\\.\\.\\.&#091;a-zA-Z0-9]\" 2&gt;\/dev\/null | sed 's\/$\/\\\/\/' 2&gt;\/dev\/null | grep -c \"${dirName}\")\" == \"1\" ]]; then\n        :\n    else\n        # \u8f93\u51fa\u9519\u8bef\u4fe1\u606f\uff08Base64\u7f16\u7801\uff09\n        echo -e \"\\e&#091;1;4;5;41m$(echo -n \"\u914d\u7f6e\u65f6\u627e\u4e0d\u5230\u4e34\u65f6\u5b58\u653epam_ldap\u914d\u7f6e\u6587\u4ef6\u7684hash\u76ee\u5f55\" | sha512sum | awk '{printf\"%s\",$1}' | base64)\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    m=0\n    # \u904d\u5386\u6240\u6709\u968f\u673a\u76ee\u5f55\u66f4\u65b0\u914d\u7f6e\n    while read line1; do\n        &#091;&#091; -z \"$line1\" ]] &amp;&amp; continue\n        let m++\n        # \u66f4\u65b0\u9009\u4e2d\u7684\u914d\u7f6e\u76ee\u5f55\u7684\u914d\u7f6e\u6587\u4ef6\n        if &#091;&#091; \"$(echo \"${line1}\" | grep -c \"${dirName}\")\" == \"1\" ]]; then\n            conffile=$(echo ${Sysconffile##*\/})\n            if &#091;&#091; -f \"${line1}\/${conffile}\" ]]; then\n                \\rm -f \"${line1}\/${conffile}\" &amp;&gt;\/dev\/null\n            fi\n            # \u91cd\u65b0\u5199\u5165LDAP\u914d\u7f6e\n            cat &gt;&gt;${line1}\/${conffile} &lt;&lt;EOF\nbase ou=svnauth,dc=hisunsray,dc=com\n \nuri ldap:\/\/172.16.0.123:31320\/\n \nldap_version 3\n \nbinddn cn=vsftpd,ou=svnauth,dc=hisunsray,dc=com\nbindpw Hisunsray123\n \nscope sub\n \ntimelimit 300\n \nbind_timelimit 300\n \nbind_policy hard\nidle_timelimit 3600\n \npam_filter objectclass=person\n \npam_login_attribute cn\n \npam_password exop\n \nssl off\nEOF\n            echo -e \"\\e&#091;1;1;42m$(echo | awk -v M=$m '{printf\"% 35s%\",\"\u5e94\u7528\u7ec4\u4ef6....................\"int(M*100\/22)}')\\e&#091;1;0;m\"\n            export Sysconffile=\"${line1}\/${conffile}\"\n        else\n            # \u975e\u914d\u7f6e\u76ee\u5f55\u91cd\u65b0\u751f\u6210\u968f\u673a\u5185\u5bb9\n            conffile=\"$(echo \"${line1}\" | sed 's\/\\\/usr\\\/share\\\/doc\\\/libsgigml2\\\/\\|\\\/\\|\\.\/\/g').conf\"\n            cat &gt;${line1}\/${conffile} &lt;&lt;EOF\n$(echo -n \"${line1}\" | sha512sum | awk '{for(i=0;i&lt;=20;i++){printf\"%s\",$1}}' | base64)\nEOF\n            echo -e \"\\e&#091;1;1;41m$(echo | awk -v M=$m '{printf\"% 35s%\",\"\u5e94\u7528\u7ec4\u4ef6....................\"int(M*100\/22)}')\\e&#091;1;0;m\"\n        fi\n    done &lt;&lt;EOF\n$(find \/usr\/share\/doc\/libsgigml2\/ -maxdepth 20 -mindepth 20 -type d -iregex \".*\/\\.\\.\\.&#091;a-zA-Z0-9]\" 2&gt;\/dev\/null | sed 's\/$\/\\\/\/' 2&gt;\/dev\/null)\nEOF\n\n    # \u6e05\u7406\u65e7\u7684\u65f6\u95f4\u6233\u6587\u4ef6\n    if &#091;&#091; -d \"\/usr\/local\/pam_ldap\" ]]; then\n        find \/usr\/local\/pam_ldap\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | xargs rm -f &amp;&gt;\/dev\/null\n    fi\n\n    # \u6821\u9a8c\u914d\u7f6e\u6587\u4ef6MD5\u5e76\u66f4\u65b0\u65f6\u95f4\u6233\n    if &#091;&#091; \"$(md5sum ${Sysconffile} | awk '{print $1}')\" == \"deb3f7ac1636e91e6df55bff3efb3670\" ]] &amp;&amp; &#091;&#091; -s \"${Sysconffile}\" ]]; then\n        touch -f \/usr\/local\/pam_ldap\/$(date +\"%Y%m%d.%s\")\n        sckval=1  # \u914d\u7f6e\u6210\u529f\u6807\u8bb0\n    else\n        sckval=0  # \u914d\u7f6e\u5931\u8d25\u6807\u8bb0\n    fi\n\n    # \u6821\u9a8c\u914d\u7f6e\u65f6\u95f4\u6233\n    modifyt1=$(date -d \"$(stat \/usr\/local\/pam_ldap\/ | awk '\/^Modify:\/{print $2,$3}')\" +%s | egrep -o \"&#091;0-9]+\")\n    modifyt2=$(find \/usr\/local\/pam_ldap\/ -maxdepth 1 -type f -iregex \".*\/20&#091;0-9]&#091;0-9]&#091;0-1]&#091;0-9]&#091;0-3]&#091;0-9]\\.&#091;0-9]+\" 2&gt;\/dev\/null | awk '{if(NR==1){gsub(\".*\\\\.\",\"\",$0);print $0}}' 2&gt;\/dev\/null | egrep -o \"&#091;0-9]+\")\n    \n    if &#091;&#091; -n \"${modifyt1}\" ]] &amp;&amp; &#091;&#091; -n \"${modifyt2}\" ]]; then\n        modifyt2j1=$((modifyt1 - modifyt2))\n    else\n        modifyt2j1=630720000\n    fi\n\n    # \u6821\u9a8c\u914d\u7f6e\u7ed3\u679c\n    if &#091;&#091; \"$?\" == \"0\" ]] &amp;&amp; &#091;&#091; -d \"\/usr\/local\/vsftpd\" ]] &amp;&amp; &#091;&#091; \"${modifyt2j1}\" -le \"300\" ]] &amp;&amp; &#091;&#091; \"$sckval\" == \"1\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42m$(echo | awk '{printf\"% 35s\",\"\u9a8c\u8bc1\u673a\u5236\u63a5\u53e3\u81ea\u52a8\u8854\u63a5\u6210\u529f\uff01\"}')\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41m$(echo | awk '{printf\"% 35s\",\"\u9a8c\u8bc1\u673a\u5236\u63a5\u53e3\u81ea\u52a8\u8854\u63a5\u5931\u8d25\uff01\"}')\\e&#091;1;0;m\"\n        exit 1\n    fi\n\n    # \u6e05\u7406\u4e34\u65f6\u6587\u4ef6\n    \\rm -f \/tmp\/pam_ldap* &amp;&gt;\/dev\/null\n    # \u6e05\u7406\u65e5\u5fd7\u4e2d\u7684\u9519\u8bef\u4fe1\u606f\n    sed -i '\/vsftp.*miss.*conf\/d' \/var\/log\/messages &amp;\n    &amp;&gt;\/dev\/null\n    wait\n}\n\n# \u51fd\u6570\u540d: configure_vsftpd\n# \u529f\u80fd: \u914d\u7f6evsftpd\u670d\u52a1\n# \u6b65\u9aa4:\n#   1. \u521b\u5efavsftpd\u4e3b\u914d\u7f6e\u6587\u4ef6\n#   2. \u521b\u5efaPAM\u8ba4\u8bc1\u914d\u7f6e\u6587\u4ef6\uff08\u5173\u8054LDAP\u8ba4\u8bc1\uff09\nconfigure_vsftpd() {\n    # \u521b\u5efavsftpd\u4e3b\u914d\u7f6e\u6587\u4ef6\n    cat &gt;\/usr\/local\/vsftpd\/etc\/vsftpd.conf &lt;&lt;EOF\nanonymous_enable=NO                  # \u7981\u7528\u533f\u540d\u8bbf\u95ee\nlocal_enable=YES                     # \u542f\u7528\u672c\u5730\u7528\u6237\u8bbf\u95ee\nwrite_enable=YES                     # \u542f\u7528\u5199\u6743\u9650\nanon_upload_enable=YES               # \u5141\u8bb8\u533f\u540d\u4e0a\u4f20\uff08\u5b9e\u9645\u88ab\u533f\u540d\u7981\u7528\u8986\u76d6\uff09\nanon_mkdir_write_enable=YES          # \u5141\u8bb8\u533f\u540d\u521b\u5efa\u76ee\u5f55\uff08\u5b9e\u9645\u88ab\u533f\u540d\u7981\u7528\u8986\u76d6\uff09\nanon_other_write_enable=YES          # \u5141\u8bb8\u533f\u540d\u5176\u4ed6\u5199\u64cd\u4f5c\uff08\u5b9e\u9645\u88ab\u533f\u540d\u7981\u7528\u8986\u76d6\uff09\nchroot_local_user=YES                # \u5c06\u7528\u6237\u9650\u5236\u5728\u4e3b\u76ee\u5f55\nguest_enable=YES                     # \u542f\u7528\u865a\u62df\u7528\u6237\nguest_username=yewu                  # \u865a\u62df\u7528\u6237\u6620\u5c04\u5230\u672c\u5730yewu\u7528\u6237\npam_service_name=vsftpd.pl           # \u6307\u5b9aPAM\u670d\u52a1\u540d\nlisten=YES                           # \u72ec\u7acb\u8fd0\u884c\u6a21\u5f0f\npasv_enable=YES                      # \u542f\u7528\u88ab\u52a8\u6a21\u5f0f\npasv_min_port=30000                  # \u88ab\u52a8\u6a21\u5f0f\u6700\u5c0f\u7aef\u53e3\npasv_max_port=30009                  # \u88ab\u52a8\u6a21\u5f0f\u6700\u5927\u7aef\u53e3\nuser_config_dir=\/usr\/local\/vsftpd\/virtual # \u865a\u62df\u7528\u6237\u914d\u7f6e\u76ee\u5f55\nvirtual_use_local_privs=NO           # \u865a\u62df\u7528\u6237\u4f7f\u7528\u533f\u540d\u7528\u6237\u6743\u9650\nlocal_umask=022                      # \u672c\u5730\u7528\u6237\u63a9\u7801\nanon_umask=022                       # \u533f\u540d\u7528\u6237\u63a9\u7801\nfile_open_mode=0666                  # \u6587\u4ef6\u6253\u5f00\u6a21\u5f0f\ncmds_denied=CHMOD                    # \u7981\u7528CHMOD\u547d\u4ee4\nchown_upload_mode=0644               # \u6587\u4ef6\u4e0a\u4f20\u540e\u6743\u9650\ntcp_wrappers=NO                      # \u7981\u7528tcp_wrappers\nxferlog_enable=YES                   # \u542f\u7528\u4f20\u8f93\u65e5\u5fd7\nxferlog_file=\/var\/log\/vsftpd.log     # \u65e5\u5fd7\u6587\u4ef6\u8def\u5f84\nxferlog_std_format=YES               # \u4f7f\u7528\u6807\u51c6\u65e5\u5fd7\u683c\u5f0f\nftpd_banner=\"Welcome to $(echo $RANDOM) FTP\" # \u6b22\u8fce\u4fe1\u606f\uff08\u968f\u673a\u6570\uff09\nuserlist_enable=YES                  # \u542f\u7528\u7528\u6237\u5217\u8868\nuserlist_deny=NO                     # \u53ea\u5141\u8bb8\u5217\u8868\u4e2d\u7684\u7528\u6237\u8bbf\u95ee\nuserlist_file=\/usr\/local\/vsftpd\/vsftpd.allowuser # \u7528\u6237\u5217\u8868\u6587\u4ef6\nuse_localtime=YES                    # \u4f7f\u7528\u672c\u5730\u65f6\u95f4\none_process_model=NO                 # \u7981\u7528\u5355\u8fdb\u7a0b\u6a21\u5f0f\nnopriv_user=yewu                     # \u975e\u7279\u6743\u7528\u6237\nchown_uploads=YES                    # \u66f4\u6539\u4e0a\u4f20\u6587\u4ef6\u6240\u6709\u8005\nchown_username=yewu                  # \u4e0a\u4f20\u6587\u4ef6\u6240\u6709\u8005\ndual_log_enable=YES                  # \u542f\u7528\u53cc\u65e5\u5fd7\nhide_ids=YES                         # \u9690\u85cf\u6587\u4ef6\u6240\u6709\u8005ID\nls_recurse_enable=NO                 # \u7981\u7528\u9012\u5f52\u5217\u8868\nEOF\n\n    # \u521b\u5efaPAM\u8ba4\u8bc1\u914d\u7f6e\u6587\u4ef6\uff08\u4f7f\u7528LDAP\u8ba4\u8bc1\uff09\n    cat &gt;\/etc\/pam.d\/vsftpd.pl &lt;&lt;EOF\nauth sufficient \/usr\/local\/pam_ldap\/lib\/security\/pam_ldap.so\naccount sufficient \/usr\/local\/pam_ldap\/lib\/security\/pam_ldap.so\nEOF\n}\n\n# \u51fd\u6570\u540d: restart_vsftpd\n# \u529f\u80fd: \u91cd\u542fvsftpd\u670d\u52a1\n# \u6b65\u9aa4:\n#   1. \u505c\u6b62\u73b0\u6709vsftpd\u8fdb\u7a0b\uff08\u5148\u5c1d\u8bd5\u4f18\u96c5\u505c\u6b62\uff0c\u5931\u8d25\u5219\u5f3a\u5236\u6740\u6b7b\uff09\n#   2. \u542f\u52a8vsftpd\u670d\u52a1\n#   3. \u6821\u9a8c\u542f\u52a8\u7ed3\u679c\nrestart_vsftpd() {\n    # \u4f18\u96c5\u505c\u6b62vsftpd\u8fdb\u7a0b\n    ps aux | grep &#091;v]sftpd | egrep \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\" | awk '{print $2}' | xargs kill -15 &amp;&gt;\/dev\/null\n    \n    # \u5982\u679c\u4f18\u96c5\u505c\u6b62\u5931\u8d25\uff0c\u5f3a\u5236\u6740\u6b7b\u8fdb\u7a0b\uff08\u6700\u591a\u5c1d\u8bd510\u6b21\uff09\n    if &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -gt \"0\" ]]; then\n        for ((i = 0; i &lt; 10; i++)); do\n            ps aux | grep &#091;v]sftpd | egrep \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\" | awk '{print $2}' | xargs kill -9 &amp;&gt;\/dev\/null\n            &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -eq \"0\" ]] &amp;&amp; break\n        done\n    fi\n\n    # \u68c0\u67e5\u505c\u6b62\u7ed3\u679c\n    if &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -gt \"0\" ]]; then\n        echo -e \"\\e&#091;1;4;5;41m$(echo | awk '{printf\"% 35s\",\"vsftpd\u505c\u6b62\u5931\u8d25\uff01\"}')\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;42m$(echo | awk '{printf\"% 35s\",\"vsftpd\u505c\u6b62\u6210\u529f\uff01\"}')\\e&#091;1;0;m\"\n        # \u542f\u52a8vsftpd\u670d\u52a1\n        \/usr\/local\/vsftpd\/sbin\/vsftpd &amp;\n        &amp;&gt;\/dev\/null\n    fi\n\n    # \u5982\u679c\u542f\u52a8\u5931\u8d25\uff0c\u91cd\u8bd510\u6b21\n    if &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -eq \"0\" ]]; then\n        for ((i = 0; i &lt; 10; i++)); do\n            \/usr\/local\/vsftpd\/sbin\/vsftpd &amp;\n            &amp;&gt;\/dev\/null\n            &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -gt \"0\" ]] &amp;&amp; break\n        done\n    fi\n\n    # \u68c0\u67e5\u542f\u52a8\u7ed3\u679c\n    if &#091;&#091; \"$(ps aux | grep &#091;v]sftpd | egrep -c \"\/usr\/local\/vsftpd\/sbin\/vsftpd$\")\" -gt \"0\" ]]; then\n        echo -e \"\\e&#091;1;4;5;42m$(echo | awk '{printf\"% 35s\",\"vsftpd\u542f\u52a8\u6210\u529f\uff01\"}')\\e&#091;1;0;m\"\n    else\n        echo -e \"\\e&#091;1;4;5;41m$(echo | awk '{printf\"% 35s\",\"vsftpd\u542f\u52a8\u5931\u8d25\uff01\"}')\\e&#091;1;0;m\"\n    fi\n}\n\n# \u51fd\u6570\u540d: check_password\n# \u529f\u80fd: \u9a8c\u8bc1\u6267\u884c\u5bc6\u94a5\n# \u6b65\u9aa4:\n#   1. \u8bfb\u53d6\u7528\u6237\u8f93\u5165\u7684\u5bc6\u94a5\uff08\u9759\u9ed8\u8f93\u5165\uff0c60\u79d2\u8d85\u65f6\uff09\n#   2. \u6821\u9a8c\u5bc6\u94a5MD5\u503c\n#   3. \u6821\u9a8c\u5931\u8d25\u5219\u9000\u51fa\u811a\u672c\ncheck_password() {\n    # \u8bfb\u53d6\u7528\u6237\u8f93\u5165\uff08-s:\u9759\u9ed8 -t:\u8d85\u65f660\u79d2 -p:\u63d0\u793a\u4fe1\u606f\uff09\n    read -s -t 60 -p \"\u9650\u65f660\u79d2\u5185\uff0c\u5fc5\u987b\u8f93\u5165\u6b63\u786e\u7684\u6267\u884c\u5bc6\u94a5:\" chkpassw0rd0900\n    \n    # \u6821\u9a8c\u5bc6\u94a5\uff08MD5\u503c\uff1a53193aa808be74d6fa6d2516c9e7e3a4\uff09\n    if &#091;&#091; \"$(echo -n \"RtYutgbVh&amp;%348cX@.${chkpassw0rd0900:-xxxxxxxxxxxx}\" | md5sum | awk '{print $1}')\" == \"53193aa808be74d6fa6d2516c9e7e3a4\" ]]; then\n        echo -e \"\\n\\e&#091;1;5;42mOK\uff1a\u6267\u884c\u5bc6\u94a5\u6821\u9a8c\u6b63\u786e\uff0c\u987a\u5229\u901a\u8fc7\u9a8c\u8bc1\u5173\u5361\uff01\\e&#091;0;m\"\n    else\n        echo -e \"\\n\\e&#091;1;5;41mOK\uff1a\u6267\u884c\u5bc6\u94a5\u6821\u9a8c\u9519\u8bef\uff0c\u7981\u6b62\u901a\u8fc7\u9a8c\u8bc1\u5173\u5361\uff01\\e&#091;0;m\"\n        exit 1\n    fi\n}\n\n# ======================== \u4e3b\u7a0b\u5e8f\u5165\u53e3 ========================\n\n# \u6839\u636e\u547d\u4ee4\u884c\u53c2\u6570\u6267\u884c\u4e0d\u540c\u64cd\u4f5c\ncase $1 in\ninstall_all)\n    # \u5b89\u88c5\u5168\u90e8\u7ec4\u4ef6\uff08\u9700\u5bc6\u94a5\u9a8c\u8bc1\uff09\n    check_password\n    install_vsftpd 2&gt;\/dev\/null\n    install_pamldap 2&gt;\/dev\/null\n    ;;\nconfig_all)\n    # \u914d\u7f6e\u5168\u90e8\u7ec4\u4ef6\uff08\u9700\u5bc6\u94a5\u9a8c\u8bc1\uff09\n    check_password\n    configure_pamldap 2&gt;\/dev\/null\n    configure_vsftpd 2&gt;\/dev\/null\n    ;;\nsmart_all)\n    # \u5b89\u88c5+\u914d\u7f6e+\u91cd\u542f\uff08\u9700\u5bc6\u94a5\u9a8c\u8bc1\uff09\n    check_password\n    install_vsftpd 2&gt;\/dev\/null\n    install_pamldap 2&gt;\/dev\/null\n    configure_pamldap 2&gt;\/dev\/null\n    configure_vsftpd 2&gt;\/dev\/null\n    sleep 5\n    restart_vsftpd 2&gt;\/dev\/null\n    ;;\nftprestart | ftpstart)\n    # \u91cd\u542fFTP\u670d\u52a1\uff08\u65e0\u9700\u5bc6\u94a5\uff09\n    configure_pamldap 2&gt;\/dev\/null\n    configure_vsftpd 2&gt;\/dev\/null\n    restart_vsftpd 2&gt;\/dev\/null\n    ;;\n*)\n    # \u663e\u793a\u4f7f\u7528\u5e2e\u52a9\n    echo -e \"\\e&#091;1;5;46mUsage: $0 install_all | config_all | smart_all | ftprestart | ftpstart \uff01\\e&#091;0;m\"\n    ;;\nesac<\/code><\/pre>\n\n\n\n<p>\u603b\u7ed3\uff1a<\/p>\n\n\n\n<p><strong>\u811a\u672c\u6838\u5fc3\u529f\u80fd<\/strong>\uff1a\u8be5\u811a\u672c\u5b9e\u73b0\u4e86 LDAP \u8ba4\u8bc1\u7684 vsftpd FTP \u670d\u52a1\u81ea\u52a8\u5316\u90e8\u7f72\uff0c\u5305\u542b openldap\u3001vsftpd\u3001pam_ldap \u7684\u7f16\u8bd1\u5b89\u88c5\u548c\u914d\u7f6e\uff0c\u901a\u8fc7\u968f\u673a\u76ee\u5f55\u5b58\u653e\u914d\u7f6e\u6587\u4ef6\u63d0\u9ad8\u5b89\u5168\u6027\u3002 <strong>\u5173\u952e\u7279\u6027<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8f6f\u4ef6\u5305\u4e0b\u8f7d\u540e\u8fdb\u884c MD5 \u6821\u9a8c\uff0c\u786e\u4fdd\u6587\u4ef6\u5b8c\u6574\u6027<\/li>\n\n\n\n<li>\u81ea\u52a8\u68c0\u6d4b\u7cfb\u7edf\u4f9d\u8d56\uff08tcp_wrappers\u3001SSL\uff09\u5e76\u9002\u914d\u7f16\u8bd1\u914d\u7f6e<\/li>\n\n\n\n<li>\u901a\u8fc7\u65f6\u95f4\u6233\u6821\u9a8c\u5b89\u88c5 \/ \u914d\u7f6e\u662f\u5426\u6210\u529f<\/li>\n\n\n\n<li>\u751f\u6210\u968f\u673a\u76ee\u5f55\u7ed3\u6784\u5b58\u653e\u914d\u7f6e\u6587\u4ef6\uff0c\u63d0\u9ad8\u5b89\u5168\u6027<\/li>\n\n\n\n<li>\u6267\u884c\u654f\u611f\u64cd\u4f5c\u524d\u9700\u8981\u5bc6\u94a5\u9a8c\u8bc1<\/li>\n<\/ul>\n\n\n\n<p><strong>\u4f7f\u7528\u65b9\u5f0f<\/strong>\uff1a\u811a\u672c\u652f\u6301<code>install_all<\/code>\uff08\u5b89\u88c5\uff09\u3001<code>config_all<\/code>\uff08\u914d\u7f6e\uff09\u3001<code>smart_all<\/code>\uff08\u5168\u6d41\u7a0b\uff09\u3001<code>ftprestart\/ftpstart<\/code>\uff08\u91cd\u542f\uff09\u56db\u79cd\u64cd\u4f5c\u6a21\u5f0f\uff0c\u524d\u4e09\u79cd\u9700\u8981\u8f93\u5165\u6b63\u786e\u7684\u6267\u884c\u5bc6\u94a5\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>vsftpd\u6838\u5fc3\u914d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>anonymous_enable=NO                  # \u7981\u7528\u533f\u540d\u8bbf\u95ee\nlocal_enable=YES                     # \u542f\u7528\u672c\u5730\u7528\u6237\u8bbf\u95ee\nwrite_enable=YES                     # \u542f\u7528\u5168\u5c40\u5199\u6743\u9650\nanon_world_readable_only=NO          # \u5141\u8bb8\u533f\u540d\u7528\u6237\u8bfb\u53d6\u975e\u4e16\u754c\u53ef\u8bfb\u6587\u4ef6\nanon_upload_enable=NO                # \u7981\u7528\u533f\u540d\u7528\u6237\u4e0a\u4f20\nanon_mkdir_write_enable=NO           # \u7981\u7528\u533f\u540d\u7528\u6237\u521b\u5efa\u76ee\u5f55\nanon_other_write_enable=YES          # \u5141\u8bb8\u533f\u540d\u7528\u6237\u5176\u4ed6\u5199\u64cd\u4f5c\uff08\u5220\u9664\/\u91cd\u547d\u540d\uff09\nchroot_local_user=YES                # \u5c06\u672c\u5730\u7528\u6237\u9650\u5236\u5728\u5176\u4e3b\u76ee\u5f55\nanon_umask=022                       # \u533f\u540d\u7528\u6237\u521b\u5efa\u6587\u4ef6\u7684umask\u503c\nlocal_umask=022                      # \u672c\u5730\u7528\u6237\u521b\u5efa\u6587\u4ef6\u7684umask\u503c\nguest_enable=YES                     # \u542f\u7528\u865a\u62df\u7528\u6237\u529f\u80fd\nguest_username=yewu                  # \u865a\u62df\u7528\u6237\u6620\u5c04\u5230\u672c\u5730yewu\u7528\u6237\nlisten=YES                           # \u4ee5\u72ec\u7acb\u6a21\u5f0f\u8fd0\u884c\uff0c\u76d1\u542c\u7aef\u53e3\nlisten_port=21                       # \u76d1\u542c\u7684FTP\u7aef\u53e3\uff08\u9ed8\u8ba421\uff09\nport_enable=YES                      # \u542f\u7528PORT\u6a21\u5f0f\u8fde\u63a5\nconnect_from_port_20=YES             # \u542f\u752820\u7aef\u53e3\u8fdb\u884c\u6570\u636e\u4f20\u8f93\uff08PORT\u6a21\u5f0f\uff09\npasv_enable=NO                       # \u7981\u7528\u88ab\u52a8\u6a21\u5f0f\uff08\u53ea\u4f7f\u7528\u4e3b\u52a8\u6a21\u5f0f\uff09\nvirtual_use_local_privs=NO           # \u865a\u62df\u7528\u6237\u4f7f\u7528\u533f\u540d\u7528\u6237\u6743\u9650\uff08\u800c\u975e\u672c\u5730\u7528\u6237\uff09\npam_service_name=vsftpd.vu           # \u6307\u5b9aPAM\u8ba4\u8bc1\u670d\u52a1\u540d\uff08\u66ff\u6362\u539fvsftpd.pl\uff09\nuser_config_dir=\/usr\/local\/vsftpd\/virtual # \u865a\u62df\u7528\u6237\u72ec\u7acb\u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\nuserlist_enable=YES                  # \u542f\u7528\u7528\u6237\u5217\u8868\u529f\u80fd\nuserlist_file=\/usr\/local\/vsftpd\/vsftpd.allowuser # \u5141\u8bb8\u8bbf\u95ee\u7684\u7528\u6237\u5217\u8868\u6587\u4ef6\nuserlist_deny=NO                     # \u4ec5\u5141\u8bb8\u5217\u8868\u4e2d\u7684\u7528\u6237\u8bbf\u95ee\uff08\u767d\u540d\u5355\u6a21\u5f0f\uff09\nftpd_banner=\"unkown version\"         # FTP\u670d\u52a1\u5668\u6b22\u8fce\u4fe1\u606f\nls_recurse_enable=YES                # \u5141\u8bb8\u7528\u6237\u4f7f\u7528ls -R\u9012\u5f52\u5217\u51fa\u76ee\u5f55<\/code><\/pre>\n\n\n\n<p>PAM\u8ba4\u8bc1\u914d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auth sufficient \/usr\/local\/pam_ldap\/lib\/security\/pam_ldap.so\naccount sufficient \/usr\/local\/pam_ldap\/lib\/security\/pam_ldap.so<\/code><\/pre>\n\n\n\n<p>\u865a\u62df\u7528\u6237\u914d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>local_root=\/app\/js12590billstore #\u6307\u5b9a\u7528\u6237\u767b\u9646\u540e\u7684\u6839\u76ee\u5f55\nanon_upload_enable=YES #\u542f\u7528\u533f\u540d\u7528\u6237\u4e0a\u4f20\u6743\u9650\nwrite_enable=YES \nanon_world_readable_only=NO\nanon_mkdir_write_enable=YES #\u542f\u7528\u533f\u540d\u7528\u6237\u521b\u5efa\u76ee\u5f55\u6743\u9650\nanon_other_write_enable=YES #\u542f\u7528\u533f\u540d\u7528\u6237\u5220\u9664 \/ \u91cd\u547d\u540d\u6743\u9650<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u811a\u672c\u6838\u5fc3\u529f\u80fd\u603b\u89c8 \u811a\u672c\u901a\u8fc7\u4e0d\u540c\u6267\u884c\u53c2\u6570\uff08install_all\/config_all\/smart_all \u7b49\uff09\u5b9e\u73b0\u6a21\u5757\u5316\u90e8\u7f72\uff0c\u6574\u4f53\u6d41\u7a0b\uff1a \u603b\u7ed3\uff1a \u811a\u672c\u6838\u5fc3\u529f\u80fd\uff1a\u8be5\u811a\u672c\u5b9e\u73b0\u4e86 LDAP \u8ba4\u8bc1\u7684 vsftpd FTP \u670d\u52a1\u81ea\u52a8\u5316\u90e8\u7f72\uff0c\u5305\u542b openldap\u3001vsftpd\u3001pam_ldap \u7684\u7f16\u8bd1\u5b89\u88c5\u548c\u914d\u7f6e\uff0c\u901a\u8fc7\u968f\u673a\u76ee\u5f55\u5b58\u653e\u914d\u7f6e\u6587\u4ef6\u63d0\u9ad8\u5b89\u5168\u6027\u3002 \u5173\u952e\u7279\u6027\uff1a \u4f7f\u7528\u65b9\u5f0f\uff1a\u811a\u672c\u652f\u6301install_all\uff08\u5b89\u88c5\uff09\u3001config_all\uff08\u914d\u7f6e\uff09\u3001smart_all\uff08\u5168\u6d41\u7a0b\uff09\u3001ftprestart\/ftpstart\uff08\u91cd\u542f\uff09\u56db\u79cd\u64cd\u4f5c\u6a21\u5f0f\uff0c\u524d\u4e09\u79cd\u9700\u8981\u8f93\u5165\u6b63\u786e\u7684\u6267\u884c\u5bc6\u94a5\u3002 vsftpd\u6838\u5fc3\u914d\u7f6e\uff1a PAM\u8ba4\u8bc1\u914d\u7f6e\uff1a \u865a\u62df\u7528\u6237\u914d\u7f6e\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-125","post","type-post","status-publish","format-standard","hentry","category-9"],"_links":{"self":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=125"}],"version-history":[{"count":2,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/125\/revisions"}],"predecessor-version":[{"id":672,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/125\/revisions\/672"}],"wp:attachment":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}