Создайте временный скрипт с помощью sed (или любой другой утилиты) для немедленного создания скрипта для запуска на месте

Создайте временный скрипт с помощью sed (или любой другой утилиты) для немедленного создания скрипта для запуска на месте

Я использую sedNano для изменения текста в существующих файлах и для создания новых файлов.

Я изменяю текст sedтаким образом, например:

sudo sed -i 's/TESTING === "1"/TESTING === "0"/g' /etc/csf/csf.conf

Есть ли способ создавать файлы с его помощью, не заходя в Nano или VI и не вставляя текст, не давая разрешения и не выполняя его?

Обычно я так и делаю cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.sh, а затем вставляю все содержимое скрипта внутрь, затем сохраняю и выполняю.

Однако на этот раз я хочу автоматизировать даже это, просто вставить все как один входной файл и запустить его на месте.

Другими словами, я ищу способ либо запустить скрипт из вставки, либо вставить его во временный файл и запустить его «на месте» в тот момент, когда я закрываю файл, и таким образом запустить его с наименьшим количеством щелчков и вставок.


Почему мне нужно это решение:

При работе с несколькими серверными средами этот процесс может повторяться, а мне хочется сэкономить время, выполняя эту задачу снова и снова.

Дискуссия о законности таких действий — это, конечно, отдельная дискуссия...


Вот пример --- Я вставляю следующую команду в приглашение (первую, которая включает амперсанд), захожу в Nano, чтобы создать скрипт, и сразу же вставляю следующий синтаксис скрипта, сохраняю, и он выполняется. Я хочу автоматизировать этот процесс, чтобы сделатьвсе это, за одну склейку / одно действие.

cd /home/testo && sudo nano script.sh && sudo chmod +x scripts.sh && sudo ./script.sh

#!/bin/bash -x

# Basic update and upgrade:
sudo apt-get update -y
sudo apt-get upgrade -y

# Setup CSF-LFD:
sudo rm -f csf.tgz
sudo wget https://download.configserver.com/csf.tgz
sudo tar -xzf csf.tgz
sudo sh install.sh
sudo perl /etc/csf/csftest.pl
sudo sed -i 's/TESTING === "1"/TESTING === "0"/g' /etc/csf/csf.conf
sudo csf -r

решение1

Другими словами, я ищу либо способзапустить скрипт из вставки, или вставить его во временный файл и запустить его «на месте», не сохраняя никаких файлов --- Для запуска всего требуется наименьшее количество щелчков и вставок.

Предположим, что ваша интерактивная оболочка — это Bash или совместимая оболочка — вы ищете ее:

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

Приведенная выше практика кода называется «Heredoc» (сокращение от «Here document»), и я использовал ее для выполнения всех команд до конца работы в новой подоболочке.

Таким образом, вы можете изменить рабочий каталог или изменить среду. Обратите внимание, что EOT не является ключевым словом, поэтому вы можете использовать любую фразу вместо EOT (просто убедитесь, что написание одинаково в начале и в конце heredoc).

Одинарные кавычки используются 'EOT'для указания родительской оболочкенетвыполнить любую замену в heredocument. Это предотвращает, например, расширение переменной родительской оболочкой вместо дочерней.

В качестве конкретного примера:

sylvain@bulbizarre:~$ bash << 'EOT'
echo hello
cd /
echo We are in ${PWD}
EOT

hello
We are in /
sylvain@bulbizarre:~$   # <-- I'm still in my home directory when
                        #     back to the interactive shell

Другими словами, я ищу либо способ запустить скрипт из вставки, либовставьте его во временный файл и запустите «на месте»без сохранения каких-либо файлов --- Для запуска всего требуется минимальное количество щелчков и вставок.

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

sylvain@bulbizarre:~$ tee /tmp/saved.sh << 'EOT' | bash
echo hello
cd /
echo We are in ${PWD}
EOT

hello
We are in /

sylvain@bulbizarre:~$ cat /tmp/saved.sh 
echo hello
cd /
echo We are in ${PWD}

решение2

Это можно сделать, добавив префикс к скрипту, который вы хотите вставить:

echo '

и затем добавляем к строке следующее:

'|sudo tee ses.sh >/dev/null && sudo chmod +x ses.sh && sudo ./ses.sh

и затем вы можете скопировать и вставить все это за один раз в командной строке. Например:

echo '#!/bin/bash
echo "Do some stuff - line 1"
echo "Do some stuff - line 2"
sudo echo -e "Do some stuff - line 3\nand line 4"
[[ 1 == 1 ]] && echo "We are all done here, bye!"
'|sudo tee ses.sh >/dev/null && sudo chmod +x ses.sh && sudo ./ses.sh

К сожалению, эта ошибка возникнет, если вставляемый вами скрипт содержит одинарные кавычки.

Другой способ сделать это, не сохраняя файл, заключается в следующем:

/bin/bash -c '[script here]'

т.е. префикс /bin/bash -c 'и суффикс один'

Другой вопрос, действительно ли целесообразно копировать и вставлять скрипты sudo таким образом...

решение3

Другими словами, я ищу способ запустить скрипт из вставки,или вставить его во временный файл и запустить его «на месте», не сохраняя никаких файлов--- Для запуска всего требуется минимальное количество кликов и вставок.

Именно это вы и можете сделать, используя библиотеку «readline» вашей оболочки.

См. LESS='+/^READLINE' man bashтакже и LESS='+/edit-and-execute-command' man bash.


В вашем случае все просто:

В вашем ~/.bashrcфайле поместите следующую строку:

EDITOR=nano

Выйдите из системы и войдите снова, чтобы изменения вступили в силу. (Или просто введите . ~/.bashrc)

Затем, когда вы захотите вставить команду, введите CtrlXCtrlE.

Временный Nano-буфер будет открыт. Вставьте (или введите) команды, которые вы хотите запустить.

После сохранения и выхода все введенные вами данные будут выполнены точно так же, как если бы вы ввели их в командной строке Bash.


Если вы начали вводить команду, а затем поняли, что она будет длинной и вам нужны возможности вашего редактора для ее редактирования, вы можете CtrlXCtrlEв любой момент ввести текст, чтобы отредактировать текущую командную строку с помощью Nano.

Не то чтобы Nano обладал большой мощью. Может, вам стоит попробовать изучить Vim? :)

Снова,видетьLESS='+/edit-and-execute-command' man bashдля получения достоверных сведений.


Обратите внимание, что если вы включите exitкоманду,твойоболочкабудет завершен. Вы не запускаете команды каксценарий. Вы запускаете их в своемтекущая оболочка. Поэтому не включайте exitоператор, если вы не хотите получить тот же эффект, который вы получили бы, введя его exitв командную строку.

решение4

Если ваша цель — запустить скрипты, которых нет на удаленных машинах: есть лучшие способы сделать это без необходимости копировать и вставлять весь скрипт в терминал удаленной машины.

Например: вы можете выполнить локальный скрипт на удаленной машине через ssh:

cat script.sh | ssh me@myserver /bin/bash

Редактировать: Спасибо, что нашли время отредактировать дополнительную информацию по вашему вопросу, чтобы он больше не былxyпроблема Ваше здоровье!

Связанный контент