如何远程执行 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 inotifywaithttps://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 sudoman sudoershttps://unix.stackexchange.com/questions/279125/allow-user-to-run-a-command-with-arguments-which-contains-spaces。总的来说,关于如何设置ssh服务器和添加用户帐户,感兴趣的是Linux计算机管理的一些基本介绍-网上肯定有无穷无尽的。

一种方式:

  1. 创建具有最小权限的用户。 (不幸的是,需要一些 shell 特权)。
  2. 覆盖 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