【问题标题】:Create linux user using php?使用php创建linux用户?
【发布时间】:2013-02-20 17:10:50
【问题描述】:

我目前正在为我的 FTP 服务器创建一个成员系统,供我想要访问服务器的亲密朋友使用,但是我正在使用的 FTP 服务器 (proFTPd) 使用 linux 用户作为每个成员的帐户.因此,我当然需要使用带有 php 的 html 表单,它可以访问服务器并能够在系统上创建用户。

现在我已经完全设置了表单,它验证了电子邮件/用户名/密码并将其保存到我的 sql 数据库中。我唯一缺少的是创建新用户来完成它。

我知道这并不总是最安全的事情,但我确实想这样做,而且我知道危险,所以任何帮助都会很好...

到目前为止,从我一直用来在 linux(或至少我的 Ubuntu 版本)上创建用户的情况来看,它是:

useradd [username] -p [password] -d [/path_to_home_directory] -s [/bin/false]

当然没有括号。

我也知道 php 命令:shell_exec、exec、system() 但是我已经尝试了其中的每一个命令来在其中创建用户,但没有任何效果。

我做了更多的研究,并注意到网络服务器正在 www-data 上运行(它应该是)并且它无权访问 useradd 命令。所以我'viduso'它仍然没有改变。

据我所知,我可以让 www-data 访问服务器上的脚本,然后将用户创建为 root,但是我不知道如何将存储在 php 中的变量传输到脚本。

如果您需要更多详细信息来帮助您,请询问。这是我完成最后两个月项目所需的最后一件事,其中包括桌面应用程序和所有这些。这么近,但我似乎无法得到它。

【问题讨论】:

  • 看看这个:stackoverflow.com/questions/7300299/… 每个人都建议运行一个shell脚本,它将以root身份创建用户。
  • @Hast 我已经看到了这个,但这又回到了我在变量方面遇到的问题。我不确定如何在系统的 shell 脚本中使用 php 中定义的变量。
  • 有什么问题?传递一个 php 变量作为 shell-script 参数的参数。喜欢exec('./myscript.sh ' . $var1 . ' ' . $var2);
  • 简单的方法看askubuntu.com/a/987511/18014

标签: php linux variables


【解决方案1】:

您不应该为 FTP 服务创建 Unix 用户帐户,您应该集成您的 proFTP 服务器以使用 MySQL 进行身份验证(在 MySQL 中存储帐户),因此在这种情况下您不需要创建 Unix 帐户和它会是更好更安全的解决方案:

proFTP with MySQL

【讨论】:

  • 这听起来是个好主意,我什至没有想过要研究这个...非常感谢!如果我可以启动并运行它,我会再次回复!
  • 这就像一个魅力。一开始我的 SQL 服务器有问题,但这与帐户无关。再次感谢。非常感谢!
【解决方案2】:

您可以在useradd 中设置setuid bit,因此它以root 访问权限运行(例如)。但请注意:这是非常冒险的。这将允许服务器中的任何用户创建用户。

无论如何,我认为允许 web-php-script 创建帐户是安全漏洞!

【讨论】:

  • 是的,我也试图避免这样做。我不希望每个用户都有权创建用户。
【解决方案3】:

只是一个注释。对于控制面板类型的事情,您有时必须以 root 身份执行操作。我发现最好的方法是在没有任何升级权限的情况下运行 PHP 控制面板。在不暴露主机系统的情况下制作一个适当安全的 PHP Web 应用程序已经够难的了。

如果控制面板需要进行需要 root 访问权限或任何高于网络服务器用户的访问级别的更改,最好将有关需要进行的更改的信息存储在网络服务器用户可以正常访问的位置- 在数据库中或通过在 Web 用户可以写入文件的某处创建文本文件。在存储信息之前,可以对用户提交的数据进行通常的清理。

然后每分钟、每小时或任何适合场合的 cron 脚本运行一次,以 root 身份从存储的任何位置获取数据,并执行所需的操作。您还可以在此脚本中执行完整性检查。

【讨论】:

    【解决方案4】:

    我认为最安全的方法是将您的网络服务器用户设置为 sudoer,仅适用于以 useradd 或 adduser 开头的命令,无论您的发行版是什么。所以你不必让你的网络用户成为root。

    【讨论】:

      【解决方案5】:

      脚本会是这样的:

      <?php
      
      $user_name = "uuttyy";
      $user_pass = "passwer9911";
      
      $ret_useradd = 0;
      $ret_passwd = 0;
      
      passthru('useradd -m '.$user_name, $ret_useradd);
      
      if ($ret_useradd) {
              printf("Something wrong with useradd, code: %d\n", $ret_useradd);
              exit();
      }
      
      passthru('echo "'.$user_name.':'.$user_pass.'" | chpasswd', $ret_passwd);
      
      if ($ret_passwd) {
              printf("Something wrong with chpasswd, code: %d\n", $ret_passwd);
              echo exec('userdel '.$user_name);
              exit();
      }
      
      printf("All done!\n");
      
      ?>
      

      但正确的答案不是那样做,它有安全问题! 调整(或更改)您的 FTP 服务器以使用用户数据库,并将用户添加到该数据库。正如 Satish 所说,proftpd+mariadb(mariadb 是 mysql 的一个更好的分支)对此有好处

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2011-03-12
        相关资源
        最近更新 更多