如何远程执行 vps 中的 bash 脚本
how to execute bash script inside vps remotely
我的任务是让第二个开发人员能够重新启动 gunicorn 服务,而不给他访问整个虚拟机的权限,他可以通过 ftp 在他的项目目录中上传他的项目文件,但是他不能自己重启gunicorn。
我的“script.sh”是:
sudo service gunicorn restart
我可以使用此命令在终端中自己执行 script.sh,它工作正常:
./script.sh
如何远程执行这个脚本?也许通过 url?
或者如果有其他更好的方法来完成这个任务,请分享
谢谢!
I like two of your ideas most, one is writing a service that detect uploaded files in specific directory
基本上是一个脚本:
inotifywait /the/dir -m -e CREATE,CLOSE | while read -f action file; do
rm "$file"
systemctl restart that_thing
done
可能对特定文件名进行一些过滤 and/or 密码检查,例如文件名的内容必须是某个密码。
如果您不使用 Linux,而不是 inotifywait,您可以每隔一秒左右轮询文件是否存在。
参见 man inotifywait
、https://mywiki.wooledge.org/BashFAQ/001 + https://mywiki.wooledge.org/BashGuide . I doubt your server uses rc-scripts , it's 2021, consider moving to systemd. https://www.linode.com/docs/guides/introduction-to-systemctl/ + https://www.shubhamdipt.com/blog/how-to-create-a-systemd-service-in-linux/。
And second is to give to the developer access with which he could trigger only specific commands
设置 ssh 服务器,给开发者一个用户帐户,安装 sudo
然后在 /etc/sudoers.d/other_developer
中创建一个文件,内容为:
otherdeveoperuseraccount ALL=(root) NOPASSWD: /usr/bin/systemctl restart that_service
然后其他开发人员将能够运行该特定命令。
参见 man sudo
、man sudoers
和 https://unix.stackexchange.com/questions/279125/allow-user-to-run-a-command-with-arguments-which-contains-spaces。总的来说,关于如何设置ssh服务器和添加用户帐户,感兴趣的是Linux计算机管理的一些基本介绍-网上肯定有无穷无尽的。
一种方式:
- 创建具有最小权限的用户。 (不幸的是,需要一些 shell 特权)。
- 覆盖
The ONLY command
强制在该用户的 ssh 上运行。
# 1. Create a user with shell = /bin/sh & no home-dir
sudo adduser limiteduser --shell=/bin/sh --no-create-home
# 2. Restrict further in sshd_config
nano /etc/ssh/sshd_config
## > Add the following at the end
Match user limiteduser
ForceCommand /path/to/restart-script
# ForceCommand ls # Tried this for testing.
P.S:一些副作用包括 limiteduser
可以访问隧道端口。由于用户已经具有 FTP 访问权限;我假设安全要求不是特别严格。
另一种方式 - 因为存在 FTP 访问权限。
- 当用户完成 FTP 上传后,要求他在以下位置创建一个文件:
/path/to/ftp/folder/request-restart.txt
[Per-minute]
编写一个 cron 作业来检查此文件并运行重启脚本并删除该文件。
- @kamilkuk 的回答中的 inotify 脚本是一个更好的实时版本。使用 cron 时,最大分辨率为 1 分钟。
- 这可以扩展为用户提供更多
request-some-other-command
。
# cron-watch-n-restart-script.sh
FILE="/path/to/ftp/folder/request-restart.txt"
if [[ -f "$FILE" ]]; then
/path/to/restart-script.sh
rm $FILE
fi
# Cron job entry (crontab -e): every minute
* * * * * /path/to/cron-watch-n-restart-script.sh
我的任务是让第二个开发人员能够重新启动 gunicorn 服务,而不给他访问整个虚拟机的权限,他可以通过 ftp 在他的项目目录中上传他的项目文件,但是他不能自己重启gunicorn。
我的“script.sh”是:
sudo service gunicorn restart
我可以使用此命令在终端中自己执行 script.sh,它工作正常:
./script.sh
如何远程执行这个脚本?也许通过 url? 或者如果有其他更好的方法来完成这个任务,请分享
谢谢!
I like two of your ideas most, one is writing a service that detect uploaded files in specific directory
基本上是一个脚本:
inotifywait /the/dir -m -e CREATE,CLOSE | while read -f action file; do
rm "$file"
systemctl restart that_thing
done
可能对特定文件名进行一些过滤 and/or 密码检查,例如文件名的内容必须是某个密码。
如果您不使用 Linux,而不是 inotifywait,您可以每隔一秒左右轮询文件是否存在。
参见 man inotifywait
、https://mywiki.wooledge.org/BashFAQ/001 + https://mywiki.wooledge.org/BashGuide . I doubt your server uses rc-scripts , it's 2021, consider moving to systemd. https://www.linode.com/docs/guides/introduction-to-systemctl/ + https://www.shubhamdipt.com/blog/how-to-create-a-systemd-service-in-linux/。
And second is to give to the developer access with which he could trigger only specific commands
设置 ssh 服务器,给开发者一个用户帐户,安装 sudo
然后在 /etc/sudoers.d/other_developer
中创建一个文件,内容为:
otherdeveoperuseraccount ALL=(root) NOPASSWD: /usr/bin/systemctl restart that_service
然后其他开发人员将能够运行该特定命令。
参见 man sudo
、man sudoers
和 https://unix.stackexchange.com/questions/279125/allow-user-to-run-a-command-with-arguments-which-contains-spaces。总的来说,关于如何设置ssh服务器和添加用户帐户,感兴趣的是Linux计算机管理的一些基本介绍-网上肯定有无穷无尽的。
一种方式:
- 创建具有最小权限的用户。 (不幸的是,需要一些 shell 特权)。
- 覆盖
The ONLY command
强制在该用户的 ssh 上运行。
# 1. Create a user with shell = /bin/sh & no home-dir
sudo adduser limiteduser --shell=/bin/sh --no-create-home
# 2. Restrict further in sshd_config
nano /etc/ssh/sshd_config
## > Add the following at the end
Match user limiteduser
ForceCommand /path/to/restart-script
# ForceCommand ls # Tried this for testing.
P.S:一些副作用包括 limiteduser
可以访问隧道端口。由于用户已经具有 FTP 访问权限;我假设安全要求不是特别严格。
另一种方式 - 因为存在 FTP 访问权限。
- 当用户完成 FTP 上传后,要求他在以下位置创建一个文件:
/path/to/ftp/folder/request-restart.txt
[Per-minute]
编写一个 cron 作业来检查此文件并运行重启脚本并删除该文件。- @kamilkuk 的回答中的 inotify 脚本是一个更好的实时版本。使用 cron 时,最大分辨率为 1 分钟。
- 这可以扩展为用户提供更多
request-some-other-command
。
# cron-watch-n-restart-script.sh
FILE="/path/to/ftp/folder/request-restart.txt"
if [[ -f "$FILE" ]]; then
/path/to/restart-script.sh
rm $FILE
fi
# Cron job entry (crontab -e): every minute
* * * * * /path/to/cron-watch-n-restart-script.sh