Chcę użyć skryptu .sh do wdrożenia mojej aplikacji. Ten skrypt znajduje się na moim serwerze domowym (Ubuntu 15.10 Server), oznaczony jako wykonywalny. Dostęp do tego skryptu odbywa się za pośrednictwem ssh, korzystając z tego samouczka, skonfigurowałem logowanie ssh, które uruchamia ten skrypt. Zasadniczo po prostu wywołuję ssh [email protected] someArguments
i uruchamia mój skrypt someArguments
jako parametry. Użytkownik deployer
ma identyfikator UID = 0, więc w zasadzie jest root
to (zostanie to zmienione w przyszłości, ustawiłem go tylko w celu wyeliminowania problemów z uprawnieniami, dopóki nie będzie działać poprawnie).
I tutaj sprawy stają się trudne. Skrypt raportuje /usr/bin/env: php: No such file or directory
przy komendzie /bin/composer install
(przy użyciu Composer ). Sprawy są dziwniejsze, im bardziej patrzę na ten skrypt. Przed tym wierszem jest także wywoływane /bin/composer self-update
i /bin/composer -V
, które działa poprawnie i wyświetla prawidłowe dane wyjściowe.
Sprawdziłem następujące rzeczy:
/usr/bin/env php -v
wyświetla poprawną wersję PHP (taką samą jak/usr/bin/php -v
)whereis php
wyświetlaphp: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
php5-cli
pakiet jest zainstalowany i najnowsza wersja$PATH
zawiera/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
which env
wyświetla/usr/bin/env
Próbowałem także następujących rzeczy:
- uruchomienie skryptu bezpośrednio jako
bash deploy.sh
root (ponieważ jest taki sam jak ten użytkownik) - działa idealnie bez błędów - bezpośrednie uruchamianie błędnych poleceń - również idealnie bez błędów
Wydaje mi się więc, że to bardzo szczególny przypadek, dlaczego to polecenie nie działa. Spędziłem 12 godzin na debugowaniu i nie mam tutaj pomysłów.
PS: Podobny błąd ( /usr/bin/env: node: No such file or directory
) występuje, gdy jest bower install
(za pomocą Bower ), ale nie występuje podczas działania npm install
(za pomocą NPM ).
sh deploy
zamiastbash deploy
(może jakiś bashism). Jak sprawdziłeś „ następujące rzeczy ”? Polecam sprawdzić je w skrypcie, abyś mógł odkryć ewentualne zastąpienia i sanityzacje środowisk.sh deploy
ibash deploy
oba dają takie same wyniki/usr/bin/env > environment.txt
Odpowiedzi:
Upewnij się, że zakończenia linii i / lub niewidoczne spacje nie powodują problemu.
Usuń spacje w pierwszym wierszu skryptu i wstaw nowe, uważając, aby nie przytrzymać CTRL podczas naciskania spacji.
Upewnij się także, że nie masz zakończeń linii DOS (CR + LF). Szczegółowe informacje można znaleźć na stronie /programming/82726/convert-dos-line-endings-to-linux-line-endings-in-vim .
źródło
Najłatwiejszy sposób .... zmień powłokę użytkownika jako skrypt.
/ etc / passwd
Przykładowy skrypt (upewnij się, że bit wykonania jest ustawiony chmod + x)
/scripts/deploy.sh
Działa za każdym razem! Powinieneś być nawet w stanie użyć skryptu do rozwiązywania problemów / debugowania zmiennych env, które możesz uważać za nie ustawione itd. ... również argumenty obsługi przekazywane do ssh również będą działać.
Uwaga: jego najlepszą praktyką jest zawsze PEŁNA KWALIFIKACJA ścieżek do wszelkich skryptów, plików wykonywalnych itp. Powyżej jest tylko przykład, który pozwala ustawić domyślną ścieżkę do wywoływania moo.sh w folderze moo;)
To było łatwe .. Dzięki za wysłanie ..
Odniesienie: format / etc / passwd
źródło
ssh
do serwera, a poauthorized_keys
linii, skrypt jest wywoływany, a następnie połączenie się kończy. Jak zmodyfikować,authorized_keys
aby nadal działało?env
Komenda będzie wyglądać przez autora$PATH
do znalezienia pierwszego wykonywalnego o podanej nazwie. Poszuka więc/usr/bin/env php
pliku wykonywalnego wywołanegophp
w jednym z katalogów$PATH
użytkownika, który go uruchomił.W twoim przypadku jest to prawie na pewno dlatego, że po uruchomieniu polecenia
ssh
nie uruchamiasz pełnej powłoki i nie odczytujesz plików inicjujących powłoki. Możesz to sprawdzić, uruchamiając to polecenie (zwróć uwagę na pojedyncze cudzysłowy):I porównując dane wyjściowe, co dostajesz, jeśli
ssh [email protected]
a następnie uruchomićecho $PATH
. W moim systemie. na przykład:Dlatego
$PATH
dostęp do skryptu podczas uruchamianiassh [email protected]
nie jest taki sam, jak podczas logowania w celu przetestowania.W każdym razie prostym rozwiązaniem jest użycie pełnej ścieżki do tłumacza zamiast
env
. Obieenv
i pełne ścieżki mają swoje zalety i wady, ale w tym przypadku ścieżka jest bezpieczniejsza:źródło
composer install
poleceniu, którego oczywiście nie mogę zmodyfikować. Również$PATH
jest ok, jak wspomniałem również w moim pytaniu, sprawdziłem wszystkie rzeczy, dodając je do skryptu i uruchamiając zdalnie poprzez logowanie ssh. Ponadto nie mogę sprawdzić,ssh [email protected] 'echo $PATH'
jak powiedziałeś, ponieważ mój login ssh jest ograniczony tylko do jednego skryptu, ale sprawdziłem go, gdy dodam $ PATH do tego skryptu (wyżej) W każdym razie dziękuję za odpowiedź i akceptuję + 1 za wyjaśnienie mi tejenv
rzeczyenv
nazywa się tak naprawdę kompozytorem. Ale to nie rozwiązuje problemu, dlaczego niektóre połączenia kompozytora mijały, a niektóre nie. Jednak później zbadam to, sprawdzając jego kod. Dzięki zaCzy to możliwe, że
bash
trzeba zresetować tabelę skrótów?Jeśli tak, możesz spróbować dodać
hash -r
gdzieś w skrypcie, co zmusza powłokę do$PATH
ponownego przejrzenia, zamiast polegać na (prawdopodobnie nieaktualnych) informacjach z tabeli skrótów.W razie potrzeby
hash
można również włączyć powłokę do zapamiętywania ścieżek do plików wykonywalnych zainstalowanych w niestandardowych lokalizacjach za pomocą-p
opcji lub zapomnienia ścieżek za pomocą tej-d
opcji.Źródła:
https://unix.stackexchange.com/a/86017/121251
https://stackoverflow.com/a/22543353/2146843
źródło
Wygląda na to, że musisz dodać php do swojej ścieżki. Próbować:
Możesz także sprawdzić, gdzie mieszka twój php, aby upewnić się, że ścieżka tam jest poprawna. Próbować:
źródło
php -v
wyjściowe mają poprawną wersję PHP i danecomposer --version
wyjściowe kompozytora. Jak powiedziałem, problem występuje tylko w jednym poleceniu.Oczywiste jest, że masz problem ze ścieżką, ponieważ skrypt wdrażania nie może znaleźć rzeczy, które zdecydowanie znajdują się na ścieżce podczas normalnego logowania ssh.
Pierwszą rzeczą, którą należy zrobić, aby potwierdzić problem ze ŚCIEŻKĄ, jest zaktualizowanie skryptu wdrażania w celu zarejestrowania danych wyjściowych
env
lub przynajmniejecho $PATH
. Domyślam się, że sposób, w jaki wywoływany jest skrypt wdrażania, $ PATH nie jest ustawiony zgodnie z oczekiwaniami. To wyjście debugowania potwierdzi / zaprzeczy mojej teorii.Spojrzałem na samouczek, którego użyłeś. Powinieneś upewnić się aktualizacji
command=
sięcommand="/bin/sh /path/to/your/script..."
jeśli nie masz jeszcze upewnić się, że skrypt jest uruchamiany przez prawe powłoki.Jeśli masz problem ze ŚCIEŻKĄ, szybką / brudną poprawką jest po prostu jawne ustawienie ŚCIEŻKI na początku skryptu wdrażania.
Szczegółowe wyjaśnienie i dalsze opcje ...
W systemie Linux podczas uruchamiania poleceń dziedziczą środowisko procesu nadrzędnego.
Kiedy logujesz się jako zwykły użytkownik przez SSH, zdarzają się rzeczy (na przykład uruchamianie / etc / bashrc / etc / profile ~ / .bash_profile ~ / .bashrc itp.). W tym momencie mogłeś zaktualizować środowisko swojego procesu, wykonując czynności takie jak
export PATH="$PATH:~/mybin"
w tych skryptach. Teraz wszelkie przyszłe procesy, które uruchomisz, odziedziczą twoje obecne środowisko.Uruchomienie polecenia zamiast uzyskania powłoki logowania oznacza, że polecenie jest uruchamiane przez demona ssh i odziedziczy środowisko procesu demona ssh ... co prawdopodobnie różni się od środowiska jako zalogowany użytkownik.
Strona podręcznika dla autoryzowanych kluczy obejmuje to, co dzieje się po uwierzytelnieniu. W odniesieniu do środowiska:
Tak więc odpowiednim miejscem do skonfigurowania środowiska dla procesu jest miejsce, w
~/.ssh/environment
którym~
znajduje się katalog domowy użytkownika uwierzytelnionego do uruchomienia polecenia. Musisz także sprawdzić sshd_config, aby upewnić się, że PermitUserEnvironment jest dozwolone.~/.ssh/environment
Format jest również określony na stronie podręcznika.Alternatywnym sposobem określenia środowiska bez korzystania z wyżej wymienionej metody jest użycie
environment="NAME=value"
opcji w pliku uprawnione_klucze. Szczegółowe informacje można znaleźć na stronie podręcznika, do której odsyłam powyżej.źródło
Without knowing exactly how you have setup your deploy script to run
: w moim pytaniu na początku jest link, jak go skonfigurować (używając~/.ssh/authorized_keys
. Dzięki za wskazówkę z poleceniem aktualizacji, wypróbowałem to, ale niestety bez różnicy. Jednak później zbadam to i spróbuję różnych powłok Przyjmij +1 za ten pomysł