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