如何从PHP CLI脚本获取主目录?

And*_*rew 52 php

从命令行,我可以得到这样的主目录:

~/
Run Code Online (Sandbox Code Playgroud)

如何在PHP CLI脚本中获取主目录?

#!/usr/bin/php
<?php
echo realpath(~/);
?>
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 65

使用 $_SERVER['HOME']


编辑:

要完成它,请查看print_r($_SERVER)从命令行执行的操作:

Array
(
    [TERM_PROGRAM] => Apple_Terminal
    [TERM] => xterm-color
    [SHELL] => /bin/bash
    [TMPDIR] => /var/folders/Lb/LbowO2ALEX4JTK2MXxLGd++++TI/-Tmp-/
    [TERM_PROGRAM_VERSION] => 272
    [USER] => felix
    [COMMAND_MODE] => unix2003
    [__CF_USER_TEXT_ENCODING] => 0x1F5:0:0
    [PATH] =>/Library/Frameworks/Python.framework/Versions/Current/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
    [PWD] => /Users/felix/Desktop
    [LANG] => de_DE.UTF-8
    [SHLVL] => 1
    [HOME] => /Users/felix
    [LOGNAME] => felix
    [DISPLAY] => /tmp/launch-XIM6c8/:0
    [_] => ./test_php2
    [OLDPWD] => /Users/felix
    [PHP_SELF] => ./test_php2
    [SCRIPT_NAME] => ./test_php2
    [SCRIPT_FILENAME] => ./test_php2
    [PATH_TRANSLATED] => ./test_php2
    [DOCUMENT_ROOT] => 
    [REQUEST_TIME] => 1260658268
    [argv] => Array
      (
        [0] => ./test_php2
      )

    [argc] => 1
    )
Run Code Online (Sandbox Code Playgroud)

我希望我不公开相关的安全信息;)

Windows兼容性

请注意,$_SERVER['HOME']Windows上不可用.而是将变量拆分为$_SERVER['HOMEDRIVE']$_SERVER['HOMEPATH'].

  • 令人惊讶的是,有多少人对这个简单的问题给出了同样明显错误的答案. (5认同)
  • 尝试`getenv("HOME")`如果`$ _SERVER`和`$ _ENV`不起作用. (2认同)

EJ *_*ell 53

您可以从环境中获取$ HOME的值:

<?php
    $home = getenv("HOME");
?>
Run Code Online (Sandbox Code Playgroud)


Fra*_*Luz 6

PHP允许您获取任何OS用户的主目录.有两种方法.

方法#1:

首先,你必须找出操作系统用户ID并将其存储在某处(例如数据库或配置文件).

// Obviously this gotta be ran by the user which the home dir 
// folder is needed.
$uid = posix_getuid();
Run Code Online (Sandbox Code Playgroud)

只要您传递先前收集的正确目标用户ID,此代码位就可以由任何操作系统用户运行,即使是通常的网络服务器www-data用户也可以运行.

$shell_user = posix_getpwuid($uid);
print_r($shell_user);  // will show an array and key 'dir' is the home dir

// not owner of running script process but script file owner
$home_dir = posix_getpwuid(getmyuid())['dir'];
var_dump($home_dir);
Run Code Online (Sandbox Code Playgroud)

文档

方法#2:

与posix_getpwuid()相同的逻辑.在这里你必须传递目标OS用户名而不是他们的uid.

$shell_user = posix_getpwnam('johndoe');
print_r($shell_user); // will show an array and key 'dir' is the home dir

// not owner of running script process but script file owner
$home_dir = posix_getpwnam(get_current_user())['dir'];
var_dump($home_dir); 
Run Code Online (Sandbox Code Playgroud)

文档


ya.*_*eck 6

此功能取自Drush项目.

/**
 * Return the user's home directory.
 */
function drush_server_home() {
  // Cannot use $_SERVER superglobal since that's empty during UnitUnishTestCase
  // getenv('HOME') isn't set on Windows and generates a Notice.
  $home = getenv('HOME');
  if (!empty($home)) {
    // home should never end with a trailing slash.
    $home = rtrim($home, '/');
  }
  elseif (!empty($_SERVER['HOMEDRIVE']) && !empty($_SERVER['HOMEPATH'])) {
    // home on windows
    $home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH'];
    // If HOMEPATH is a root directory the path can end with a slash. Make sure
    // that doesn't happen.
    $home = rtrim($home, '\\/');
  }
  return empty($home) ? NULL : $home;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ras 5

如果由于任何原因getenv('HOME')无法正常工作,或者服务器操作系统是 Windows,您可以使用exec("echo ~")exec("echo %userprofile%")来获取用户目录。当然,该exec功能必须可用(一些托管公司出于安全原因禁用此类功能,但这种情况不太可能发生)

下面是一个函数,它会尝试$_SERVERgetenv最后检查该exec函数是否存在并使用相应的系统命令获取用户目录:

function homeDir()
{
    if(isset($_SERVER['HOME'])) {
        $result = $_SERVER['HOME'];
    } else {
        $result = getenv("HOME");
    }

    if(empty($result) && function_exists('exec')) {
        if(strncasecmp(PHP_OS, 'WIN', 3) === 0) {
            $result = exec("echo %userprofile%");
        } else {
            $result = exec("echo ~");
        }
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)