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

2

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

Eu altero o texto com sed desta 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, dando permissão e depois executar?

Normalmente eu faço cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.sh e depois colo todo o conteúdo do script dentro, depois salve e execute.

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

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

Por que preciso dessa solução:

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

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

Aqui está um exemplo --- eu colo o seguinte anúncio e para o prompt (o primeiro, que inclui e comercial), vá em Nano para criar o script e, em seguida, eu colo a seguinte sintaxe de script, salve, e é isso está sendo executado. Desejo automatizar esse processo para fazer tudo isso , em uma única ação / 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
    
por JohnDoea 01.11.2016 / 13:24

5 respostas

3

In other words, I look for either a way to run the script from paste, or to paste it into a temporary file and run it "in-place" without saving any file --- To run everything is least number of clicks and pastings.

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

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

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

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

As aspas simples estão em torno de 'EOT' são usadas para instruir o shell pai para não executar qualquer substituição no documento. Isso impede, por exemplo, a expansão da variável pelo shell pai em vez do shell filho.

Como um 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

In other words, I look for either a way to run the script from paste, or to paste it into a temporary file and run it "in-place" without saving any file --- To run everything is least number of clicks and pastings.

Se você 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}
    
por 15.11.2016 / 22:47
1

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

echo '

e depois 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 isso 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á acionado se o script que você está colando incluir aspas simples, infelizmente.

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

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

i.e. prefixo /bin/bash -c ' e sufixo um único '

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

    
por 01.11.2016 / 19:10
1

In other words, I look for either a way to run the script from paste, or to paste it into a temporary file and run it "in-place" without saving any file --- To run everything is least number of clicks and pastings.

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

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

Para o seu caso, é simples:

No seu arquivo ~/.bashrc , coloque a seguinte linha:

EDITOR=nano

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

Depois, quando quiser colar um comando, digite Ctrl X Ctrl E .

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

Quando você salva e sai, o que quer que tenha sido digitado será executado exatamente como se você o tivesse digitado no prompt de comando Bash.

Se você começar a digitar um comando e perceber que ele será longo e você quiser que o editor o edite, você pode digitar Ctrl X < kbd> Ctrl E a 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? :)

Mais uma vez, veja LESS='+/edit-and-execute-command' man bash para detalhes importantes.

Note que se você incluir um comando exit , seu shell será encerrado. Você não está executando os comandos como um script . Você os está executando em seu shell atual. Portanto, não inclua uma instrução exit , a menos que você queira o mesmo efeito que obter digitando exit em seu prompt de comando.

    
por 06.11.2016 / 08:10
0

Parece não haver necessidade de envolver sed (ou qualquer outro utilitário), pois o Bash pode fazer isso sozinho:

Agora observo que é o suficiente para mim: \ e depois, no "prompt de continuação de linha", que é aberto, eu poderia simplesmente colar meu script e ele seria executado. Por exemplo:

\

> Paste your script here (with #!/bin/bash) and it would run directly.

Nota:

Você pode executar um script sem barra invertida () e apenas digitar o script, mas no caso de ter uma nota de script (#) no início em que copia o script com --- Você usaria uma barra invertida .

Atualização:

Por favor, leia os comentários: Esta resposta pode não ser útil em alguns sistemas se o seu script incluir comentários.

    
por 03.11.2016 / 11:03
0

Se seu objetivo é executar scripts que não existem em máquinas remotas: há maneiras melhores de obtê-lo sem ter que 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 por meio do ssh:

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

Editar: Obrigado por dedicar seu tempo para editar informações adicionais à sua pergunta, para que ela não seja mais um xyproblem Felicidades!

    
por 15.11.2016 / 23:32

Tags