programing

PHP CLI 스크립트에서 홈 디렉토리를 가져오는 방법은 무엇입니까?

javamemo 2023. 8. 28. 20:42
반응형

PHP CLI 스크립트에서 홈 디렉토리를 가져오는 방법은 무엇입니까?

명령줄에서 다음과 같은 홈 디렉토리를 가져올 수 있습니다.

~/

PHP CLI 스크립트 내의 홈 디렉토리를 어떻게 가져올 수 있습니까?

#!/usr/bin/php
<?php
echo realpath(~/);
?>

사용하다$_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
    )

관련 보안 정보를 노출하지 않았으면 좋겠습니다 ;)

Windows 호환성

참고:$_SERVER['HOME']는 Windows에서 사용할 수 없습니다.대신 변수는 다음과 같이 분할됩니다.$_SERVER['HOMEDRIVE']그리고.$_SERVER['HOMEPATH'].

환경에서 $HOME 값을 가져올 수 있습니다.

<?php
    $home = getenv("HOME");
?>

PHP를 사용하면 OS 사용자의 홈 디렉토리를 가져올 수 있습니다.두 가지 방법이 있습니다.

방법 #1:

우선 OS 사용자 ID를 파악하여 어딘가에 저장해야 합니다(예: 데이터베이스 또는 구성 파일).

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

이 코드 비트는 이전에 수집한 올바른 대상 사용자 ID만 전달하면 모든 OS 사용자, 심지어 일반 웹 서버 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);

문서화

방법 #2:

posix_getpwuid()의 논리가 동일합니다.여기서는 uid 대신 대상 OS 사용자 이름을 전달해야 합니다.

$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); 

문서화

함수는 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;
}

어떤 이유로든getenv('HOME')서버 OS가 작동하지 않거나 서버 OS가 Windows를 사용할 수 있습니다.exec("echo ~")또는exec("echo %userprofile%")사용자 디렉토리를 가져옵니다.물론입니다.exec기능을 사용할 수 있어야 합니다(일부 호스팅 회사에서는 보안상의 이유로 이러한 기능을 사용할 수 없도록 설정하기도 하지만, 이러한 기능이 발생할 가능성은 더 높습니다).

여기 시도할 php 가 있습니다.$_SERVER,getenv그리고 마지막으로 확인합니다.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;
}

당신이 어디에 있고 무엇을 하려고 하는지에 따라 다릅니다.

$_SERVER서버가 아닌 스크립트에 대해서는 완전히 신뢰할 수 없지만$_ENV['HOME']표준 셸 스크립트에 더 적합할 수 있습니다.언제든지 가능합니다.print_r( $GLOBALS )사용자 환경에서 사용할 수 있는 기능을 확인할 수 있습니다.phpinfo()또한 CLI 스크립트에서 호출할 때 텍스트를 뱉으며, 좋은 역할만 합니다.php -i셸에서 실행하면 동일한 작업을 수행할 수 있습니다.

이것은 Linux와 Windows 모두에서 작동합니다.

function get_home_path() {
  $p1 = $_SERVER['HOME'] ?? null;       // linux path
  $p2 = $_SERVER['HOMEDRIVE'] ?? null;  // win disk
  $p3 = $_SERVER['HOMEPATH'] ?? null;   // win path
  return $p1.$p2.$p3;
}

최근 프로젝트에서 사용한 방법은 다음과 같습니다.

exec('echo $HOME')

다음을 수행하여 개체에 저장했습니다.

$this->write_Path  = exec('echo $HOME');

하지만 원하는 방식으로 저장하고 적합한 방식으로 사용할 수 있습니다.

웹 서버로 작업할 때 "홈" 디렉토리를 사용할 수 있습니다.CLI를 사용하면 웹 및 CLI 환경에서 스크립트를 작동하려면 사용자 경로(윈도우)를 제공합니다. 루트(홈) 디렉토리까지 dirname으로 모든 레벨을 올라가는 것이 더 낫습니다.

echo dirname(__DIR__).PHP_EOL; // one level up
echo dirname(dirname(__DIR__)); //two levels up
echo dirname(__DIR__,2).PHP_EOL; //two levels only php >7.0

이것이 오래된 질문이라는 것은 알지만, 응용프로그램 전반에 걸쳐 복제하기 쉬운 대체 방법을 찾고 있다면 Composer를 통해 설치된 라이브러리를 사용하는 것을 고려해 볼 수 있습니다.여기에 해답의 일부를 모아 도서관으로 만든 도서관을 썼는데 뻔뻔스럽게도 여기에 홍보하겠습니다: juliardi/homemedir.

Composer를 통해 설치할 수 있습니다.

$ composer require juliardi/homedir

그런 다음 응용 프로그램에서 사용합니다.

<?php

require_once('vendor/autoload.php');

$userHomeDir = get_home_directory();

이 답변이 도움이 되길 바랍니다.

$_SERVER['HOME'] 및 getenv('home')가 나에게 맞지 않았습니다.

그러나 PHP 5.5+에서는 파일이 위치한 홈 디렉토리를 제공합니다.

explode( '/', __FILE__ )[2]

ㅠㅠ$_SERVER['DOCUMENT_ROOT']홈 디렉토리로 사용할 수 있습니다.

dirname(__DIR__);

언급URL : https://stackoverflow.com/questions/1894917/how-to-get-the-home-directory-from-a-php-cli-script

반응형