我想使用 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'
但我们在这里显然引用了地狱。