11
votes

Comment changer la coquille pour PHP's Exec ()

Je souhaite utiliser la fonction Exec () de PHP sur un serveur Ubuntu. Le problème est que j'ai toujours une erreur que la commande est introuvable. Par exemple, en utilisant xxx

impressions

SH: / ECHO: non trouvé

Pour moi, il semble que PHP utilise le shell sh shell, lorsque je veux utiliser Bash. J'ai essayé de changer la coquille pour www-data dans / etc / passwd, cela n'a pas aidé non plus.

Quelqu'un a-t-il une idée où le problème peut venir ou comment je peux changer la coquille pour PHP's Ubuntu Utilisateur.

Merci, Timo


[modifier]

Peut-être que cela aide:

J'appelle un script Bash De SSH en tant que Timo, ce script appelle un script PHP, qui utilise EXEC. Je sais, ça sonne bizarre, mais cela fait partie d'un environnement de développement plus grand ...

Le point est, je ne suis jamais certain, comme l'utilisateur que le script inside exécuté est exécuté.


[modifier]

J'en ai maintenant compris qu'il doit y avoir un autre problème de droits impliqué. Même si j'essaie d'appeler un test de script bash.sh (par son chemin complet!) De l'exécutif, PHP Test.php Dirons simplement.

sh: /test.sh: non trouvé


0 commentaires

5 Réponses :


0
votes

Je pense que le problème est qu'il n'ya pas de configuration de path $. Essayez d'utiliser des chemins complets sur vos fichiers binaires, c'est-à-dire / bin / echo


1 commentaires

Merci pour votre réponse super rapide. Malheureusement, cela n'a pas résolu le problème. / bin / echo ne fonctionne pas non plus. Ce que je voulais réellement faire, c'est ceci / usr / bin / mysql --user = asdf -password = asdf mydb <./dump.sql Comme vous pouvez le constater, j'ai même utilisé le chemin absolu. L'ECHO n'était qu'un exemple pour le rendre plus simple ... Toute autre idée peut-être?



0
votes

Si ce que vous voulez faire est:

/ usr / bin / mysql --user = asdf -password = asdf mydb <./dump.sql

Puis j'imagine que cela fonctionnerait (quelle que soit la coquille):

/ usr / bin / mysql --user = asdf -password = asdf mydb


3 commentaires

Oh, et je ne sais pas comment définir la coquille dans PHP, mais vous pouvez appeler un script de sh avec "#! / Bin / bash" comme c'est la première ligne, si vous avez vraiment besoin de bash (et de ne pas pouvoir trouver une autre façon de le faire).


Le problème n'est pas, que ma décharge ne puisse pas être trouvée, mais plutôt mysql ne peut pas être trouvée ...


S'il y a vraiment un binaire installé à / USR / bin / mysql, alors sh le trouverait et le problème est autre chose - comme peut-être que le mode sans danger est activé (à la caisse des documents pour Safe-Mode-Exec-dir et similaire). Une autre chose à vérifier est Open_Basedir, qui peut également limiter ce que EXED a accès aussi.



12
votes

essayez plutôt shell_exec () à la place. EXED ne doit pas invoquer une coquille pour exécuter votre programme. Alternativement, vous pouvez invoquer Bash avec EXEC comme xxx


3 commentaires

Cela va simplement dire "sh: / bash: non trouvé". ressemble à des recherches php pour tous les fichiers binaires dans /. dans php.ini sûre_mode_exec_dir n'est défini sur rien, alors je suppose que cela signifie qu'il n'y a pas de restrictions !? (Changer cela ne semble pas aider)


Je n'ai aucune expérience avec le mode sans échec, alors peut-être que c'est votre problème. Essayez de l'éteindre? Vous ne devriez pas l'utiliser de toute façon, cela s'en va et était une mauvaise idée du début (liste la plupart des fonctionnalités de langue PHP ") php.net/manual/fr/features.safe-mode.php


Je n'ai pas remarqué que quelqu'un avait mentionné ce mode de sécurité déjà convenu est considéré comme nocif. Concernant Safe_Mode_Exec_Dir, si le mode sans échec est activé et que celui-ci est réglé sur vide, alors cela l'expliquerait (si vous souhaitez exécuter tout ce qu'il y aurait besoin de régler sur /). Je vous suggère d'essayer de la définir à quelque chose de significatif et d'invoquer quelque chose dans ce chemin.



0
votes

Je pense que php appels / bin / shinalement (ou cmd.exe sous Windows), quelle que soit la fonction que vous utilisez.

exécution ls -l / proc / $$ / exe | SED 'S%. * / %%' Dans votre terminal dans un système Linux doit vous indiquer ce que vous utilisez votre sélection, qui est bash dans mon terminal Ubuntu par défaut. Si vous exécutez les éléments suivants à Ubuntu: xxx

Vous obtiendrez ["DASH"] comme résultat, quelle que soit la fonction que vous utilisez. Si vous changez / bin / sh pour pointer sur bash plutôt que de pointiller, le résultat de PHP change de bash, mais je ne recommande pas de faire cela évidemment.

si longue histoire Il n'est probablement pas possible de changer Ceci sans modifier la coque par défaut de l'ensemble de votre serveur ou la compilation de PHP de la source.

Si vous souhaitez résoudre le mystère plus loin, il est probablement lié à ext / standard / proc_open.c et ext / standard / exécu.c ( Toutes ces fonctions sont là, système, passthru, etc.) dans la source PHP, mais pour être honnête, cela me bat.


0 commentaires

0
votes

J'ai eu un problème avec l'image de Debian Docker PHP, cela m'a aidé:

https://www.reliableMeddedsystems.com/wiki/index.php?title=make_bash_default_shell

/ bin / sh était un symbole symbolique à Dash, qui peut être meilleur mais ne fonctionne pas avec mes scripts. xxx


0 commentaires