sed(またはその他のユーティリティ)を使用して一時的なスクリプトを作成し、その場で実行するスクリプトをすぐに作成します。

sed(またはその他のユーティリティ)を使用して一時的なスクリプトを作成し、その場で実行するスクリプトをすぐに作成します。

既存のファイル内のテキストを変更するにはNano を使用し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から、スクリプトの内容をすべて貼り付け、保存して実行します。

ただし今回は、それも自動化し、すべてを 1 つの入力として貼り付けて、その場で実行したいと思います。

言い換えると、貼り付けからスクリプトを実行する方法、または一時ファイルに貼り付けてファイルを閉じた瞬間に「その場で」実行する方法、つまりクリックと貼り付けの回数を最小限に抑えてスクリプトを実行する方法を探します。


このソリューションが必要な理由:

複数のサーバー環境で作業する場合、プロセスが繰り返される可能性があり、このタスクを何度も繰り返すときに時間を節約したいと考えています。

こうした行為の正当性についての議論は、確かにそれ自体が議論すべきものです...


例を挙げます。プロンプトに以下のコマンド(最初のコマンド、アンパサンドを含む)を貼り付け、Nanoでスクリプトを作成し、次のスクリプト構文を貼り付けて保存すると、実行されます。このプロセスを自動化して、これらすべて、1 回の貼り付け / 1 つのアクションで。

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 はキーワードではないので、EOT の代わりに任意のフレーズを使用できます (ヒアドキュメントの最初と最後でスペルが同じであることを確認してください)。

シングルクォートは'EOT'親シェルに指示するために使われますないヒアドキュメント内で置換を実行します。これにより、たとえば子シェルではなく親シェルによる変数の拡張が防止されます。

具体的な例として:

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問題 乾杯!

関連情報