Я использую sed
Nano для изменения текста в существующих файлах и для создания новых файлов.
Я изменяю текст 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проблема Ваше здоровье!