Erstellen Sie ein temporäres Skript mit sed (oder einem anderen Dienstprogramm), um es sofort an Ort und Stelle ausführen zu können.

Erstellen Sie ein temporäres Skript mit sed (oder einem anderen Dienstprogramm), um es sofort an Ort und Stelle ausführen zu können.

Ich verwende es sed, um Text in vorhandenen Dateien zu ändern, und Nano, um neue Dateien zu erstellen.

Ich ändere Text sedbeispielsweise folgendermaßen:

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

Gibt es eine Möglichkeit, damit Dateien zu erstellen, ohne in Nano oder VI zu gehen, Text einzufügen, die Berechtigung zu erteilen und dann auszuführen?

Normalerweise mache ich das cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.sh, füge dann den gesamten Skriptinhalt ein, speichere und führe es aus.

Dieses Mal möchte ich jedoch auch das automatisieren und einfach alles als eine Eingabe einfügen und an Ort und Stelle ausführen.

Mit anderen Worten suche ich entweder nach einer Möglichkeit, das Skript über die Einfügen-Funktion auszuführen oder es in eine temporäre Datei einzufügen und es „an Ort und Stelle“ auszuführen, sobald ich die Datei schließe, und es auf diese Weise mit der geringstmöglichen Anzahl von Klicks und Einfügungen auszuführen.


Warum ich diese Lösung brauche:

Der Vorgang kann sich wiederholen, wenn ich mit mehreren Serverumgebungen arbeite und ich beim wiederholten Ausführen dieser Aufgabe Zeit sparen möchte.

Die Diskussion über die Legitimität solcher Maßnahmen ist sicherlich eine Diskussion für sich …


Hier ist ein Beispiel --- Ich füge den folgenden Befehl in die Eingabeaufforderung ein (den ersten, der Et-Zeichen enthält), gehe in Nano, um das Skript zu erstellen, und füge dann die folgende Skriptsyntax ein, speichere und es wird ausgeführt. Ich möchte diesen Prozess automatisieren, umalles davon, in einem Einfügen/einer Aktion.

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

Antwort1

Mit anderen Worten, ich suche entweder nach einem Weg,Führen Sie das Skript aus, indem Sie es einfügen, oder fügen Sie es in eine temporäre Datei ein und führen Sie es „direkt“ aus, ohne die Datei zu speichern. --- Zum Ausführen von allem ist die Anzahl an Klicks und Einfügungen so gering wie möglich.

Angenommen, Ihre interaktive Shell ist eine Bash- oder kompatible Shell – danach suchen Sie:

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

Die obige Code-Praxis wird „Heredoc“ (Abkürzung von „Here document“) genannt und ich habe sie verwendet, um alle Befehle bis EOT in einer neuen Unter-Shell auszuführen.

Auf diese Weise können Sie das Arbeitsverzeichnis oder die Umgebung ändern. Beachten Sie, dass EOT kein Schlüsselwort ist. Sie können also anstelle von EOT jede beliebige Phrase verwenden (achten Sie nur darauf, dass die Schreibweise am Anfang und am Ende des Heredocs gleich ist).

Einfache Anführungszeichen 'EOT'werden verwendet, um die übergeordnete Shell anzuweisen,nichtFühren Sie keine Ersetzungen im Heredocument durch. Dies verhindert beispielsweise die Variablenerweiterung durch die übergeordnete Shell anstelle der untergeordneten Shell.

Als konkretes Beispiel:

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

Mit anderen Worten, ich suche entweder nach einer Möglichkeit, das Skript aus Paste auszuführen, oder nachfüge es in eine temporäre Datei ein und führe es „an Ort und Stelle“ ausohne eine Datei zu speichern --- Zum Ausführen von allem sind nur minimale Klicks und Einfügungen erforderlich.

Wenn Sie eine Kopie des ausgeführten Befehls behalten möchten, können Sie diese Variante verwenden:

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}

Antwort2

Sie können dies tun, indem Sie dem Skript, das Sie einfügen möchten, Folgendes voranstellen:

echo '

und dann eine Zeile folgendermaßen anhängen:

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

und dann können Sie das Ganze in einem Rutsch in der Befehlszeile kopieren und einfügen. Zum Beispiel:

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

Dies wird leider ausgelöst, wenn das von Ihnen eingefügte Skript einfache Anführungszeichen enthält.

Eine andere Möglichkeit, bei der keine Datei gespeichert wird, ist folgende:

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

d. h. Präfix /bin/bash -c 'und Suffix ein einziges'

Ob es wirklich ratsam ist, Sudo-Skripte auf diese Weise zu kopieren und einzufügen, ist eine andere Frage …

Antwort3

Mit anderen Worten, ich suche entweder nach einer Möglichkeit, das Skript über Einfügen auszuführen,oder fügen Sie es in eine temporäre Datei ein und führen Sie es „an Ort und Stelle“ aus, ohne die Datei zu speichern--- Zum Ausführen aller Aktionen sind möglichst wenige Klicks und Einfügungen erforderlich.

Genau dies können Sie mit der Bibliothek „readline“ Ihrer Shell tun.

Siehe LESS='+/^READLINE' man bashauch und LESS='+/edit-and-execute-command' man bash.


In Ihrem Fall ist es einfach:

Fügen Sie in Ihre ~/.bashrcDatei die folgende Zeile ein:

EDITOR=nano

Melden Sie sich ab und erneut an, damit die Änderung wirksam wird. (Oder geben Sie einfach ein . ~/.bashrc)

Wenn Sie dann einen Befehl einfügen möchten, geben Sie ein CtrlXCtrlE.

Ein temporärer Nano-Puffer wird geöffnet. Fügen Sie die Befehle ein, die Sie ausführen möchten (oder geben Sie sie ein).

Wenn Sie speichern und beenden, werden alle Ihre Eingaben genauso ausgeführt, als hätten Sie sie in die Bash-Eingabeaufforderung eingegeben.


Wenn Sie mit der Eingabe eines Befehls beginnen und dann feststellen, dass dieser lang ist und Sie ihn mithilfe Ihres Editors bearbeiten möchten, können Sie CtrlXCtrlEdie aktuelle Befehlszeile jederzeit mit Nano bearbeiten.

Nicht, dass Nano viel Power hätte. Vielleicht solltest du versuchen, Vim zu lernen? :)

Wieder,sehenLESS='+/edit-and-execute-command' man bashfür verbindliche Einzelheiten.


Beachten Sie, dass wenn Sie einen exitBefehl einschließen,deinHülsewird beendet. Sie führen die Befehle nicht alsSkript. Sie führen sie in Ihremaktuelle Shell. Fügen Sie also keine exitAnweisung ein, es sei denn, Sie möchten denselben Effekt erzielen, den Sie durch die Eingabe exitin Ihre Eingabeaufforderung erzielen würden.

Antwort4

Wenn Ihr Ziel darin besteht, Skripte auszuführen, die auf Remotecomputern nicht vorhanden sind, gibt es bessere Möglichkeiten, dies zu erreichen, ohne das gesamte Skript auf das Terminal des Remotecomputers kopieren und einfügen zu müssen.

Beispiel: Sie können ein lokales Skript über SSH auf einem Remotecomputer ausführen:

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

Bearbeiten: Vielen Dank, dass Sie sich die Zeit genommen haben, zusätzliche Informationen zu Ihrer Frage hinzuzufügen, sodass es sich nicht mehr um einexyproblem Prost!

verwandte Informationen