シンボリックリンクを生成するPHPスクリプトを実行しています。
どのユーザーであるかを確認するには:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
echo "running as user '" . $user . "'";
var_dump( exec('whoami'));
こうして走って...
$ php script.php
正しく実行され、すべてのシンボリックリンクが確立され、出力は次のようになります。
running as user '999'string(5) "admin"
シェルスクリプトを介して実行:
#!/bin/sh
php /path/to/script.php
次の出力を提供しますが、動作しません。
PHP警告:Symlink():8行の/ path / to / script.phpで権限が拒否されました。ユーザー '999' string(5) 'admin' として実行しています。
同じユーザーとして実行されているので、2つの違いが何であるかわかりません。
正しいシンボリックリンク権限をすべて持つようにする方法に関する提案はありますか?
cat /proc/version
以下を提供します。
Linux version 2.6.39 (root@cross-builder) (gcc version 4.6.3 (x86 32-bit toolchain - ASUSTOR Inc.) ) #1 SMP PREEMPT Thu Oct 31 21:27:37 CST 2013
これは、あらゆる種類のリリース情報に対して生成できる唯一の出力です。
すべてのコード:
$files = scandir('/volume1/dir1');
$base = "/volume1/";
foreach($files as $file) {
$f_letter = $file{0};
$new_path = $base . "ByLetter/" . strtoupper($f_letter) . "/" . $file;
if(ctype_alpha ($f_letter) && !is_link($new_path)) {
var_dump($base. "TV/" . $file);
var_dump($new_path);
symlink ($base . "TV/" . $file , $new_path);
}
}
両方の方法のvarダンプは同じ出力を提供します。
答え1
絶対パスを試してください。このコードはunlink("testFile");
現在の作業ディレクトリ内のファイルを探します。 pwd は現在の作業ディレクトリに応じて変更されます。だから使用unlink("/path/to/testFile");
答え2
公開したコードをインポートして、役に立つ機能の始まりだと思って修正しましたが、失敗することはできませんでした(おそらく私のユーザーが両方のパスへの書き込みアクセス権を持っているからです)。問題が発生した場合は、お知らせするために多くのテストを追加しました。それでも同じ問題が発生した場合はお知らせください。 CLIを介してスクリプトを実行すると、スクリプトは自分と同じ権限を持ちますが、Webサーバーを介して実行するとWebサーバーユーザーの権限(たとえばwww-data
)を持つことに注意することが重要です。
<?php
/**
* Creates an index of the files in the specified directory, by creating symlinks to them, which
* are separated into folders having the first letter.
* WARNING - this will only index files that start with alphabetical characters.
* @param $directory_to_index - the directory we wish to index.
* @param $index_location - where to stick the index.
* @return void
*/
function create_file_index($directory_to_index, $index_location)
{
# Don't let the user place the index in the same folder being indexed, otherwise the directory
# cannot be re-indexed later, otherwise we will be indexing the index.
if ($directory_to_index == $index_location)
{
throw new Exception('Cannot place index in same folder being indexed!');
}
# delete the old index if one already exists.
if (file_exists($index_location))
{
deleteNonEmptyDir($index_location);
}
if (!mkdir($index_location))
{
throw new Exception('Failed to create index directory, check write permissions');
}
$files = scandir($directory_to_index);
foreach ($files as $filename)
{
$first_letter = $filename[0];
$placement_dir = $index_location . "/" . strtoupper($first_letter);
if (ctype_alpha($first_letter))
{
# create the placement directory if it doesn't exist already
mkdir($placement_dir);
$new_path = $placement_dir . "/" . $filename;
if (!is_link($new_path))
{
symlink($directory_to_index . '/' . $filename, $new_path);
}
}
}
}
/**
* Deletes a directory even if it is not already empty. This resolves the issue with
* trying to use unlink on a non-empty dir.
* @param String $dir - the path to the directory you wish to delete
* @return void - changes your filesystem
*/
function deleteNonEmptyDir($dir)
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ($object != "." && $object != "..")
{
if (filetype($dir . "/" . $object) == "dir")
{
deleteNonEmptyDir($dir . "/" . $object);
}
else
{
unlink($dir . "/" . $object);
}
}
}
reset($objects);
rmdir($dir);
}
}
create_file_index('/volume1/dir1', '/volume1/dir1/ByLetter');
答え3
PHP関数fileowner
返す数値UIDユーザー名の代わりに。 uid 999はおそらくあなたのadmin
ユーザーに対応します。次のコマンドを使用して確認できますid
。
id admin
出力はアカウントのuidで始まる必要があります。