Utilizo sed
para cambiar texto en archivos existentes y Nano para crear archivos nuevos.
Cambio el texto de sed
esta manera, por ejemplo:
sudo sed -i 's/TESTING === "1"/TESTING === "0"/g' /etc/csf/csf.conf
¿Hay alguna manera de crear archivos con él, sin ingresar a Nano o VI y pegar texto, dar permiso y luego ejecutar?
Normalmente lo hago cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.sh
y luego pego todo el contenido del script dentro, luego lo guardo y lo ejecuto.
Esta vez, sin embargo, quiero automatizar incluso eso, simplemente pegar todo como una entrada y ejecutarlo en su lugar.
En otras palabras, busco una forma de ejecutar el script desde pegar o pegarlo en un archivo temporal y ejecutarlo "en el lugar" en el momento en que cierro el archivo y así ejecutarlo con el menor número de de clics y pegados.
Por qué necesito esta solución:
El proceso puede resultar repetitivo cuando se trabaja con varios entornos de servidores y quiero ahorrar tiempo al realizar esta tarea una y otra vez.
La discusión sobre la legitimidad de tal acción es sin duda una discusión en sí misma...
Aquí hay un ejemplo: pego el siguiente comando en el mensaje (el primero, que incluye símbolos), entro en Nano para crear el script y, en ese momento, pego la siguiente sintaxis del script, lo guardo y se está ejecutando. . Deseo automatizar este proceso para hacertodo esto, en un pegado / una acción.
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
Respuesta1
En otras palabras, busco una manera deejecutar el script desde pegar, o pegarlo en un archivo temporal y ejecutarlo "en el lugar" sin guardar ningún archivo --- Para ejecutar todo es el menor número de clics y pegados.
Suponiendo que su shell interactivo sea un Bash o un shell compatible, lo que está buscando es:
bash << 'EOT'
<PASTE SCRIPT HERE>
EOT
La práctica de código anterior se llama "Heredoc" (abreviatura de "documento Here") y la usé para ejecutar todos los comandos hasta el final del tiempo en un nuevo subshell.
De esa manera, puede cambiar el directorio de trabajo o modificar el entorno. Tenga en cuenta que EOT no es una palabra clave, por lo que puede usar cualquier frase que desee en lugar de EOT (solo asegúrese de que la ortografía sea la misma tanto al principio como al final del documento heredoc).
Las comillas simples 'EOT'
se utilizan para indicarle al shell principal quenorealizar cualquier sustitución en el presente documento. Esto evita, por ejemplo, la expansión de variables por parte del shell principal en lugar del shell secundario.
Como ejemplo 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
En otras palabras, busco una forma de ejecutar el script desde pegar o depéguelo en un archivo temporal y ejecútelo "in situ"sin guardar ningún archivo --- Para ejecutar todo es el menor número de clics y pegados.
Si desea conservar una copia del comando ejecutado, puede utilizar esa variación:
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}
Respuesta2
Puede hacer esto anteponiendo el script que desea pegar:
echo '
y luego agregando una línea como sufijo:
'|sudo tee ses.sh >/dev/null && sudo chmod +x ses.sh && sudo ./ses.sh
y luego puedes copiar y pegar todo esto de una sola vez en la línea de comando. Por ejemplo:
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
Desafortunadamente, esto se producirá si el script que está pegando incluye comillas simples.
Otra forma de hacerlo que en realidad no guarda un archivo es esta:
/bin/bash -c '[script here]'
es decir, prefijo /bin/bash -c '
y sufijo un solo'
Si es realmente aconsejable copiar y pegar scripts sudo de esta manera es otra cuestión...
Respuesta3
En otras palabras, busco una forma de ejecutar el script desde pegar,o pegarlo en un archivo temporal y ejecutarlo "in situ" sin guardar ningún archivo--- Para ejecutar todo es el menor número de clics y pegados.
Puedes hacer exactamente esto usando la biblioteca "readline" de tu shell.
Ver LESS='+/^READLINE' man bash
y también LESS='+/edit-and-execute-command' man bash
.
Para tu caso es sencillo:
En su ~/.bashrc
archivo, coloque la siguiente línea:
EDITOR=nano
Cierra sesión y vuelve a iniciar sesión para que el cambio surta efecto. (O simplemente escriba . ~/.bashrc
)
Luego, cuando quieras pegar un comando, escribe CtrlXCtrlE.
Se abrirá un Nano buffer temporal. Pegue (o escriba) los comandos que desea ejecutar.
Cuando guarde y salga, todo lo que haya ingresado se ejecutará exactamente como si lo hubiera escrito en el símbolo del sistema de Bash.
Si comienza a escribir un comando y luego se da cuenta de que va a ser largo y desea que el poder de su editor lo edite, puede escribir CtrlXCtrlEen cualquier momento para editar la línea de comando actual usando Nano.
No es que Nano tenga mucho poder. ¿Quizás deberías intentar aprender Vim? :)
De nuevo,verLESS='+/edit-and-execute-command' man bash
para obtener detalles autorizados.
Tenga en cuenta que si incluye un exit
comando,sucaparazónsaldrá. No estás ejecutando los comandos comoguion. Los estás ejecutando en tucaparazón actual. Por lo tanto, no incluya una exit
declaración a menos que desee el mismo efecto que obtendría escribiendo exit
en el símbolo del sistema.
Respuesta4
Si su objetivo es ejecutar scripts que no existen en máquinas remotas: existen mejores formas de lograrlo sin tener que copiar y pegar el script completo en la terminal de la máquina remota.
Por ejemplo: puede ejecutar un script local en una máquina remota a través de ssh:
cat script.sh | ssh me@myserver /bin/bash
Editar: Gracias por tomarse el tiempo de editar información adicional a su pregunta para que ya no sea unaxyproblema ¡Salud!