使用 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问题 干杯!

相关内容