Linux 上如何让任意普通用户执行拥有root权限的特定脚本或者程序

问题描述

        有一个脚本,只能是具有root执行权限的用户来执行。这意味着只有root用户和拥有sudo权限的用户才能执行,但我们的需求是让普通用户在没有取得root权限的情况下也能执行,那么就开发另一个可执行程序,以支持普通用户拥有执行此脚本的能力。

解决方案:

        1.  编写一个可执行程序用来执行只有root用户才能执行的操作,例如修改root用户所属文件的权限,并限制可以执行拥有root命令的范围,否则会造成灾难(任何用户都具有root权限),在这个程序中去执行真正需要root权限执行的脚本。而setuid的作用是“让执行该程序的用户以该程序的拥有者的权限去执行”。

        2. 将该可执行程序的执行权限加上s (chmod u+s 可执行程序), 即让执行文件的用户以该文件所属组的权限去执行。

An example:

#include <iostream>
#include <set>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv)
{

    std::set<std::string> reservedCmd;
    reservedCmd.insert("/usr/bin/chmod");

    if (reservedCmd.count(std::string(argv[1])) != 0)
    {
        return execl(argv[1], argv[1], argv[2], argv[3], NULL);
    } else {
        std::cout <&
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下代码实现: ``` import android.accessibilityservice.AccessibilityService; import android.view.accessibility.AccessibilityNodeInfo; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.annotations.JSFunction; public class RhinoAccessibilityService extends AccessibilityService { private Context rhinoContext; private Scriptable rhinoScope; @Override public void onCreate() { super.onCreate(); rhinoContext = Context.enter(); rhinoScope = rhinoContext.initStandardObjects(); ScriptableObject.putProperty(rhinoScope, "service", Context.javaToJS(this, rhinoScope)); ScriptableObject.putProperty(rhinoScope, "printNodeInfo", new PrintNodeInfoFunction()); } @Override public void onDestroy() { super.onDestroy(); Context.exit(); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { // Do nothing } @Override public void onInterrupt() { // Do nothing } @JSFunction public void requestAccessibilityPermission() { performGlobalAction(GLOBAL_ACTION_ACCESSIBILITY_SETTINGS); } @JSFunction public void printNodeInfo() { AccessibilityNodeInfo rootNode = getRootInActiveWindow(); if (rootNode != null) { printNodeInfoRecursive(rootNode, ""); } } private void printNodeInfoRecursive(AccessibilityNodeInfo node, String indent) { String text = node.getText() != null ? node.getText().toString() : ""; String className = node.getClassName() != null ? node.getClassName().toString() : ""; String viewIdResourceName = node.getViewIdResourceName() != null ? node.getViewIdResourceName().toString() : ""; System.out.println(indent + className + " " + viewIdResourceName + " " + text); for (int i = 0; i < node.getChildCount(); i++) { AccessibilityNodeInfo childNode = node.getChild(i); if (childNode != null) { printNodeInfoRecursive(childNode, indent + " "); } } } private class PrintNodeInfoFunction extends Function { @Override public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { printNodeInfo(); return null; } } } ``` 然后在你的 Rhino 脚本中,可以这样调用: ``` service.requestAccessibilityPermission(); service.printNodeInfo(); ``` 这将会请求无障碍权限,并打印出当前活动窗口的节点信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值