3
votes

Laravel Storage SFTP et autorisations des fichiers téléchargés

J'utilise Storage: SFTP (league / flysystem-sftp) pour télécharger des fichiers sur un serveur externe. Tout se passe bien avec un petit problème: les fichiers sont téléchargés avec une autorisation 0644 (-rw-r - r--). J'ai essayé d'utiliser l'option 'public' sur la méthode put comme exemple de la documentation, comme

Storage::disk('remote-sftp')->put($filename, $contents, 'public');

mais si elle échoue, retourne FALSE et ne télécharge pas le fichier.

Si je supprime le paramètre 'public', tout se passe bien mais avec les mauvaises autorisations pour le fichier.

Est-il possible de définir les autorisations du fichier téléchargé sur quelque chose comme 0666?

p>


0 commentaires

5 Réponses :


0
votes

Veuillez essayer ceci:

Storage::disk('remote-sftp')->put($filename, $contents)->setVisibility( $filename, 'public');

en supposant que le nom de fichier a également le chemin ..


5 commentaires

Merci! L'appel -> setVisibility ($ fn, 'public') renvoie 'true', mais les permissions sont toujours les mêmes.


vérifiez si vous pouvez définir le chmod 0666 avec sftp brut .. normalement cela doit fonctionner


J'essayais d'éviter de faire ainsi. Avoir une si grande abstraction du système de fichiers, tomber à ce niveau bas semble être trop. Je vais essayer de jeter un œil à l'implémentation pour savoir s'il existe un moyen.


Rien sur le bas niveau, vous éliminez simplement une éventuelle défaillance due à quelque chose là-bas. Le setVisibility doit fonctionner pour que vous puissiez faire un test simple. Mais c'est sûr votre appel.


Évidemment, j'ai fait un test avant de publier setVisibility n'a pas fonctionné. Il semble que ce soit l'attribut utilisé par setVisibility () qui soit la source du problème.



4
votes

Enfin, la solution était une combinaison de la réponse et de la configuration d'Alpy. L'appel de setVisibility () s'est déroulé sans échec, mais conserve les autorisations en 0644. En creusant dans le pilote FTP / SFTP, on a découvert que l'autorisation «public» avait un modèle qui peut être attribué dans la configuration en utilisant la clé «permPublic», donc en écrivant dans config / filesystems. php l'autorisation octale souhaitée, il a fonctionné comme prévu.

  'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    'remote-sftp' => [
        'driver' => 'sftp',
        'host' => '222.222.222.222',
        'username' => 'myuser',
        'password' => 'mypassword',
        'visibility' => 'public',
        'permPublic' => 0766, /// <- this one did the trick
// 'port' => 22,
        'root' => '/home',
// 'timeout' => 30,
    ],

],

];


2 commentaires

$ ftp = Storage :: disk ('sftp') -> put ($ remote_path, fopen ($ uploadFile, 'r +')) -> setVisibility ($ remote_path, 'public'); J'ai essayé faire la même chose que le vôtre .. avec permPublic défini sur filesystems.php . Mais j'obtiens ce setVisibility () sur booléen .


Veuillez lire le code, la ligne qui dit "celui-ci a fait l'affaire"



3
votes

Les autorisations de fichier sont basées sur deux facteurs. Visibilité et autorisations. Vous pouvez définir ces deux options dans la configuration du pilote comme telles:

public function setVisibility($path, $visibility)
{
    $visibility = ucfirst($visibility);

    // We're looking for either permPublic or permPrivate
    if (! isset($this->{'perm'.$visibility})) {
        throw new InvalidArgumentException('Unknown visibility: '.$visibility);
    }

    $connection = $this->getConnection();

    return $connection->chmod($this->{'perm'.$visibility}, $path);
}

Les autorisations sont définies en fonction de la visibilité. Donc, si vous définissez 'permPublic' et ne définissez pas 'visibilité' , rien ne changera, la fonction setVisibility () utilise 'visibilité' pour obtenir les autorisations.

vendor / league / flysystem-sftp / src / SftpAdapter.php

'remote' => [
    'driver' => 'sftp',
    'host' => 'hostname',
    'root' => '/',
    'username' => 'user',
    'password' => env('SYSTEM_PASS'),

    'visibility' => 'public', // defaults to 'private'
    'permPublic' => 0775

]

La valeur par défaut publique est 0755.

La valeur privée par défaut est 0700.

umask

Si ' visibilité ' n'est pas définie, je crois que les autorisations sont définies en fonction du masque de l'utilisateur du système distant. Vous pouvez le modifier sur le système distant, si vous le souhaitez. définir umask pour l'utilisateur

Directories

Une chose à noter lorsque vous travaillez avec les autorisations, c'est que cela n'affectera que les fichiers créés. Pour définir les autorisations sur les répertoires créés, utilisez l'attribut 'directoryPerm' dans votre configuration.

Par défaut, 0744

p >


1 commentaires

Merci! Mon problème était lié aux autorisations par défaut, qui par défaut étaient définies sur 0644. Les définir sur 0755 dans la configuration permettait de faire fonctionner les choses. ¿Où avez-vous trouvé que les valeurs par défaut sont 0755 et 0700? ce n'était pas comme ça que les choses fonctionnaient pour moi, je devais les changer.



0
votes

Storage :: disk ('sftp') -> télécharger (...


2 commentaires

Veuillez expliquer ce que cela fait dans votre réponse.


les réponses avec plus d'explications font souvent mieux ici sur SO.



0
votes

Voici une solution plus globale et plus efficace. J'avais besoin de contrôler les autorisations sur les fichiers et aussi les répertoires lors de l'enregistrement d'un fichier sous des répertoires récursifs.

League SftpAdapter crée les répertoires de manière récursive s'ils n'existent pas encore. Mais le problème principal est que, il n'ajoutera pas le permPublic => 0755 pour les répertoires, mais seuls les fichiers, donc l'utilisateur de www-data finit par ne pas avoir accès à le fichier s'il se trouve dans un répertoire nouvellement créé. La solution est de plonger dans le code pour voir ce qui se passe:

$filesystem->put('dir1/dir2/'.$filename, $contents, 'public');

Dans League \ Flysystem \ Sftp \ StfpAdapter , il y a 2 attributs importants à voir clairement:

$filesystem = Storage::disk('remote-sftp');
$filesystem->getDriver()->getAdapter()->setDirectoryPerm(0755);
$filesystem->put('dir1/dir2/'.$filename, $contents);

Le $ configurable est toutes les clés possibles pour configurer le pilote sftp du système de fichiers ci-dessus. Vous pouvez changer directoryPerm de 0744 à 0755 dans le fichier de configuration:

'directoryPerm' => 0755,

TOUTEFOIS, car il y a une sorte de bogue dans StfpAdapter https://github.com/thephpleague/ flysystem-sftp / issues / 81 qui n'utilisera pas le paramètre $ config sur createDir:

/**
 * @var array
 */
protected $configurable = ['host', 'hostFingerprint', 'port', 'username', 'password', 'useAgent', 'agent', 'timeout', 'root', 'privateKey', 'passphrase', 'permPrivate', 'permPublic', 'directoryPerm', 'NetSftpConnection'];

/**
 * @var int
 */
protected $directoryPerm = 0744;

Ou définissez-le avec public dans le but:

'disks' => [
    'remote-sftp' => [
        'driver' => 'sftp',
        'host' => '222.222.222.222',
        'port' => 22,
        'username' => 'user',
        'password' => 'password',
        'visibility' => 'public', // set to public to use permPublic, or private to use permPrivate
        'permPublic' => 0755, // whatever you want the public permission is, avoid 0777
        'root' => '/path/to/web/directory',
        'timeout' => 30,
        'directoryPerm' => 0755, // whatever you want
    ],
],


0 commentaires