Saya ingin menggunakan skrip .sh untuk penerapan aplikasi saya. Skrip itu ada di server rumah saya (Server Ubuntu 15.10), ditandai sebagai dapat dieksekusi. Akses ke skrip ini dilakukan melalui ssh, menggunakan tutorial ini , saya telah mengatur ssh login, yang menjalankan skrip itu. Jadi pada dasarnya saya hanya memanggil ssh [email protected] someArguments
dan menjalankan skrip saya dengan someArguments
sebagai parameter. Pengguna deployer
memiliki uid = 0, jadi pada dasarnya root
(ini akan diubah di masa depan, saya telah menetapkannya hanya untuk menghilangkan masalah izin sampai berfungsi dengan baik).
Dan di sinilah semuanya menjadi rumit. Skrip melaporkan /usr/bin/env: php: No such file or directory
pada perintah /bin/composer install
(menggunakan Komposer ). Hal-hal semakin aneh, semakin saya melihat skrip itu. Sebelum baris ini, ada juga yang dipanggil /bin/composer self-update
dan /bin/composer -V
, yang keduanya berjalan dengan benar dan menampilkan output yang benar.
Saya telah memeriksa hal-hal berikut:
/usr/bin/env php -v
menampilkan versi PHP yang benar (sama seperti/usr/bin/php -v
)whereis php
menampilkanphp: /usr/bin/php /usr/local/bin/php /usr/share/man/man1/php.1.gz
php5-cli
paket diinstal dan versi terbaru$PATH
mengandung/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
which env
menampilkan/usr/bin/env
Saya juga sudah mencoba beberapa hal berikut:
- menjalankan skrip secara langsung seperti di
bash deploy.sh
bawah root (karena itu sama dengan pengguna itu) - berfungsi sempurna tanpa kesalahan - menjalankan perintah yang gagal secara langsung - juga sempurna tanpa kesalahan
Jadi ini bagi saya adalah kasus yang sangat spesifik, mengapa perintah ini tidak berfungsi. Saya menghabiskan 12 jam men-debug itu dan saya kehabisan ide di sini.
PS: Kesalahan yang serupa ( /usr/bin/env: node: No such file or directory
) terjadi ketika ada bower install
(menggunakan Bower ), tetapi tidak ketika menjalankan npm install
(menggunakan NPM ).
sh deploy
bukannyabash deploy
(mungkin beberapa bashism). Bagaimana Anda memeriksa " hal-hal berikut "? Saya sarankan untuk memeriksanya dalam skrip, sehingga Anda dapat menemukan akhirnya penggantian dan sanitasi envs.sh deploy
danbash deploy
keduanya memberikan hasil yang sama/usr/bin/env > environment.txt
Jawaban:
Pastikan bahwa ujung garis dan / atau ruang yang tidak terlihat tidak menyebabkan masalah.
Hapus spasi di baris pertama skrip dan masukkan yang baru, pastikan untuk tidak menahan CTRL sambil menekan spasi.
Juga, pastikan Anda tidak memiliki ujung garis DOS (CR + LF). Lihat /programming/82726/convert-dos-line-endings-to-linux-line-endings-in-vim untuk detailnya.
sumber
Cara termudah .... ubah shell pengguna sebagai skrip.
/ etc / passwd
Contoh skrip (pastikan bit eksekusi diatur chmod + x)
/scripts/deploy.sh
Bekerja setiap saat! Anda bahkan harus dapat menggunakan skrip untuk memecahkan masalah / men-debug setiap variabel env yang Anda mungkin merasa tidak disetel dll ... juga argumen penanganan yang diteruskan ke ssh akan bekerja juga ..
Catatan: Praktik Terbaiknya untuk selalu MEMENUHI path untuk skrip, executable, dll. Di atas hanyalah sebuah contoh yang memungkinkan jalur default disetel untuk memanggil moo.sh dalam folder moo;)
Itu mudah .. Terima kasih telah memposting ..
Referensi: / etc / passwd format
sumber
ssh
ke server, dan dengan jalurauthorized_keys
, script dipanggil dan kemudian koneksi berakhir. Bagaimana saya harus memodifikasiauthorized_keys
agar ini berfungsi?The
env
perintah akan melihat melalui pengguna yang$PATH
menemukan executable pertama dari nama yang diberikan. Jadi,/usr/bin/env php
akan mencari file yang dapat dieksekusi dipanggilphp
di salah satu direktori di$PATH
dari pengguna yang menjalankannya.Dalam kasus Anda, itu hampir pasti karena ketika menjalankan perintah
ssh
, Anda tidak memulai shell penuh dan tidak benar-benar membaca file inisialisasi shell Anda. Anda dapat memeriksanya dengan menjalankan perintah ini (perhatikan tanda kutip tunggal):Dan membandingkan output untuk apa yang Anda dapatkan jika Anda
ssh [email protected]
dan kemudian jalankanecho $PATH
. Di sistem saya. sebagai contoh:Oleh karena itu,
$PATH
skrip Anda memiliki akses ketika dijalankan denganssh [email protected]
tidak sama dengan ketika Anda masuk untuk mengujinya.Bagaimanapun, solusi sederhananya adalah menggunakan jalur lengkap ke penerjemah alih-alih
env
. Keduaenv
dan jalur penuh memiliki mereka kelebihan dan kekurangannya tetapi, dalam kasus ini, jalan lebih aman:sumber
composer install
perintah, yang jelas saya tidak bisa modifikasi. Juga$PATH
ok, seperti yang saya sebutkan dalam pertanyaan saya juga, saya memeriksa semua hal dengan menambahkannya ke dalam skrip dan menjalankan dari jarak jauh melalui login ssh. Juga saya tidak dapat memeriksassh [email protected] 'echo $PATH'
seperti yang Anda sebutkan, karena login ssh saya terbatas hanya pada satu skrip, tetapi saya hovever mengeceknya ketika saya menambahkan $ PATH ke skrip itu (dinyatakan di atas) Bagaimanapun, terima kasih atas jawaban Anda, dan terima + 1 untuk menjelaskanenv
hal itu kepada sayaenv
sebenarnya disebut komposer dalam. Tetapi ini tidak menyelesaikan masalah, mengapa beberapa komponis memanggil lulus, dan beberapa tidak. Namun saya akan menyelidiki lebih lanjut dengan melihat kodenya. Terima kasih atas waktu AndaApakah mungkin yang
bash
memerlukan reset ke tabel hash-nya?Jika demikian, Anda dapat mencoba menambahkan
hash -r
suatu tempat di skrip Anda, yang memaksa shell untuk melihat$PATH
lagi daripada mengandalkan (mungkin kedaluwarsa) info dari tabel hash.Saat dibutuhkan,
hash
bisa juga mengaktifkan shell untuk mengingat path ke executable yang diinstal di lokasi non-standar menggunakan-p
opsi, atau lupa path dengan-d
opsi.Sumber:
https://unix.stackexchange.com/a/86017/121251
https://stackoverflow.com/a/22543353/2146843
sumber
Sepertinya mungkin Anda perlu menambahkan php ke jalur Anda. Mencoba:
Anda mungkin juga ingin memeriksa di mana php Anda tinggal untuk memastikan bahwa jalur di sana benar. Mencoba:
sumber
php -v
keluaran versi PHP yang benar dan versicomposer --version
keluaran komposer. Seperti yang saya katakan, masalah ada dalam satu perintah saja.Jelas bahwa Anda memiliki masalah jalur karena skrip penerapan Anda tidak dapat menemukan hal-hal yang pasti ada di jalur saat Anda melakukan login ssh normal.
Hal pertama yang harus dilakukan untuk mengonfirmasi bahwa Anda memiliki masalah PATH adalah memperbarui skrip penyebaran Anda untuk mencatat keluaran
env
atau setidaknyaecho $PATH
. Saya menduga cara penulisan skrip penyebaran Anda, $ PATH tidak disetel seperti yang Anda harapkan. Output debug ini akan mengkonfirmasi / menolak teori saya.Saya melihat tutorial yang Anda ikuti. Anda mungkin harus memastikan saat memperbarui
command=
menjadicommand="/bin/sh /path/to/your/script..."
jika Anda belum memastikan skrip Anda dijalankan oleh shell yang tepat.Jika Anda memang memiliki masalah PATH, perbaikan cepat / kotor hanya untuk secara eksplisit mengatur PATH di awal skrip deploy Anda.
Penjelasan terperinci dan opsi lebih lanjut ...
Di linux ketika perintah dijalankan, mereka mewarisi lingkungan proses induknya.
Ketika Anda login sebagai pengguna normal melalui SSH ada hal-hal yang terjadi (seperti menjalankan / etc / bashrc / etc / profile ~ / .bash_profile ~ / .bashrc dll). Pada titik itu Anda mungkin telah memperbarui lingkungan proses Anda dengan melakukan hal-hal seperti
export PATH="$PATH:~/mybin"
dalam skrip tersebut. Sekarang setiap proses masa depan yang Anda jalankan akan mewarisi lingkungan Anda saat ini.Menjalankan perintah alih-alih mendapatkan shell login berarti bahwa perintah dijalankan oleh daemon ssh dan akan mewarisi lingkungan proses daemon ssh ... yang kemungkinan berbeda dari lingkungan Anda sebagai pengguna yang masuk.
Halaman manual untuk kunci resmi mencakup apa yang terjadi setelah otentikasi. Mengenai lingkungan:
Jadi tempat yang tepat untuk mengkonfigurasi lingkungan untuk proses adalah di
~/.ssh/environment
mana~
direktori home untuk pengguna yang diautentikasi untuk menjalankan perintah. Anda juga perlu memeriksa sshd_config Anda untuk memastikan PermitUserEnvironment diizinkan.~/.ssh/environment
Formatnya juga ditentukan di halaman manual tentu saja.Cara alternatif untuk menentukan lingkungan tanpa menggunakan metode yang disebutkan di atas adalah dengan menggunakan
environment="NAME=value"
opsi dalam file Authorized_keys. Lihat halaman manual yang saya tautkan di atas untuk detailnya.sumber
Without knowing exactly how you have setup your deploy script to run
: dalam pertanyaan saya di awal, ada tautan, bagaimana saya mengaturnya (menggunakan~/.ssh/authorized_keys
. Terima kasih atas tipnya dengan memperbarui perintah, saya mencobanya, tetapi sayangnya tanpa perbedaan. Namun saya akan menyelidiki lebih lanjut dan mencoba kerang yang berbeda Harap terima +1 untuk gagasan itu.