Intereting Posts
Почему мне запрашивают пароль sudo, когда я указал «NOPASSWD» в файле / etc / sudoers? Два «аудиокодека» имеют 100% -ное использование мощности в PowerTOP – что это значит? Кросс-компиляция базы Linux для системы Big-Endian Проблемы создания и включения пользовательских системных служб для ddclient обработка zwrite символа "@" Безопасно ли закрывать оболочку, просто нажав «X» или используя «ctrl + d»? Синхронизация каталога с автоматическим обнаружением сверстников Эта ошибка указывает на ошибку в моей файловой системе btrfs просто ошибку в ядре 4.2.0-RC5? Замена двух шаблонов в текстовых файлах одновременно Как отключить vimplugins при вызове команды vimdiff Почему мой клиент IPA не распознает доверенных пользователей AD Директива 'StrictModes' не допускается в блоке Match Решение проблемы с разрешениями в сценарии, используемом в качестве оболочки для входа? Почему wc -m и wc -c разные? Как настроить FreeBSD для моего региона?

Выполнять онлайн-скрипт изящно

контекст

Я создал сайт для публикации сценариев, которые затем можно выполнить позже, используя следующую команду:

curl -so /tmp/script http://scripts.programster.org/scripts/1?output=raw && . /tmp/script 

В этом примере скрипт выводит «привет мир» на терминал.

Как вы можете видеть, это довольно долго и беспорядочно и может переписать файл пользователя, если у них просто есть файл с именем /tmp/script . Раньше я просто трудился так:

 curl -s http://scripts.programster.org/scripts/1?output=raw | bash 

Тем не менее, я хочу, чтобы команда работала со сценариями, написанными на других языках, таких как PHP (с использованием #!/usr/bin/php в верхней части скрипта), следовательно, изменение первой команды.

Вопрос

Есть ли способ, которым я могу выполнить онлайн-скрипт, не сохраняя его в локальной файловой системе, а также не зная, какую программу выполнить заблаговременно? Возможно, есть способ обработать URL-адрес, например файл, который позволит мне сделать что-то вроде:

 . http://scripts.programster.org/scripts/1?output=raw 

Помимо вопросов безопасности, я надеюсь, что вы осознаете риски запуска внешних скриптов, это может быть сделано с помощью команды wget и source (dot)

. <(wget -q -O- http://scripts.programster.org/scripts/1?output=raw)

Это означает поиск текста сценария в текущей оболочке

wget -O- делает загрузку с STDOUT, -q делает его тихим (без сообщений)

<(any command) – это подстановка процесса, которая позволяет интерпретировать вывод как файл

PS curl – эквивалент для wget -q -O- является curl -s -o-

ОБНОВИТЬ

Вышеприведенные примеры не будут использовать she-bang внешнего скрипта, но будут работать в контексте вызывающей оболочки. Чтобы использовать линию she-bang, нужно сохранить файл, выполнить исполняемый файл и только затем запустить.

Вы можете использовать mktemp который будет гарантировать unuque имена, тогда вы будете заботиться об удалении временных файлов. Это можно объединить в оболочку, которая будет принимать внешний url как параметр

Вот рабочий пример кода для такого типа обертки

 #/bin/bash exturl=${1?"No external url specified"} tmpexe=$(mktemp) trap 'rm $tmpexe' EXIT curl -s $exturl -o $tmpexe chmod 0755 $tmpexe $tmpexe