يتم نسخ البرنامج النصي config.vm.provision
إلى / tmp ، إذا تم تنفيذه على نظام ملفات noexec محمل ، فسأحصل على هذا الخطأ:
==> default: bash: line 2: /tmp/vagrant-shell: Permission denied
حل مقترح: تعامل مع نص الصدفة كمدخل لـ bash:
bash /tmp/vagrant-shell
الملف المصدر: vagrant / plugins / Provers / shell / provideer.rb
مرحبا bbaassssiiee
شكرا لفتح قضية. للأسف لا يمكننا أن نفترض فقط باش. لحسن الحظ ، يتم سرد الحلول الموصى بها في المستندات: https://www.vagrantup.com/docs/provisioning/shell.html
لتشغيل برنامج نصي متاح بالفعل على الضيف ، يمكنك استخدام برنامج نصي مضمّن لاستدعاء البرنامج النصي البعيد على الضيف.
Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "/bin/sh /path/to/the/script/already/on/the/guest.sh" end
النمط الموصى به هو تحميل البرنامج النصي باستخدام مزود الملفات ثم تنفيذه يدويًا باستخدام المترجم الذي تريده. شكرا! :ابتسامة:
مرحبًا sethvargo ،
كيف يجب أن يعمل الحل الخاص بك؟ المشكلة هي كما يلي: إذا قمت بتحميل الملف باستخدام مزود الملفات ، فلن أتمكن من تحميله بحقوق التنفيذ من مضيف windows. لذلك لا يمكنني استخدام وظيفة مسار مزودي الصدفة لتنفيذ البرنامج النصي. من ناحية أخرى ، لا يمكنني استخدام المتغير المضمن الذي قدمته ، لأن هذا فقط أنشئ / tmp / vagrant-shell بالمحتوى "/ bin / sh /path/to/the/script/already/on/the/guest.sh "ويحاول تنفيذه. بالطبع يفشل التنفيذ ، لأن / tmp لا يزال noexec.
هل من الممكن بطريقة ما إخبار موفر الصدفة بأنه يجب عليه إنشاء ملف tmp في مسار محدد؟
يعتبر
راسكيل
في حال واجه أي شخص آخر هذا ، تحتاج إلى استخدام خيار upload_path لتوجيه النص إلى مكان آخر غير / tmp.
أستخدم شيئًا مثل هذا:
config.vm.provision "vagrant preflight", type: "shell",
path: "scripts/preflight.sh",
upload_path: '/opt/preflight.sh',
args: "#{username}"
التعليق الأكثر فائدة
في حال واجه أي شخص آخر هذا ، تحتاج إلى استخدام خيار upload_path لتوجيه النص إلى مكان آخر غير / tmp.
أستخدم شيئًا مثل هذا: