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

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

私は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つの貼り付け/一つの作業。

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

一時的なナノバッファが開きます。実行したいコマンドを貼り付けるか入力します。

保存して終了すると、入力した内容はすべてBashコマンドプロンプトで入力したのと同じように実行されます。


コマンドを入力し始めたが、コンテンツが長くなって編集者が編集できるようにしたい場合は、CtrlXCtrlEいつでもNanoを使用して現在のコマンドラインを入力して編集できます。

ナノが多くの力を持っているわけではありません。 Vimを学ぶのはどうですか? :)

また、バラよりLESS='+/edit-and-execute-command' man bash信頼できる詳細を入手してください。


exit次のコマンドを含めるとあなたのシェル終了します。 次のようにコマンドを渡しませんでした。スクリプト。あなたはあなたの現在のシェル。exitしたがって、exitコマンドプロンプトに入力して得られるのと同じ効果を望まない限り、そのステートメントを含めないでください。

答え4

目的がリモートシステムに存在しないスクリプトを実行することであれば、スクリプト全体をリモートシステムの端末にコピーして貼り付けることなくこれを達成するためのより良い方法があります。

たとえば、SSH を介してリモートシステムでローカルスクリプトを実行できます。

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

編集:時間をかけて質問に関する追加情報を編集して、これ以上質問にならないようにしていただきありがとうございます。XYの問題 乾杯!

関連情報