使用 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,然後將所有腳本內容貼到裡面,然後儲存並執行。

然而這一次,我什至想自動化這一點,只需將所有內容貼為一個輸入並就地運行即可。

換句話說,我尋找一種從粘貼運行腳本的方法,或者將其粘貼到臨時文件中並在關閉文件時“就地”運行它,從而以最少的數量運行它點擊和粘貼。


為什麼我需要這個解決方案:

在使用多個伺服器環境時,該過程可能會重複,並且我希望在一次又一次執行此任務時節省時間。

關於這種行為的合法性的討論本身就是一場討論...


這是一個範例 --- 我將以下 coomand 貼到提示符號(第一個,包括&符號),進入 Nano 創建腳本,然後,我貼上以下腳本語法,保存,它正在執行。我希望自動化這個流程所有這些,一次貼上/一次動作。

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

換句話說,我尋找一種方法從貼上運行腳本,或將其貼到臨時檔案中並「就地」運行而不儲存任何檔案 --- 運行所有內容只需最少的點擊和貼上次數。

假設您的互動式 shell 是 Bash 或相容 shell - 您正在尋找:

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

上面的程式碼實踐稱為「Heredoc」(「Here document」的縮寫),我用它在新的子 shell 中執行直到 EOT 為止的所有命令。

這樣,您可以更改工作目錄或更改環境。請注意,EOT 不是關鍵字,因此您可以使用任何您想要的短語來代替 EOT(只需確保定界文件開頭和結尾的拼寫相同)。

單引號周圍'EOT'用於指示父 shell不是執行此處文件中的任何替換。例如,這可以防止父 shell 而不是子 shell 進行變數擴展。

作為一個具體的例子:

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

換句話說,我尋找一種從貼上運行腳本的方法,或將其貼到臨時文件中並“就地”運行而不保存任何文件--- 只需最少的點擊和貼上即可運行所有內容。

您可以使用 shell 的“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問題 乾杯!

相關內容