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