【问题标题】:Bash script truncates output files at 4096 bytesBash 脚本将输出文件截断为 4096 字节
【发布时间】:2015-08-24 09:54:07
【问题描述】:

我正在编写一个脚本来自动创建 OpenVPN 证书,以便将新客户端添加到 VPN 系统。我正在构建一个小型网页(全部是内部的,不能从 Internet 访问),以允许用户输入客户端名称,然后输出一个带有证书的 zip 文件,放在新的客户端 pc 上(通过 Teamviewer)。

脚本(和网页)在 Ubuntu 14.04 服务器上运行,运行 OpenVPN 和 Observium。

当我从终端执行这个脚本时,它运行良好,并且证书创建得很漂亮。

当我从由 PHP 命令执行的浏览器运行此脚本时:

shell_exec("sudo <path to script>/<script>.sh $clientname");

证书在 4096 字节处被截断。万无一失。证书应约为 5600 字节。打开时,证书明显被切断(缺少结束标签)。

这是什么原因造成的?我该怎么做才能解决它?

脚本如下:

#!/bin/bash
cd /etc/openvpn/easy-rsa/
source /etc/openvpn/easy-rsa/vars

expect -c "
spawn /etc/openvpn/easy-rsa/build-key $1
expect {Country Name (2 letter code) \[US\]:}                               { send \"\r\" }
expect {State or Province Name (full name) \[CA\]:}                         { send \"\r\" }
expect {Locality Name (eg, city) \[SanFrancisco\]:}                         { send \"\r\" }
expect {Organization Name (eg, company) \[Fort-Funston\]:}                  { send \"\r\" }
expect {Organizational Unit Name (eg, section) \[MyOrganizationalUnit\]:}   { send \"\r\" }
expect {Common Name (eg, your name or your server's hostname) \[$1\]:}       { send \"\r\" }
expect {Name \[EasyRSA\]:}                                                  { send \"\r\" }
expect {Email Address \[me@myhost.mydomain\]:}                              { send \"\r\" }
expect {A challenge password \[\]:}                                         { send \"\r\" }
expect {An optional company name \[\]:}                                     { send \"\r\" }

expect {Sign the certificate? \[y/n\]:}                                     { send \"y\r\" }
expect { commit? \[y/n\]}                                                   { send \"y\r\" }

expect {Data Base Updated}
interact"

【问题讨论】:

  • /etc/openvpn/easy-rsa/build-key 脚本正在创建证书?通过直接写入文件?文件本身被截断了吗?
  • 是的,build-key 调用创建证书的 pkitool。它在 /etc/openvpn/easy-rsa/keys 目录中创建文件。从浏览器执行脚本时,这些文件确实被截断为 4096 个文件,而从终端它们很好。 See here绿色从终端执行,红色从浏览器执行。
  • ulimitphp 产生的进程上?可以手动获取php 让shell 创建大于4096 的文件吗?
  • 我创建了一个简单的 for 循环打印数字 1 - 5000,制作了一个 24k 字节的日志文件,这在浏览器和终端上都有效。 PHP.ini 的输出缓冲区关闭,ulimit -p 为 8
  • 这里不需要expect,因为您没有与程序交互。只需将答案传递给标准输入

标签: php bash ubuntu expect openvpn


【解决方案1】:

通过不将交互式 shell 与 spawn/expect/send 结合使用来解决此特定问题。直接使用 OpenVPN 的 CLI(由 bu​​ild-key 脚本调用的 pkitool)可以毫无问题地创建文件。

所以语法是:

/etc/openvpn/easy-rsa/pkitool <clientname>

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多