Crie um script temporário com sed (ou qualquer outro utilitário) para criação imediata de script para execução no local

Crie um script temporário com sed (ou qualquer outro utilitário) para criação imediata de script para execução no local

Eu uso sedpara alterar o texto em arquivos existentes e o Nano para criar novos arquivos.

Eu mudo o texto seddesta forma, por exemplo:

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

Existe uma maneira de criar arquivos com ele, sem entrar no Nano ou VI e colar texto, dar permissão e depois executar?

Normalmente eu faço cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.she colo todo o conteúdo do script dentro dele, salvo e executo.

Desta vez, porém, quero automatizar até isso e apenas colar tudo como uma entrada e executá-lo no lugar.

Em outras palavras, procuro uma maneira de executar o script a partir da colagem ou colá-lo em um arquivo temporário e executá-lo "no local" no momento em que fecho o arquivo e, com isso, executá-lo com o menor número de cliques e colagens.


Por que preciso desta solução:

O processo pode ser repetitivo ao trabalhar com vários ambientes de servidor e quero economizar tempo ao executar essa tarefa repetidamente.

A discussão sobre a legitimidade de tal ação é certamente uma discussão por si só...


Aqui está um exemplo --- eu colo o seguinte coomand no prompt (o primeiro, que inclui e comercial), entro no Nano para criar o script e, em seguida, colo a seguinte sintaxe do script, salvo e ele está sendo executado . Desejo automatizar este processo como fazertudo isso, em uma colagem/uma ação.

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

Responder1

Em outras palavras, procuro uma maneira deexecute o script a partir da pasta, ou colá-lo em um arquivo temporário e executá-lo "no local" sem salvar nenhum arquivo --- Para executar tudo é necessário o menor número de cliques e colagens.

Supondo que seu shell interativo seja um Bash ou um shell compatível - você está procurando por isso:

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

A prática de código acima é chamada de "Heredoc" (abreviação de "Here document") e usei-a para executar todos os comandos até EOT em um novo sub-shell.

Dessa forma, você pode alterar o diretório de trabalho ou alterar o ambiente. Observe que EOT não é uma palavra-chave, então você pode usar qualquer frase que desejar em vez de EOT (apenas certifique-se de que a grafia seja a mesma no início e no final do heredoc).

As aspas simples 'EOT'são usadas para instruir o shell pai anãorealizar qualquer substituição neste documento. Isso evita, por exemplo, a expansão de variáveis ​​​​pelo shell pai em vez do shell filho.

Como exemplo concreto:

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

Em outras palavras, procuro uma maneira de executar o script a partir da colagem ou decole-o em um arquivo temporário e execute-o "no local"sem salvar nenhum arquivo --- Para executar tudo é necessário o menor número de cliques e colagens.

Se quiser manter uma cópia do comando executado, você pode usar essa variação:

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}

Responder2

Você pode fazer isso prefixando o script que deseja colar:

echo '

e então sufixando uma linha assim:

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

e então você pode copiar e colar tudo de uma só vez na linha de comando. Por exemplo:

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

Isso será lançado se o script que você está colando incluir aspas simples, infelizmente.

Outra maneira de fazer isso que na verdade não salva um arquivo é esta:

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

ou seja, prefixo /bin/bash -c 'e sufixo um único'

Se é realmente aconselhável copiar e colar scripts sudo dessa maneira é outra questão ...

Responder3

Em outras palavras, procuro uma maneira de executar o script a partir da colagem,ou colá-lo em um arquivo temporário e executá-lo "no local" sem salvar nenhum arquivo--- Para rodar tudo é necessário o menor número de cliques e colagens.

Você pode fazer exatamente isso usando a biblioteca "readline" do seu shell.

Veja LESS='+/^READLINE' man bashe também LESS='+/edit-and-execute-command' man bash.


Para o seu caso é simples:

No seu ~/.bashrcarquivo, coloque a seguinte linha:

EDITOR=nano

Saia e faça login novamente para que a alteração tenha efeito. (Ou apenas digite . ~/.bashrc)

Então, quando quiser colar um comando, digite CtrlXCtrlE.

Um buffer Nano temporário será aberto. Cole (ou digite) os comandos que deseja executar.

Quando você salva e sai, tudo o que você digitou será executado exatamente como se você tivesse digitado no prompt de comando do Bash.


Se você começar a digitar um comando e perceber que ele será longo e deseja que o poder do seu editor o edite, você pode digitar CtrlXCtrlEa qualquer momento para editar a linha de comando atual usando o Nano.

Não que o Nano tenha muito poder. Talvez você devesse tentar aprender Vim? :)

De novo,verLESS='+/edit-and-execute-command' man bashpara obter detalhes oficiais.


Observe que se você incluir um exitcomando,seuconchaserá encerrado. Você não está executando os comandos como umroteiro. Você os está executando em seuconcha atual. Portanto, não inclua uma exitdeclaração, a menos que queira o mesmo efeito que obteria ao digitar exitno prompt de comando.

Responder4

Se o seu objetivo é executar scripts que não existem em máquinas remotas: existem maneiras melhores de conseguir isso sem precisar copiar e colar o script inteiro no terminal da máquina remota.

Por exemplo: Você pode executar um script local em uma máquina remota através de ssh:

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

Editar: Obrigado por reservar um tempo para editar informações adicionais à sua pergunta para que ela não seja mais umproblema xy Saúde!

informação relacionada