如何 sudo 复制文件并使用 shell 脚本向其传递参数

如何 sudo 复制文件并使用 shell 脚本向其传递参数

我想使用 shell 脚本来设置我的虚拟机。示例 script.sh 有

pip install wheel
pip install cookiecutter
pip install flask 
pip install gunicorn
pip install uwsgi

然后我希望它在 /etc/systemd/system/website.service 位置创建一个服务文件,其中包含以下内容:

[Unit]
Description=Gunicorn instance to serve website
After=network.target

[Service]
User=$1
Group=www-data
WorkingDirectory=/home/$1/website
Environment="PATH=/home/$1/website/venv/bin"
ExecStart=/home/$1/website/venv/bin/gunicorn --workers 3 --bind unix:website.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

其中 $1 被执行 shell 脚本的用户 ($USER) 替换。最好的解决方案是,如果我将其放在一个单独的文件中,然后在替换参数时将文件复制到指定位置。重要的是,由于位置的原因,这需要 sudo 进行粘贴。

就像是:

pip install wheel
pip install cookiecutter
pip install flask 
pip install gunicorn
pip install uwsgi
sudo echo file_containing_text.txt $USER > /etc/systemd/system/website.service

但出于对我的爱,我无法让它发挥作用。

答案1

可能有更好的方法来做到这一点,但是为了具体实现您想要做的事情,您可以使用“此处文档”:

#!/bin/bash
pip install wheel
pip install cookiecutter
pip install flask 
pip install gunicorn
pip install uwsgi
sudo cat > /etc/systemd/system/website.service << EOF
[Unit]
Description=Gunicorn instance to serve website
After=network.target

[Service]
User=${USER}
Group=www-data
WorkingDirectory=/home/${USER}/website
Environment="PATH=/home/${USER}/website/venv/bin"
ExecStart=/home/${USER}/website/venv/bin/gunicorn --workers 3 --bind unix:website.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target
EOF

<< TOKEN和一行之间的所有内容TOKEN都是文档;在我的示例中,我用作EOF令牌。

答案2

是的,问题是 shell(像您一样运行)尝试处理重定向启动 sudo 命令。

tee在这里效果很好:

sed 's/\$1/'"$USER"'/' your_file | sudo tee /some/privileged/file

如果您不想在屏幕上看到输出,请>/dev/null在末尾添加。

或者,您可以使用 sudo 生成一个 shell:

export USER
sudo sh -c 'sed "s/\\\$1/$USER/" your_file > /some/privileged/file'

但我们在这里显然引用了地狱。

相关内容