পিএইচপি থেকে পাইথন স্ক্রিপ্ট চলছে


114

আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে পিএইচপি থেকে পাইথন স্ক্রিপ্ট চালানোর চেষ্টা করছি:

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

তবে, পিএইচপি কেবল কোনও আউটপুট উত্পাদন করে না। ত্রুটি প্রতিবেদন E_ALL এ সেট করা হয়েছে এবং প্রদর্শন_রক্ষণগুলি চালু আছে।

এখানে আমি চেষ্টা করেছি:

  • আমি ব্যবহার python2, /usr/bin/python2এবং python2.7পরিবর্তে/usr/bin/python2.7
  • আমি একটি নিখুঁত পাথের পরিবর্তে একটি আপেক্ষিক পথও ব্যবহার করেছি যা কোনও কিছুই পরিবর্তন করেনি।
  • আমি কমান্ড ব্যবহার করার চেষ্টা exec, shell_exec, system

তবে আমি যদি দৌড়ে যাই

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

এটি পুরোপুরি ঠিকঠাক কাজ shutdown nowকরে যখন কিছু না করে।

পিএইচপি-তে ফাইল অ্যাক্সেস এবং সম্পাদন করার অনুমতি রয়েছে।

সম্পাদনা: আলেজান্দ্রোকে ধন্যবাদ, আমি সমস্যাটি সমাধান করতে সক্ষম হয়েছি। আপনার যদি একই সমস্যা থাকে তবে ভুলে যাবেন না যে আপনার ওয়েবসার্ভার সম্ভবত / আশাবাদী মূল হিসাবে চলবে না। আপনার ওয়েবসারভার ব্যবহারকারী বা অনুরূপ অনুমতি সহ ব্যবহারকারী হিসাবে লগ ইন করার চেষ্টা করুন এবং নিজেই কমান্ডগুলি চালনার চেষ্টা করুন।


প্রথমে এই ইস্যুটি দেখুন stackoverflow.com/questions/21659637/… স্থির না হলে এবং আপনি যদি আমদানি বা tty বা কোনও জিজ্ঞাসাবাদে কাজ না করে আটকে থাকেন তবে এই জাতীয় সমস্যাগুলি কার্যকর করার জন্য বিশদ পদক্ষেপের জন্য এই লিঙ্কটি দেখুন। stackoverflow.com/a/57978771/9470457 ধন্যবাদ !!!
য়

উত্তর:


159

উবুন্টু সার্ভার 10.04 এ পরীক্ষিত। আমি আশা করি এটি আপনাকে আর্চ লিনাক্সেও সহায়তা করে।

পিএইচপি-তে শেল_এক্সেক ফাংশন ব্যবহার করুন :

শেলের মাধ্যমে কমান্ড কার্যকর করুন এবং স্ট্রিং হিসাবে সম্পূর্ণ আউটপুট ফেরত দিন।

এটি এক্সিকিউটেড কমান্ড বা NULL থেকে আউটপুট প্রদান করে যদি কোনও ত্রুটি দেখা দেয় বা কমান্ডটি আউটপুট না দেয়।

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

পাইথন ফাইলে test.py, এই পাঠ্যটিকে প্রথম লাইনে যাচাই করুন: (শেবাং ব্যাখ্যা করুন) :

#!/usr/bin/env python

এছাড়াও পাইথন ফাইলে অবশ্যই সঠিক সুযোগ - সুবিধা থাকতে হবে (পিএইচপি স্ক্রিপ্ট ব্রাউজারে বা কার্ল চললে ব্যবহারকারী www-ডেটা / অ্যাপাচি-এর জন্য কার্যকর) এবং / অথবা অবশ্যই "এক্সিকিউটেবল" হতে হবে। এছাড়াও .pyফাইলের সমস্ত কমান্ডের অবশ্যই সঠিক সুযোগগুলি থাকতে হবে:

পিএইচপি ম্যানুয়াল থেকে নেওয়া :

যারা ইউনিক্স-টাইপ প্ল্যাটফর্মে শেল_এক্সেক ব্যবহার করার চেষ্টা করছেন তাদের জন্য কেবলমাত্র একটি দ্রুত অনুস্মারক এবং এটি কাজ করে বলে মনে হচ্ছে না। পিএইচপি সিস্টেমে ওয়েব ব্যবহারকারী হিসাবে কার্যকর করে (সাধারণত অ্যাপাচি-এর জন্য www), তাই আপনাকে শেল_এক্সেক কমান্ডে যে ফাইল বা ডিরেক্টরি ব্যবহার করার চেষ্টা করছেন তা ওয়েব ব্যবহারকারীর অধিকার রয়েছে কিনা তা নিশ্চিত হওয়া দরকার। অন্যথায়, এটি কিছু করছে বলে মনে হবে না।

করতে UNIX-টাইপ প্ল্যাটফর্মের উপর এক্সিকিউটেবল একটি ফাইল করা :

chmod +x myscript.py

6
ধন্যবাদ, যে কৌশলটি করেছেন! আরও একটি সমস্যা ছিল - অ্যাপাচি ব্যবহারকারী পাইথন স্ক্রিপ্টে কোনও কমান্ড চালাতে সক্ষম হননি তবে আমি sudo ব্যবহার করে এবং আমার স্ক্রিপ্টের জন্য sudoers ফাইলে একটি ব্যতিক্রম যুক্ত করে তা ঠিক করতে সক্ষম হয়েছি। আবার ধন্যবাদ! :)
পরিত্যক্ত অ্যাকাউন্ট

1
আমি অ্যাপাচি ব্যবহারকারীর একই সমস্যার মুখোমুখি, আপনি কি আমাকে গাইড করতে পারেন?
এমা

1
আমি আপনার উত্তরটি ব্যবহার করেছি, এটি অজগর স্ক্রিপ্টটি সূক্ষ্মভাবে কার্যকর করে তবে ওয়েব পৃষ্ঠায় প্রদর্শিত ফলাফলের প্রতিধ্বনি করতে পারি না, আপনি আমাকে সহায়তা করতে পারেন?
হামদী চেরেফ

1
"#! / usr / bin / env পাইথন" প্রথম লাইনে আমার কাছে কৌশলটি করেছিল। গ্রেট!
সি

1
জন্য : ওএসএক্স echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py"); : অথবাecho shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
সাইবর্গের

23

আমি passthruসরাসরি আউটপুট বাফার ব্যবহার এবং পরিচালনা করার পরামর্শ দিচ্ছি :

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

16

আপনি যদি কমান্ডের রিটার্নের স্থিতি জানতে চান এবং পুরো stdoutআউটপুট পেতে পারেন তবে আপনি আসলে ব্যবহার করতে পারেন exec:

$command = 'ls';
exec($command, $out, $status);

$out সমস্ত লাইনের একটি অ্যারে। $statusপ্রত্যাবর্তন অবস্থা। ডিবাগিংয়ের জন্য খুব দরকারী।

আপনি যদি stderrআউটপুটটি দেখতে চান তবে আপনি হয় প্রো_পেনের সাথে খেলতে পারেন বা কেবল 2>&1আপনার এ যোগ করতে পারেন $command। পরের জিনিসগুলি প্রায়শই জিনিসগুলি কাজ করতে এবং "বাস্তবায়নের জন্য" দ্রুতগতিতে পাওয়ার জন্য যথেষ্ট।


8

আলেজান্দ্রো এটিকে পেরেক দিয়েছিল, ব্যতিক্রমের (উবুন্টু বা দেবিয়ান) স্পষ্টতা যোগ করে - আমার নিজের উত্তরটি যুক্ত করার মতো সংবাদ নেই rep

sudoers ফাইল: sudo visudo

ব্যতিক্রম যুক্ত: www-data ALL=(ALL) NOPASSWD: ALL


7
Sudoers- এ www-ডেটা যুক্ত করতে কার্যকর বলে মনে হচ্ছে না, এবং অ্যাপাচে এর আরও প্রয়োজনীয় অনুমতি দেয় যা এটি প্রয়োজন। আপনি যে স্ক্রিপ্টটি চালাচ্ছেন তাতে www-ডেটা অনুমতি দেওয়া যথেষ্ট।
জেসনআরডাল্টন

দুর্দান্ত ধারণা, তবে অবশ্যই আপনার সিস্টেমটিকে দুর্বল করে তুলতে পারে। আমি @ জেসনআরডালটনের সাথে একমত
রিড ২

6

পরিস্থিতির উপর ভিত্তি করে কোন আদেশ ব্যবহার করতে হবে তা পরিষ্কার করা

exec() - একটি বাহ্যিক প্রোগ্রাম কার্যকর করুন

system() - একটি বাহ্যিক প্রোগ্রাম কার্যকর করুন এবং আউটপুট প্রদর্শন করুন

passthru() - একটি বাহ্যিক প্রোগ্রাম কার্যকর করুন এবং কাঁচা আউটপুট প্রদর্শন করুন

সূত্র: http://php.net/manual/en/function.exec.php


4

আমার ক্ষেত্রে আমি একটি নতুন ফোল্ডার তৈরি করা প্রয়োজন wwwডিরেক্টরির নামক scripts। এর মধ্যে scriptsআমি নতুন একটি ফাইল যুক্ত করেছি test.py

আমি তখন ব্যবহার করেছি sudo chown www-data:root scriptsএবং sudo chown www-data:root test.py

তারপরে আমি নতুন scriptsডিরেক্টরিতে গিয়ে ব্যবহার করেছি sudo chmod +x test.py

আমার টেস্ট.পি ফাইলটি এটির মতো দেখাচ্ছে। পৃথক পাইথন সংস্করণ নোট করুন:

#!/usr/bin/env python3.5
print("Hello World!")

পিএইচপি থেকে আমি এখন এটি করি:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

এবং আপনার দেখতে হবে: হ্যালো ওয়ার্ল্ড!


3

উপরোক্ত পদ্ধতিগুলি জটিল বলে মনে হচ্ছে। রেফারেন্স হিসাবে আমার পদ্ধতি ব্যবহার করুন।

আমার কাছে এই দুটি ফাইল রয়েছে:

  • run.php

  • mkdir.py

এখানে, আমি একটি HTML পৃষ্ঠা তৈরি করেছি যার মধ্যে একটি রয়েছে GO বোতাম । আপনি যখনই এই বোতামটি টিপেন তখন ডিরেক্টরিতে একটি নতুন ফোল্ডার তৈরি করা হবে যার পথ আপনি উল্লেখ করেছেন।

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
	if(isset($_POST['GO']))
	{
		shell_exec("python /var/www/html/lab/mkdir.py");
		echo"success";
	}
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

1

এটি এত তুচ্ছ, তবে ইতিমধ্যে যে কেউ আলেজান্দ্রোর পরামর্শ অনুসরণ করে তবে এই ত্রুটির মুখোমুখি হয়েছিল তাকেই সহায়তা করতে চেয়েছিলেন:

sh: blabla.py: কমান্ড পাওয়া যায় নি

যদি কেউ এই ত্রুটির মুখোমুখি হন তবে আলেজান্দ্রো দ্বারা পিএইচপি ফাইলটিতে কিছুটা পরিবর্তন করা দরকার:

$command = escapeshellcmd('python blabla.py');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.