/ usr / bin / env: php: Không có tệp hoặc thư mục như vậy


9

Tôi muốn sử dụng tập lệnh .sh để triển khai ứng dụng của mình. Kịch bản đó nằm trên máy chủ nhà của tôi (Máy chủ Ubuntu 15.10), được đánh dấu là có thể thực thi được. Truy cập vào tập lệnh này được thực hiện thông qua ssh, sử dụng hướng dẫn này , tôi đã thiết lập đăng nhập ssh, chạy tập lệnh đó. Vì vậy, về cơ bản tôi chỉ cần gọi ssh deployer@XXX.com someArgumentsvà nó chạy tập lệnh của tôi với someArgumentstư cách là tham số. Người dùng deployercó uid = 0, vì vậy về cơ bản root(điều này sẽ được thay đổi trong tương lai, tôi đã đặt nó chỉ để loại bỏ các vấn đề về quyền cho đến khi nó hoạt động tốt).

Và đây là nơi mà mọi thứ trở nên khó khăn. Kịch bản báo cáo /usr/bin/env: php: No such file or directorytại lệnh /bin/composer install(sử dụng Trình soạn thảo ). Mọi thứ càng kỳ lạ khi tôi càng xem kịch bản đó. Trước dòng này, cũng có tên /bin/composer self-update/bin/composer -Vcả hai chạy chính xác và hiển thị đầu ra chính xác.

Tôi đã kiểm tra những điều sau đây:

  • /usr/bin/env php -vhiển thị phiên bản PHP chính xác (giống như /usr/bin/php -v)
  • whereis php màn hình php: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
  • php5-cli gói được cài đặt và phiên bản mới nhất
  • $PATH chứa đựng /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  • which env màn hình /usr/bin/env

Tôi cũng đã thử làm những điều sau đây:

  • chạy tập lệnh trực tiếp bash deploy.shdưới quyền root (vì nó giống với người dùng đó) - hoạt động hoàn hảo không có lỗi
  • chạy các lệnh thất bại trực tiếp - cũng hoàn toàn không có lỗi

Vì vậy, đây có vẻ như là trường hợp rất cụ thể, tại sao lệnh này không hoạt động. Tôi đã dành 12 giờ để gỡ lỗi nó và tôi không có ý tưởng nào ở đây.

PS: Lỗi tương tự ( /usr/bin/env: node: No such file or directory) xảy ra khi có bower install(sử dụng Bower ), nhưng không xảy ra khi chạy npm install(sử dụng NPM ).


Chạy sh deploythay vì bash deploy(có thể là một số bashism). Làm thế nào bạn kiểm tra " những điều sau "? Tôi khuyên bạn nên kiểm tra chúng trong kịch bản, để bạn có thể khám phá các phần ghi đè và vệ sinh cuối cùng của envs.
Giacomo Catenazzi

liên quan đến " những điều sau ": Tôi đã thêm chúng vào phần khởi động của script.sh và chúng xuất ra những điều tôi đặt ra để đặt câu hỏi. Tuy nhiên, cùng một đầu ra là khi tôi chạy chúng một mình.
Tomáš Blatný

sh deploybash deploycả hai đều cho kết quả như nhau
Tomáš Blatný

Hiển thị dòng đó ở đây, xin vui lòng. Tôi khuyên bạn nên thay thế lệnh php của mình tại dòng này trong tập lệnh của bạn bằng đầu ra thành tệp để kiểm tra các biến môi trường tại thời điểm gọi / usr / bin / env:/usr/bin/env > environment.txt
Oleg Bolden

Câu trả lời:


6

Đảm bảo rằng các kết thúc dòng và / hoặc không gian vô hình không gây ra sự cố.

Xóa các khoảng trắng trong dòng đầu tiên của tập lệnh và chèn các khoảng trắng mới, đảm bảo không giữ CTRL trong khi nhấn dấu cách.

Ngoài ra, đảm bảo bạn không có kết thúc dòng DOS (CR + LF). Xem /programming/82726/convert-dos-line-endings-to-linux-line-endings-in-vim để biết chi tiết.


Tôi đang sử dụng IDE, chỉ tự động kiểm tra (và chuyển đổi) CR + LF thành LF, loại bỏ BOM và quan tâm đến các ký tự màu trắng, nhưng tôi đã kiểm tra lại và nó vẫn ổn (mặc dù vẫn không hoạt động). Dù sao cũng cảm ơn
Tomáš Blatný 30/03/2016

4

Cách dễ nhất .... thay đổi shell của người dùng làm tập lệnh.

/ etc / passwd

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

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

Kịch bản ví dụ (đảm bảo bit thực thi được đặt chmod + x)

/scripts/deploy.sh

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

Mẫu vật Hoạt động mọi lúc! Thậm chí, bạn có thể sử dụng tập lệnh để khắc phục sự cố / gỡ lỗi bất kỳ biến env nào mà bạn cảm thấy không được đặt, v.v ... và các đối số xử lý được truyền vào ssh cũng sẽ hoạt động tốt ..

Lưu ý: Cách tốt nhất để luôn HOÀN TOÀN CHẤT LƯỢNG các đường dẫn cho bất kỳ tập lệnh, tệp thực thi, v.v. Trên đây chỉ là một ví dụ cho phép đường dẫn mặc định được đặt để gọi moo.sh trong thư mục moo;)

Điều đó thật dễ dàng .. Cảm ơn bạn đã đăng ..

Tham khảo: định dạng / etc / passwd


Câu trả lời hay, nhưng tôi thực sự không bao giờ sử dụng trực tiếp người dùng trên máy chủ, tôi luôn sshđến máy chủ và theo làn đường authorized_keys, tập lệnh được gọi và sau đó kết nối kết thúc. Làm thế nào tôi sẽ sửa đổi authorized_keysđể giữ cho điều này làm việc?
Tomáš Blatný 30/03/2016

Nó nên hoạt động như nhau. Bạn sẽ xác thực thông qua khóa và miễn là shell được đặt thành tập lệnh cho tài khoản từ xa được đề cập trong tệp / etc / passwd của máy chủ từ xa, tập lệnh sẽ thực thi. Tôi sẽ thêm một ảnh chụp màn hình vào bài viết của tôi trong thời gian ngắn.
NotAdmin Dave

1
@Dave không thể đợi sách của bạn
Burgi

Cảm ơn câu trả lời của bạn, nó không giải quyết được vấn đề của tôi, nhưng đối với tôi là điều thú vị nhất và thực sự giải quyết những vấn đề khác mà tôi có. Đã cho bạn tiền thưởng, cảm ơn một lần nữa
Tomáš Blatný

4

Các envlệnh sẽ xem xét thông qua một người sử dụng là $PATHđể tìm ra thực thi đầu tiên của tên nhất định. Vì vậy, /usr/bin/env phpsẽ tìm kiếm một tập tin thực thi được gọi phptrong bất kỳ thư mục nào trong $PATHngười dùng đang chạy nó.

Trong trường hợp của bạn, điều đó gần như chắc chắn bởi vì khi chạy lệnh ssh, bạn không khởi động toàn bộ trình bao và không thực sự đọc các tệp khởi tạo của trình bao. Bạn có thể kiểm tra điều này bằng cách chạy lệnh này (lưu ý các dấu ngoặc đơn):

ssh deployer@XXX.com 'echo $PATH'

Và so sánh đầu ra với những gì bạn nhận được nếu bạn ssh deployer@XXX.comsau đó chạy echo $PATH. Trên hệ thống của tôi. ví dụ:

$ 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

Do đó, $PATHtập lệnh của bạn có quyền truy cập khi chạy với ssh deployer@XXX.comnó không giống như khi bạn đăng nhập để kiểm tra nó.

Trong mọi trường hợp, giải pháp đơn giản là sử dụng đường dẫn đầy đủ đến trình thông dịch thay vì env. Cả hai envvà các đường dẫn đầy đủ đều có những lợi ích và hạn chế của chúng , nhưng trong trường hợp này, đường dẫn này an toàn hơn:

#!/usr/bin/php

ITYM " lưu ý các trích dẫn duy nhất" không " không ".
dave_thompson_085

@ dave_thndry_085 thực sự tôi đã làm, cảm ơn.
terdon

Tôi thực sự đang sử dụng các đường dẫn đầy đủ ở mọi nơi, như tôi đã đề cập trong câu hỏi của mình, lỗi được báo cáo bên trong composer install lệnh, mà rõ ràng tôi không thể sửa đổi. Cũng $PATHổn, như tôi đã đề cập trong câu hỏi của mình, tôi đã kiểm tra tất cả mọi thứ bằng cách thêm chúng vào tập lệnh và chạy từ xa thông qua đăng nhập ssh. Ngoài ra tôi không thể kiểm tra ssh deployer@XXX.com 'echo $PATH'như bạn đã nêu, vì thông tin đăng nhập ssh của tôi chỉ giới hạn ở một tập lệnh, nhưng tôi đã kiểm tra nó khi tôi thêm $ PATH vào tập lệnh đó (nêu trên) Dù sao, cảm ơn bạn đã trả lời và chấp nhận + 1 vì đã giải thích cho tôi envđiều này
Tomáš Blatný 30/03/2016

@ TomášBlatný tốt, bạn đang sử dụng env ở đâu đó, hoặc bạn sẽ không thấy lỗi đó. Tôi không biết nhà soạn nhạc nhưng có lẽ bạn sẽ phải sao chép hoặc liên kết tệp thực thi php với một thư mục trong đường dẫn của nó. Loại điều này rất khó để gỡ lỗi vì có rất nhiều thứ phụ thuộc vào nhau.
terdon 30/03/2016

Đó là sự thật, envthực sự được gọi là bên trong nhà soạn nhạc. Nhưng điều này không giải quyết được vấn đề, tại sao một số nhà soạn nhạc gọi vượt qua, và một số thì không. Tuy nhiên tôi sẽ tiếp tục điều tra điều này bằng cách xem xét mã của nó. Cảm ơn bạn đã dành thời gian
Tomáš Blatný 30/03/2016

2

Có thể bashcần thiết lập lại bảng băm của nó?

Nếu vậy, bạn có thể thử thêm hash -rmột nơi nào đó vào tập lệnh của mình, điều này buộc trình bao nhìn $PATHlại một lần nữa thay vì dựa vào thông tin (có thể đã lỗi thời) từ bảng băm.

Khi cần, hashcũng có thể kích hoạt trình bao để ghi nhớ các đường dẫn đến các tệp thực thi được cài đặt ở các vị trí không chuẩn bằng cách sử dụng -ptùy chọn hoặc quên các đường dẫn với -dtùy chọn.

Nguồn:

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


Điều này không giải quyết được vấn đề cho tôi, tuy nhiên đó là một kiến ​​thức tốt, vì vậy tôi đã thêm cho bạn +1
Tomáš Blatný

1

Có vẻ như bạn cần thêm php vào đường dẫn của mình. Thử:

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

Bạn cũng có thể muốn kiểm tra nơi php của bạn sống để chắc chắn rằng đường dẫn ở đó là chính xác. Thử:

which php

Vâng, đây không phải là vấn đề, vì php -vđầu ra phiên bản PHP chính xác và composer --versionđầu ra phiên bản soạn thảo. Như tôi đã nói, vấn đề chỉ nằm trong một lệnh.
Tomáš Blatný 30/03/2016

1

Rõ ràng là bạn gặp vấn đề về đường dẫn vì tập lệnh triển khai của bạn không thể tìm thấy những thứ chắc chắn trên đường dẫn khi bạn đăng nhập ssh bình thường.

Điều đầu tiên cần làm để xác nhận rằng bạn có vấn đề PATH là cập nhật tập lệnh triển khai của bạn để ghi nhật ký đầu ra envhoặc ít nhất echo $PATH. Tôi đoán rằng cách tập lệnh triển khai của bạn được gọi, $ PATH không được đặt như bạn mong đợi. Đầu ra gỡ lỗi này sẽ xác nhận / từ chối lý thuyết của tôi.

Tôi nhìn vào hướng dẫn bạn làm theo. Có lẽ bạn nên chắc chắn tại bản cập nhật sự command=command="/bin/sh /path/to/your/script..."nếu bạn chưa sẵn sàng để đảm bảo kịch bản của bạn được điều hành bởi vỏ đúng.

Nếu bạn gặp vấn đề về PATH, cách khắc phục nhanh / bẩn chỉ là đặt PATH rõ ràng vào đầu tập lệnh triển khai của bạn.

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

Giải thích chi tiết và các tùy chọn khác ...

Trên linux khi các lệnh được chạy, chúng kế thừa môi trường của tiến trình cha của chúng.

Khi bạn đăng nhập như một người dùng bình thường qua SSH, có những điều xảy ra (như chạy / etc / bashrc / etc / profile ~ / .bash_profile ~ / .bashrc, v.v.). Tại thời điểm đó, bạn có thể đã cập nhật môi trường của quy trình của mình bằng cách thực hiện những việc như export PATH="$PATH:~/mybin"trong các tập lệnh đó. Bây giờ bất kỳ quy trình trong tương lai mà bạn chạy sẽ kế thừa môi trường hiện tại của bạn.

Chạy một lệnh thay vì nhận shell đăng nhập có nghĩa là lệnh đó được chạy bởi ssh daemon và sẽ kế thừa môi trường của tiến trình ssh daemon ... có thể khác với môi trường của bạn là người dùng đã đăng nhập.

Trang man cho các khóa được ủy quyền bao gồm những gì xảy ra sau khi xác thực. Về môi trường:

  1. Đọc tệp ~ / .ssh / môi trường, nếu nó tồn tại và người dùng được phép thay đổi môi trường của họ. Xem tùy chọn PermitUserEn Môi trường trong sshd_config (5).

Vì vậy, vị trí thích hợp để cấu hình môi trường cho quá trình là ở ~/.ssh/environmentđâu ~là thư mục chính cho người dùng được xác thực để chạy lệnh. Bạn cũng cần kiểm tra sshd_config để đảm bảo PermitUserEn Môi trường được cho phép.

~/.ssh/environment định dạng cũng được chỉ định trong trang man tất nhiên.

         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.

Một cách khác để chỉ định môi trường mà không sử dụng phương pháp được đề cập ở trên là sử dụng environment="NAME=value"tùy chọn trong tệp ủy quyền. Xem trang người đàn ông tôi liên kết ở trên để biết chi tiết.


Về Without knowing exactly how you have setup your deploy script to runcâu hỏi của tôi khi bắt đầu, có một liên kết, cách tôi thiết lập nó (sử dụng ~/.ssh/authorized_keys. Cảm ơn vì mẹo cập nhật lệnh, tôi đã thử nó, nhưng không có gì khác biệt. Tuy nhiên, tôi sẽ điều tra thêm và thử các shell khác Vui lòng chấp nhận +1 cho ý tưởng đó.
Tomáš Blatný 30/03/2016

Bạn đã thử cập nhật tập lệnh triển khai của mình để in ra $ PATH hiện tại chưa? Bạn có thể gửi kết quả? Nếu nó không khớp với những gì bạn mong đợi, thì bạn có thể thử đặt PATH một cách rõ ràng như tôi đã đề xuất ở đầu tập lệnh triển khai của bạn.
mattpr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.