/ usr / bin / env: php: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই


9

আমি আমার অ্যাপ্লিকেশন স্থাপনার জন্য .sh স্ক্রিপ্টটি ব্যবহার করতে চাই। সেই স্ক্রিপ্টটি আমার হোম সার্ভারে রয়েছে (উবুন্টু 15.10 সার্ভার), এক্সিকিউটেবল হিসাবে চিহ্নিত। এই স্ক্রিপ্ট অ্যাক্সেস ssh এর মাধ্যমে সম্পন্ন হয়, এই টিউটোরিয়ালটি ব্যবহার করে , আমি ssh লগইন সেট আপ করেছি, এটি সেই স্ক্রিপ্টটি চালায়। সুতরাং মূলত আমি কেবল কল করি ssh deployer@XXX.com someArgumentsএবং এটি আমার স্ক্রিপ্টটি someArgumentsপরামিতি হিসাবে চালায় । ব্যবহারকারীর deployeruid = 0 রয়েছে, সুতরাং এটির মূলত root(এটি ভবিষ্যতে পরিবর্তিত হবে, আমি এটি ঠিকমত কাজ না করা পর্যন্ত অনুমতি সংক্রান্ত সমস্যাগুলি দূর করার জন্য সেট করেছি)।

জিনিসগুলি কৃপণ হয়ে ওঠে এখানে। স্ক্রিপ্টটি /usr/bin/env: php: No such file or directoryকমান্ডে রিপোর্ট করে /bin/composer install( রচয়িতা ব্যবহার করে )। বিষয়গুলি আরও অদ্ভুত যে আমি এই স্ক্রিপ্টটিতে দেখছি। এই লাইনের আগে, সেখানেও ডাকা হয় /bin/composer self-updateএবং /bin/composer -V, যা উভয়ই সঠিকভাবে চালায় এবং সঠিক আউটপুট প্রদর্শন করে।

আমি নিম্নলিখিত জিনিসগুলি যাচাই করেছি:

  • /usr/bin/env php -vসঠিক পিএইচপি সংস্করণ প্রদর্শন করে (একই /usr/bin/php -v)
  • whereis php প্রদর্শন php: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
  • php5-cli প্যাকেজ ইনস্টল করা হয়েছে এবং নতুন সংস্করণ
  • $PATH রয়েছে /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  • which env প্রদর্শন /usr/bin/env

আমি নিম্নলিখিত বিষয়গুলি চেষ্টা করে দেখেছি:

  • স্ক্রিপ্টটি সরাসরি bash deploy.shমূলের নীচে চালানো (যেহেতু এটি সেই ব্যবহারকারীর মতো) - ত্রুটি ছাড়াই পুরোপুরি কাজ করে
  • সরাসরি ব্যর্থ কমান্ড চলমান - ত্রুটি ছাড়াই নিখুঁত

সুতরাং এটি আমার কাছে খুব সুনির্দিষ্ট ক্ষেত্রে মনে হচ্ছে কেন এই আদেশটি কাজ করে না। আমি এটি ডিবাগ করার 12 ঘন্টা ব্যয় করেছি এবং আমি এখানে ধারণার বাইরে।

পিএস: অনুরূপ ত্রুটি ( /usr/bin/env: node: No such file or directory) ঘটে যখন সেখানে bower install( বোভার ব্যবহার করে ) হয় তবে চলার সময় নয়npm install ( এনপিএম ব্যবহার করে )।


এর sh deployপরিবর্তে bash deploy(সম্ভবত কিছু বাশিজম) চালান । আপনি কীভাবে " নিম্নলিখিত বিষয়গুলি " পরীক্ষা করেছেন ? আমি তাদের স্ক্রিপ্টে পরীক্ষা করার পরামর্শ দিচ্ছি, যাতে আপনি অন্তর্ভুক্তকারীদের উপরের ওভাররাইড এবং স্যানিটেশনগুলি আবিষ্কার করতে পারেন।
গিয়াকোমো ক্যাটেনাজি

" নিম্নলিখিত বিষয়গুলি " সম্পর্কিত: আমি তাদের যুক্ত করেছিলাম। পোস্ট স্ক্রিপ্ট শুরু করার জন্য এবং তারা এই বিষয়গুলিকে আউটপুট করে আমি প্রশ্নবিদ্ধ করে রেখেছি। যদিও আমি তাদের একা চালাচ্ছি একই আউটপুট।
টোম ব্লাটনে

sh deployএবং bash deployউভয়ই একই ফলাফল দেয়
টোম ব্লাটনে

দয়া করে এখানে লাইনটি দেখান। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার স্ক্রিপ্টের এই লাইনে আপনার পিএইচপি কমান্ডটি প্রতিস্থাপন করার জন্য আউটপুট দিয়ে ফাইলটি আউটপুট দিয়ে / usr / bin / env কল করার মুহুর্তে পরিবেশের পরিবর্তনশীলগুলি পরীক্ষা করতে হবে:/usr/bin/env > environment.txt
ওলেগ বোল্ডেন

উত্তর:


5

নিশ্চিত করুন যে লাইন শেষ এবং / বা অদৃশ্য স্পেসগুলি সমস্যার কারণ নয়।

স্ক্রিপ্টের প্রথম লাইনের ফাঁকা স্থান সরিয়ে নতুন সন্নিবেশ করান, জায়গা টিপানোর সময় সিটিআরএল না রাখা তা নিশ্চিত করে।

এছাড়াও, আপনার ডস লাইন শেষ (সিআর + এলএফ) না রয়েছে তা নিশ্চিত করুন। বিশদের জন্য https://stackoverflow.com/questions/82726/convert-dos-line-endings-to-linux-line-endings-in-vim দেখুন ।


আমি আইডিই ব্যবহার করছি, যা স্বয়ংক্রিয়ভাবে সিআর + এলএফ-কে কেবল এলএফ-তে পরীক্ষা করে (এবং রূপান্তর করে) বিওএমকে সরিয়ে দেয় এবং সাদা বর্ণগুলিতে যত্নশীল, তবে আমি এটি ডাবল-চেক করেছি এবং এটি ঠিক আছে (এখনও যদিও এটি কাজ করছে না)। যাইহোক ধন্যবাদ
টোম ব্লাটনে

4

সবচেয়ে সহজ উপায় .... ব্যবহারকারীর শেলটি স্ক্রিপ্ট হিসাবে পরিবর্তন করুন।

/ Etc / passwd

Before:
deploy:x:0:0:,,,:/root:/bin/bash

After:
deploy:x:0:0:,,,:/root:/scripts/deploy.sh

উদাহরণ স্ক্রিপ্ট (নিশ্চিত করুন চালানো বিটটি chmod + x সেট করা আছে)

/scripts/deploy.sh

#!/bin/bash 
PATH=$PATH:/moo etc...
moo.sh

নমুনা কাজের সময়! এমনকি স্ক্রিপ্টটি কোনও এনভির ভেরিয়েবলগুলি সমস্যা সমাধানের / ডিবাগ করার জন্য আপনাকে সক্ষম করা উচিত যা আপনি আনসেট ইত্যাদি অনুভব করতে পারেন ... এছাড়াও হ্যান্ডলিং আর্গুমেন্টগুলি ssh এ প্রেরণ করাও কাজ করবে ..

দ্রষ্টব্য: যে কোনও স্ক্রিপ্ট, এক্সিকিউটেবল ইত্যাদি ইত্যাদির জন্য সর্বদা পথগুলি পুরোপুরি কোয়ালিফাই করার জন্য এটির সেরা অনুশীলন ove উপরে একটি উদাহরণ যা ডিফল্ট পাথকে মু ফোল্ডারের মধ্যে moo.sh কল করতে সক্ষম করে;)

এটা সহজ ছিল .. পোস্ট করার জন্য ধন্যবাদ ..

তথ্যসূত্র: / ইত্যাদি / পাসডাব্লুড ফর্ম্যাট


উত্তম উত্তর, তবে আমি আসলে কখনই সরাসরি সার্ভারে ব্যবহারকারীকে ব্যবহার করি না, আমি সর্বদা sshসার্ভারে থাকি এবং লেন authorized_keysদিয়ে স্ক্রিপ্টটি কল হয় এবং তারপরে সংযোগ শেষ হয়। authorized_keysএই কাজ চালিয়ে যেতে আমি কীভাবে পরিবর্তন করব ?
টোম ব্লাটনে

এটি একই কাজ করা উচিত। আপনি কী দ্বারা প্রমাণীকরণ করবেন এবং যতক্ষণ না রিমোট সার্ভারের / ইত্যাদি / পাসডাব্লুডি ফাইলের মধ্যে প্রশ্নে রিমোট অ্যাকাউন্টের জন্য স্ক্রিপ্ট সেট করা আছে স্ক্রিপ্টটি কার্যকর হবে। আমি শীঘ্রই আমার পোস্টে একটি স্ক্রিনশট যুক্ত করব।
নোটএডমিন ডেভ

1
@ ডেভ আপনার বইটির জন্য অপেক্ষা করতে পারে না
বুর্গি

আপনার উত্তরের জন্য ধন্যবাদ, এটি আমার সমস্যার সমাধান করেনি, তবে আমার জন্য এটি ছিল সবচেয়ে আকর্ষণীয় এবং আসলে আমার অন্যান্য সমস্যাগুলির সমাধান হয়েছিল। আপনাকে অনুগ্রহ
জানালেন

4

envকমান্ড একটি ব্যবহারকারীর মাধ্যমে দেখবে $PATHপ্রদত্ত নাম প্রথম এক্সিকিউটেবল খুঁজে। সুতরাং, এটি চালানো ব্যবহারকারীর ডিরেক্টরিতে যে কোনও ডিরেক্টরিতে /usr/bin/env phpডাকা একটি এক্সিকিউটেবল ফাইলের সন্ধান করবে।php$PATH

আপনার ক্ষেত্রে এটি প্রায় অবশ্যই কারণ একটি কমান্ড চালানোর সময় sshআপনি একটি পূর্ণ শেল শুরু করেন না এবং আপনার শেলের আরম্ভের ফাইলগুলি আসলে পড়েন না। আপনি এই আদেশটি চালিয়ে এটি পরীক্ষা করতে পারেন (একক উদ্ধৃতি নোট করুন):

ssh deployer@XXX.com 'echo $PATH'

এবং আউটপুটকে আপনি যা পান তার সাথে তুলনা করে যদি আপনি ssh deployer@XXX.comএবং তারপরে চালান echo $PATH। আমার সিস্টেমে উদাহরণ স্বরূপ:

$ echo $PATH
/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:

$ ssh localhost 'echo $PATH'
/usr/bin:/bin:/usr/sbin:/sbin

অতএব, যখন $PATHআপনার স্ক্রিপ্টটি চালিত হয় ssh deployer@XXX.comতখন এটি পরীক্ষা করার জন্য আপনি লগ ইন করার সময় একই হয় না।

যে কোনও ক্ষেত্রে, সহজ সমাধানটি হ'ল পরিবর্তকের পরিবর্তে দোভাষীটির পুরো পথটি ব্যবহার করা env। উভয় envএবং সম্পূর্ণ পাথের তাদের সুবিধাগুলি এবং ত্রুটি রয়েছে তবে এই ক্ষেত্রে, পথটি নিরাপদ:

#!/usr/bin/php

ITYM " নোট একক উদ্ধৃতি" নয় " না "।
dave_thompson_085

@ dave_thompson_085 সত্যিই আমি করেছি, ধন্যবাদ।
টার্ডন

আমি আসলে সর্বত্র সর্বত্র পুরো পথ ব্যবহার করছি, যেমনটি আমি আমার প্রশ্নে উল্লেখ করেছি, কমান্ডের ভিতরে ত্রুটিটি রিপোর্ট করা হয়েছে composer install, যা আমি অবশ্যই সংশোধন করতে পারি না। এছাড়াও $PATHঠিক আছে, যেমন আমি আমার প্রশ্নে উল্লেখ করেছি, আমি স্ক্রিপ্টে যুক্ত করে এবং ssh লগইনের মাধ্যমে দূরবর্তীভাবে চালিয়ে সমস্ত জিনিস পরীক্ষা করেছিলাম। ssh deployer@XXX.com 'echo $PATH'আপনি যেমন বলেছিলেন তেমনটিও আমি যাচাই করতে পারি না , যেহেতু আমার ssh লগইনটি কেবল একটি স্ক্রিপ্টের মধ্যে সীমাবদ্ধ, তবে আমি যখন script স্ক্রিপ্টে AT PATH যোগ করি তখন তা পরীক্ষা করে দেখেছি (উপরে বর্ণিত) যাইহোক, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ এবং গ্রহণ + 1 আমার ব্যাখ্যা জন্য envজিনিস
Tomáš Blatný

@ টমব্লাতনý ভাল, আপনি কোথাও এনভিটি ব্যবহার করছেন, বা আপনি ত্রুটিটি দেখছেন না। আমি সুরকারকে চিনি না তবে আপনাকে সম্ভবত পিএইচপি এক্সিকিউটেবলের জন্য এটির পথে কোনও ডিরেক্টরিতে লিপি বা লিঙ্ক করতে হবে। এই ধরণের জিনিসটি ডিবাগ করা শক্ত কারণ যেহেতু একে অপরের উপর নির্ভর করে প্রচুর জিনিস রয়েছে।
টেরডন

সত্য যে, envআসলে সুরকার ভিতরে বলা হয়। তবে এটি সমস্যার সমাধান করে না, কেন কোনও রচয়িতা কল পাস করে, এবং কেউ না। তবে আমি এর কোডটি অনুসন্ধান করে এটি আরও তদন্ত করব। আপনার সময়ের জন্য ধন্যবাদ
টোম ব্লাটনে

2

এটি কি সম্ভব যে bashএর হ্যাশ টেবিলটিতে পুনরায় সেট করা দরকার?

যদি তা হয় তবে আপনি hash -rআপনার স্ক্রিপ্টে কোথাও যুক্ত করার চেষ্টা করতে পারেন , যা $PATHহ্যাশ টেবিল থেকে প্রাপ্ত তথ্যের উপর নির্ভর করে (সম্ভবত পুরানো) পরিবর্তে শেলটিকে আবার সন্ধান করতে বাধ্য করে ।

যখন প্রয়োজন হয়, অপশনটি hashব্যবহার করে অ-মানক স্থানে এক্সিকিউটেবলের জন্য ইনস্টল করাযোগ্যগুলির জন্য পাথগুলি মনে রাখতে শেলটিকে সক্ষম করতে -pবা -dবিকল্পের সাথে পাথগুলি ভুলে যেতে পারে ।

সূত্র:

https://unix.stackexchange.com/a/86017/121251
https://stackoverflow.com/a/22543353/2146843


এটি আমার পক্ষে সমস্যাটির সমাধান করেনি, তবে এটি একটি ভাল জ্ঞান, তাই আমি আপনাকে একটি +1 যোগ করেছি
টমে ব্লাটনে

1

দেখে মনে হচ্ছে সম্ভবত আপনার পথে পিএইচপি যুক্ত করা দরকার। চেষ্টা করুন:

vim ~/.bashrc
PATH=$PATH:/usr/local/bin/php
export PATH

আপনার পিএইচপি কোথায় বাস করে তা নিশ্চিত হওয়ার জন্য আপনি কোথায় থাকতে চান তাও পরীক্ষা করতে চাইতে পারেন to চেষ্টা করুন:

which php

ওয়েল এটি সমস্যা নয়, যেহেতু php -vসঠিক পিএইচপি সংস্করণ এবং composer --versionআউটপুটগুলি সুরকার সংস্করণ আউটপুটগুলি। আমি যেমন বলেছি, সমস্যা কেবলমাত্র এক আদেশে।
টোম ব্লাটনে

1

এটি স্পষ্ট যে আপনার একটি পাথ সমস্যা আছে যেহেতু আপনি যখন একটি সাধারণ এসএস লগইন করবেন তখন আপনার মোস্ত্রি স্ক্রিপ্টটি অবশ্যই এমন জিনিসগুলি খুঁজে পাবে না যেগুলি অবশ্যই পথে রয়েছে।

আপনার প্যাথ সমস্যা রয়েছে তা নিশ্চিত করার জন্য প্রথমে কাজটি হ'ল envকমপক্ষে আউটপুটটি লগ ইন করতে আপনার মোস্তাক স্ক্রিপ্ট আপডেট করা echo $PATH। আমি অনুমান করছি যে আপনার মোতায়েনের স্ক্রিপ্টটি যেভাবে বলা হচ্ছে, $ PATH সেটাকে সেট করা হয়নি যেমনটি আপনি প্রত্যাশা করবেন। এই ডিবাগ আউটপুটটি আমার তত্ত্বটি নিশ্চিত / অস্বীকার করবে।

আপনার অনুসরণ করা টিউটোরিয়ালটি আমি দেখেছি। আপনি সম্ভবত করুন নিশ্চিত করা উচিত command=হবে command="/bin/sh /path/to/your/script..."যদি আপনি নিশ্চিত করুন যে আপনার স্ক্রিপ্ট ডান শেল দ্বারা চালানো হয় না করতে ইতিমধ্যে আছে।

আপনার যদি কোনও প্যাথ সমস্যা থাকে তবে আপনার তাত্পর্যপূর্ণ স্ক্রিপ্টের শুরুতে স্পষ্টভাবে PATH সেট করার জন্য একটি দ্রুত / নোংরা ফিক্স।

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

বিস্তারিত ব্যাখ্যা এবং আরও বিকল্পগুলি ...

লিনাক্সে যখন কমান্ডগুলি চালিত হয় তারা তাদের পিতামাতার প্রক্রিয়াটির পরিবেশের উত্তরাধিকারী হয়।

আপনি যখন এসএসএইচ এর মাধ্যমে সাধারণ ব্যবহারকারী হিসাবে লগইন করেন তখন এমন কিছু ঘটে থাকে (যেমন চলমান / ইত্যাদি / বাশার্ক / ইত্যাদি / প্রোফাইল। / .Bash_profile ~ / .bashrc ইত্যাদি)। এই মুহুর্তে আপনি process export PATH="$PATH:~/mybin"স্ক্রিপ্টগুলির মতো কাজ করে আপনার প্রক্রিয়াটির পরিবেশ আপডেট করতে পারেন । এখন আপনার চালিত ভবিষ্যতের যে কোনও প্রক্রিয়া আপনার বর্তমান পরিবেশের উত্তরাধিকারী হবে।

লগইন শেল পাওয়ার পরিবর্তে একটি কমান্ড চালনার অর্থ হ'ল কমান্ডটি ssh ডিমন দ্বারা চালিত হয় এবং এটি ssh ডিমন প্রক্রিয়াটির পরিবেশের অধিকারী হবে ... যা সম্ভবত লগ ইন হওয়া ব্যবহারকারী হিসাবে আপনার পরিবেশের চেয়ে পৃথক different

অনুমোদিত কীগুলির জন্য ম্যান পৃষ্ঠাটি প্রমাণীকরণের পরে কী ঘটে তা কভার করে। পরিবেশ সম্পর্কিত:

  1. Exists / .ssh / এনভায়রনমেন্ট ফাইলটি উপস্থিত থাকলে, এবং ব্যবহারকারীদের তাদের পরিবেশ পরিবর্তন করার অনুমতি দেওয়া হয়। Sshd_config (5) এ PermitUserEn वातावरण বিকল্প দেখুন।

সুতরাং প্রক্রিয়াটির জন্য পরিবেশ কনফিগার করার উপযুক্ত জায়গাটি ~/.ssh/environmentযেখানে ~ব্যবহারকারীর জন্য হোম ডিরেক্টরি রয়েছে যা কমান্ডটি চালানোর জন্য অনুমোদনপ্রাপ্ত। পারমিট ব্যবহারকারীর পরিবেশ অনুমোদিত কিনা তা নিশ্চিত করতে আপনার sshd_config পরীক্ষা করে দেখতে হবে check

~/.ssh/environment ফর্ম্যাট অবশ্যই ম্যান পৃষ্ঠাতে নির্দিষ্ট করা হয়।

         This file is read into the environment at login (if it exists).
         It can only contain empty lines, comment lines (that start with
         '#'), and assignment lines of the form name=value.  The file
         should be writable only by the user; it need not be readable by
         directory becomes accessible.  This file should be writable only
         by the user, and need not be readable by anyone else.

উপরের উল্লিখিত পদ্ধতিটি ব্যবহার না করে পরিবেশ নির্দিষ্ট করার বিকল্প উপায় হ'ল environment="NAME=value"অনুমোদিত_কিজ ফাইলটিতে বিকল্পটি ব্যবহার করা । বিস্তারিত জানার জন্য উপরে লিঙ্ক করা ম্যান পৃষ্ঠাটি দেখুন।


সম্পর্কিত Without knowing exactly how you have setup your deploy script to run: আমার প্রশ্নের সূচনায়, এখানে একটি লিঙ্ক রয়েছে, কীভাবে আমি এটি সেট আপ করেছি (ব্যবহার ~/.ssh/authorized_keysকরে upd ধন্যবাদ কমান্ড আপডেট করার সাথে সাথে, আমি এটি চেষ্টা করেছি, তবে দুর্ভাগ্যক্রমে কোনও পার্থক্য নেই however তবে আমি আরও তদন্ত করব এবং বিভিন্ন গোলাগুলি চেষ্টা করব) দয়া করে এই ধারণার জন্য একটি +1 গ্রহণ করুন
টোম ব্লাটনে

আপনি কি বর্তমান $ PATH প্রিন্ট করতে আপনার মোতায়েনের স্ক্রিপ্টটি আপডেট করার চেষ্টা করেছিলেন? আপনি কি ফলাফল পোস্ট করতে পারেন? যদি এটি আপনি যা প্রত্যাশা করেন তার সাথে মেলে না, তবে আপনার মোস্তক স্ক্রিপ্টের শুরুতে আমি যেমন পরামর্শ দিয়েছিলাম ঠিক তেমনই PATH সেট করার চেষ্টা করতে পারেন।
ম্যাটপ্রিপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.