/ usr / bin / env: php: Böyle bir dosya veya dizin yok


9

Uygulamamın dağıtımında .sh komut dosyasını kullanmak istiyorum. Bu komut dosyası ev sunucumda (Ubuntu 15.10 Sunucu) yürütülebilir olarak işaretlendi. Bu komut dosyasına erişim, bu öğreticiyi kullanarak ssh aracılığıyla yapılır , bu komut dosyasını çalıştıran ssh girişini ayarladım. Yani temelde ben sadece aramak ssh deployer@XXX.com someArgumentsve someArgumentsparametre olarak benim komut dosyası ile çalışır . Kullanıcı deployeruid = 0 vardır, bu yüzden temelde root(bu gelecekte değişecektir, ben sadece düzgün çalışana kadar izin sorunlarını ortadan kaldırmak için ayarladım).

Ve işlerin zorlaştığı yer burası. Komut dosyası /usr/bin/env: php: No such file or directorykomutta rapor verir /bin/composer install( Composer kullanarak ). Bu senaryoya baktığımda işler daha garip. Bu hat önce, orada da denir /bin/composer self-updateve /bin/composer -Vhem doğru çıktı düzgün çalışır ve görüntülediği.

Aşağıdaki şeyleri kontrol ettim:

  • /usr/bin/env php -vdoğru PHP sürümünü görüntüler (ile aynı /usr/bin/php -v)
  • whereis php görüntüler php: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
  • php5-cli paket yüklü ve en yeni sürüm
  • $PATH içeren /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  • which env görüntüler /usr/bin/env

Ben de aşağıdaki şeyleri denedim:

  • betiği doğrudan bash deploy.shroot altında çalıştırmak (bu kullanıcı ile aynı olduğundan) hatasız mükemmel çalışır
  • doğrudan başarısız komutları çalıştırmak - ayrıca hatasız mükemmel

Bu bana çok özel bir durum gibi geliyor, bu komutun neden çalışmadığı. Hata ayıklamak için 12 saat harcadım ve burada fikirlerim kalmadı.

Not: Benzer hata ( /usr/bin/env: node: No such file or directory) olduğunda meydana gelir bower install(kullanarak Bower ), ancak değil çalıştırırken npm install(kullanarak UÖM'sini ).


Koşmak sh deployyerine bash deploy(belki biraz bashizm). " Aşağıdaki şeyleri " nasıl kontrol ettiniz ? Onları envanterin geçersiz kılmalarını ve sağlık önlemlerini keşfedebilmeniz için komut dosyasında kontrol etmenizi öneririm.
Giacomo Catenazzi

" şeyleri takip " ile ilgili: Onları deploy.sh betiğinin başlangıcına ekledim ve sorguladığım şeyleri çıktılar. Yine de aynı çıktı onları yalnız çalıştırdığım zaman.
Tomáš Blatný

sh deployve bash deployher ikisi de aynı sonuçları veriyor
Tomáš Blatný

O çizgiyi burada göster lütfen. / Usr / bin / env /usr/bin/env > environment.txt
çağrılırken

Yanıtlar:


6

Satır sonlarının ve / veya görünmez boşlukların soruna neden olmadığından emin olun.

Komut dosyasının ilk satırındaki boşlukları kaldırın ve boşluk tuşuna basarken CTRL tuşunu tutmadığınızdan emin olun.

Ayrıca, DOS satır sonlarının (CR + LF) olmadığından emin olun. Ayrıntılar için /programming/82726/convert-dos-line-endings-to-linux-line-endings-in-vim adresine bakın.


CR + LF'yi yalnızca LF'ye otomatik olarak kontrol eden (ve dönüştüren) IDE kullanıyorum, ürün ağacını kaldırır ve beyaz karakterlerle ilgilenir, ancak iki kez kontrol ettim ve tamam görünüyor (yine de çalışmıyor). Neyse teşekkürler
Tomáš Blatný

4

En kolay yol .... kullanıcının kabuğunu komut dosyası olarak değiştirin.

/ Etc / passwd

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

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

Örnek komut dosyası (yürütme bitinin chmod + x olarak ayarlandığından emin olun)

/scripts/deploy.sh

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

Örneklem Her zaman çalışır! Hatta unset vb olduğunu hissedebilirsiniz herhangi bir env değişkenleri gidermek / hata ayıklamak için komut dosyası kullanabilmeniz gerekir ... Ayrıca ssh geçirilen işleme argümanları da çalışacaktır ..

Not: Komut dosyalarının, yürütülebilir dosyaların vb. Yollarını her zaman TAM KALİTE ETMEK İÇİN EN İYİ UYGULAMA

Kolaydı .. Gönderdiğiniz için teşekkürler ..

Referans: / etc / passwd formatı


Güzel cevap, ama aslında kullanıcıyı doğrudan sunucuda kullanmam, her zaman sshsunucuya ve şeritte authorized_keyskomut dosyası çağrılır ve bağlantı sona erer. Bunu authorized_keysdevam ettirmek için nasıl değişiklik yapmalıyım ?
Tomáš Blatný

Aynı şekilde çalışmalıdır. Anahtar aracılığıyla kimlik doğrulaması yaparsınız ve kabuk, uzak sunucunun / etc / passwd dosyası içinde söz konusu uzak hesabın komut dosyasına ayarlandığı sürece komut dosyasının yürütür. Kısa süre içinde yayınıma bir ekran görüntüsü ekleyeceğim.
NotAdmin Dave

1
@Dave kitabınızı bekleyemez
Burgi

Cevabınız için teşekkürler, sorunumu çözmedi, ancak benim için en ilginç ve aslında çözdüğüm diğer problemlerdi. Verdi sen the bounty, teşekkürler tekrar
Tomáš Blatný

4

envBir kullanıcı ile bakacağız komut var $PATHverilen adının ilk yürütülebilir bulmak için. Bu nedenle, /usr/bin/env phponu çalıştıran kullanıcının phpdizinlerinden herhangi birinde çağrılan yürütülebilir bir dosya arayacaktır $PATH.

Sizin durumunuzda, bunun nedeni neredeyse bir komutun çalıştırılması sırasında sshtam bir kabuk başlatmamanız ve kabuğunuzun başlatma dosyalarını gerçekten okumamanızdır. Bu komutu çalıştırarak bunu kontrol edebilirsiniz (tek tırnaklara dikkat edin):

ssh deployer@XXX.com 'echo $PATH'

Ve eğer ne elde etmek çıkışını karşılaştıran ssh deployer@XXX.comve sonra çalıştırın echo $PATH. Sistemimde. Örneğin:

$ 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

Bu nedenle, $PATHkomut dosyanızın çalıştırıldığında erişebileceği ssh deployer@XXX.com, sınamak için oturum açtığınız zamankiyle aynı değildir.

Her durumda, basit çözüm tercüman yerine tam yolu kullanmaktır env. Hem envyolların hem de tam yolların yararları ve sakıncaları vardır, ancak bu durumda yol daha güvenlidir:

#!/usr/bin/php

ITYM " not değil" tek tırnak " değil ".
dave_thompson_085

@ dave_thompson_085 gerçekten yaptım, teşekkürler.
terdon

Aslında her yerde tam yolları kullanıyorum, sorumu belirttiğim gibi, hata açıkça değiştiremediğim komutun içinde bildiriliyor composer install. Ayrıca $PATHtamam, sorum da belirttiğim gibi, her şeyi komut dosyasına ekleyerek ve ssh giriş yoluyla uzaktan çalıştırarak kontrol ettim. Ayrıca ssh deployer@XXX.com 'echo $PATH'ssh girişim sadece bir komut dosyasıyla sınırlı olduğundan, belirttiğiniz gibi kontrol edemiyorum, ancak bu komut dosyasına $ PATH eklediğimde bunu kontrol ettim (yukarıda belirtilmiştir) Neyse, cevabınız için teşekkür ederim ve + 1 envşey açıklamak için
Tomáš Blatnı

@ TomášBlatný iyi, bir yerde env kullanıyorsun, ya da bu hatayı görmezdin. Besteci bilmiyorum ama muhtemelen kopyalamak veya yolundaki bir dizine php yürütülebilir bağlamak zorunda kalacak. Bu tür şeyleri ayıklamak zordur, çünkü her biri diğerine bağlı olarak çok şey vardır.
terdon

Bu doğru, envaslında besteci içinde denir. Ancak bu sorunu çözmez, neden bazı besteci çağrıları geçerken bazıları geçmez. Bununla birlikte, kodunu inceleyerek bunu araştıracağım. Zaman ayırdığınız için teşekkürler
Tomáš Blatnı

2

O mümkün mü bashonun karma tabloya bir sıfırlama ihtiyacı var?

Eğer öyleyse, hash -rsenaryonuzda bir yere eklemeyi deneyebilirsiniz , bu $PATHda hash tablosundan (muhtemelen eskimiş) bilgiye güvenmek yerine kabuğun tekrar gözden geçirilmesini zorlar .

Gerektiğinde, hashkabuğun -pseçeneği kullanarak standart olmayan konumlara yüklenen yürütülebilir dosyalara giden yolları hatırlamasını veya bu -dseçenekle yolları unutmasını sağlayabilir .

Kaynaklar:

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


Bu benim için sorunu çözmedi, ancak onun iyi bir bilgi, bu yüzden size bir +1 ekledi
Tomáš Blatný

1

Görünüşe göre yolunuza php eklemeniz gerekebilir. Deneyin:

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

Ayrıca yolun doğru olduğundan emin olmak için php nerede yaşıyor kontrol etmek isteyebilirsiniz. Deneyin:

which php

php -vÇıkışlar doğru PHP sürümü ve composer --versionçıkış besteci sürümü olduğundan, bu sorun değil . Dediğim gibi, sorun sadece bir komutta.
Tomáš Blatný

1

Konuşlandırma komut dosyanız, normal bir ssh girişi yaptığınızda kesinlikle yolda olan şeyleri bulamadığı için bir yol sorununuz olduğu açıktır.

PATH sorununuz olduğunu doğrulamak için yapılacak ilk şey, enven azından çıktısını günlüğe kaydetmek için konuşlandırma komut dosyanızı güncellemektir echo $PATH. Dağıtım komut dosyanızın çağrıldığı şekilde, $ PATH beklediğiniz gibi ayarlanmadığını tahmin ediyorum. Bu hata ayıklama çıktısı teorimi doğrulayacak / reddedecek.

İzlediğiniz öğreticiye baktım. Muhtemelen güncelleme de emin olmalısınız command=olmak command="/bin/sh /path/to/your/script..."zaten emin komut sağ kabuk tarafından çalıştırılır yapmamaya varsa.

Bir PATH sorununuz varsa, hızlı / kirli bir düzeltme dağıtma komut dosyanızın başında PATH'yi açıkça ayarlamaktır.

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

Ayrıntılı açıklama ve diğer seçenekler ...

Linux'ta komutlar çalıştırıldığında üst süreçlerinin ortamını devralırlar.

SSH üzerinden normal bir kullanıcı olarak giriş yaptığınızda, (vb. / Etc / bashrc / etc / profile ~ / .bash_profile ~ / .bashrc vb. Çalıştırmak) olan şeyler vardır. Bu noktada export PATH="$PATH:~/mybin", bu komut dosyalarında olduğu gibi bir şeyler yaparak işleminizin ortamını güncellemiş olabilirsiniz . Şimdi ileride gerçekleştireceğiniz işlemler mevcut ortamınızı devralır.

Bir oturum açma kabuğu almak yerine bir komutun çalıştırılması, komutun ssh daemon tarafından çalıştırıldığı ve ssh daemon işleminin ortamını devralır ... oturum açmış bir kullanıcı olarak ortamınızdan farklı olabilir.

Yetkili anahtarlar için kılavuz sayfası, kimlik doğrulamasından sonra ne olduğunu kapsar. Çevre ile ilgili:

  1. Varsa ~ / .ssh / ortam dosyasını okur ve kullanıcıların ortamlarını değiştirmelerine izin verilir. Sshd_config (5) içindeki PermitUserEnvironment seçeneğine bakın.

Bu nedenle, işlem için ortamı yapılandırmak için uygun yer , komutu çalıştırmak üzere kimliği doğrulanan kullanıcının ana dizininin ~/.ssh/environmentbulunduğu yerdir ~. Ayrıca PermitUserEnvironment'a izin verildiğinden emin olmak için sshd_config dosyanızı kontrol etmeniz gerekir.

~/.ssh/environment formatı elbette kılavuz sayfasında da belirtilir.

         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.

Yukarıda belirtilen yöntemi kullanmadan ortamı belirtmenin alternatif bir yolu environment="NAME=value", yetkili_anahtarlar dosyasındaki seçeneği kullanmaktır . Ayrıntılar için yukarıda bağladığım man sayfasına bakınız.


İle ilgili Without knowing exactly how you have setup your deploy script to run: başlangıçta sorum, bir bağlantı var, nasıl ayarladığım (kullanarak ~/.ssh/authorized_keys. Güncelleme komutu ile ipucu için teşekkürler, denedim, ama hiçbir fark olmadan talihsiz. Ancak bunu daha ayrıntılı olarak araştıracağım ve farklı kabukları deneyeceğim Lütfen bu fikir için + 1'i kabul edin.
Tomáš Blatnı

Mevcut $ PATH çıktısını basmak için konuşlandırma komut dosyanızı güncellemeyi denediniz mi? Sonucu gönderebilir misiniz? Beklediğinizle eşleşmiyorsa, dağıtım kodunuzun başında önerdiğim gibi PATH'yi açıkça ayarlamayı deneyebilirsiniz.
mattpr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.