GitHub Actions Runner 执行需要sudo权限的命令

156次阅读
没有评论

问题描述

在使用GitHub Actions Runner时,遇到了一个问题。他在自托管的Ubuntu VPS上运行了一个GitHub Action,先执行了sudo ./svc.sh install,然后执行了./svc.sh start。Runner已经正常工作,但是他的yaml文件中有一个需要以sudo权限运行的命令。他在sudoers文件中添加了以下命令,以便在不使用sudo的情况下运行:%sudo ALL= NOPASSWD: /bin/systemctl restart twentydb.service但是当他在服务器上推送时,出现了以下错误:sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper

name: restart the service
run: |
  sudo systemctl restart twentydb

他还需要在同一台服务器上设置另外两个Runner,并进行相同的设置。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据GitHub社区的回答,你的问题可以通过以下步骤解决:
1. 首先,确保你的workflow文件中的命令与sudoers文件中的命令相同。sudo不知道它们在功能上是等效的。在workflow文件中也使用twentydb.service
2. 另外,确保你的Runner运行的用户是否在sudo组中。如果不在,那么sudoers文件中的条目将不适用于它。然而,我建议为用户单独添加一个条目,而不是将Runner添加到sudo组中。
以下是一个示例sudoers文件的条目:

%sudo ALL= NOPASSWD: /bin/systemctl restart twentydb.service
your_user ALL= NOPASSWD: /bin/systemctl restart twentydb.service

在上面的示例中,%sudo表示sudo组,your_user表示你的Runner运行的用户。这将允许sudo组和你的用户在不需要密码的情况下运行/bin/systemctl restart twentydb.service命令。

方案2

如果你不想将Runner用户添加到sudo组中,你可以尝试使用-S选项从标准输入读取密码,或者配置一个askpass助手。
如果你不想将Runner用户添加到sudo组中,你可以尝试使用-S选项从标准输入读取密码,或者配置一个askpass助手。这样,当sudo需要密码时,它将从标准输入或askpass助手中读取密码。
以下是一个示例使用-S选项的命令:

name: restart the service
run: |
  echo "your_password" | sudo -S systemctl restart twentydb

在上面的示例中,我们使用echo命令将密码发送到sudo的标准输入。-S选项告诉sudo从标准输入读取密码。请将your_password替换为你的sudo密码。
请注意,使用-S选项将密码明文传输,可能会存在安全风险。如果你担心密码的安全性,你可以配置一个askpass助手来提供密码。askpass助手是一个可执行文件,用于从用户那里获取密码,并将其传递给sudo。

方案3

如果你需要在同一台服务器上设置另外两个Runner,并进行相同的设置,你可以按照以下步骤操作:
1. 安装并配置第二个和第三个Runner,确保它们与第一个Runner的设置相同。
2. 在sudoers文件中为第二个和第三个Runner添加相应的条目,以允许它们在不需要密码的情况下运行/bin/systemctl restart twentydb.service命令。
以下是一个示例sudoers文件的条目:

your_user2 ALL= NOPASSWD: /bin/systemctl restart twentydb.service
your_user3 ALL= NOPASSWD: /bin/systemctl restart twentydb.service

在上面的示例中,your_user2your_user3分别表示第二个和第三个Runner运行的用户。这将允许这两个用户在不需要密码的情况下运行/bin/systemctl restart twentydb.service命令。
请注意,这些步骤假设你已经安装了第二个和第三个Runner,并且它们与第一个Runner的设置相同。如果你还没有安装第二个和第三个Runner,请参考GitHub官方文档以获取安装和配置指南。

正文完