स्क्रिप्ट कैसे लिखें जो / sys / class / backlight / ideapad / में ब्राइट फाइल को एडिट करता है?

Dec 19 2020

मैं i3 wm का उपयोग कर रहा हूं और मुझे अपनी ब्राइटनेस फाइल मिल गई है /sys/class/backlight/ideapad/brightness

╰─$ ls -la /sys/class/backlight/ideapad/

-rw-r--r-- 1 root root 4096 Dec 18 16:55 brightness

जब मैं चमक को बदलना चाहता हूं (4 से कहूं)

sudo sh -c "echo 4 > /sys/class/backlight/ideapad/brightness"

मैं एक स्क्रिप्ट लिखना चाहूंगा जो 1 से ब्राइटनेस को बढ़ाएगा या घटाएगा और फिर उस स्क्रिप्ट को i3 wm config फाइल ( CTRL+F1उदाहरण के लिए) में कुछ मुख्य संयोजन से बाँध देगा ताकि मैं ब्राइटनेस फाइल को एडिट करने के बजाय कीज़ दबाकर ब्राइटनेस को कंट्रोल कर सकूँ मैन्युअल रूप से हर बार मैं चमक को बदलना चाहता हूं।

चूंकि इसके लिए रूट विशेषाधिकार की आवश्यकता होती है, मुझे यकीन नहीं है कि इसे कैसे प्राप्त किया जाए। क्या मुझे अपना उपयोगकर्ता brightnessफ़ाइल के स्वामी के रूप में बदलना चाहिए या क्या मुझे फ़ाइल का समूह बदलना चाहिए? या किसी अन्य तरीके से आप सोच सकते हैं?

जवाब

1 Quasímodo Dec 19 2020 at 19:30

/sysएक रैम आधारित वर्चुअल फाइल सिस्टम है , इसलिए इसकी फाइलों की अनुमति बदलने से रिबूट बच नहीं पाएगा।

यह सी कार्यक्रम वह समाधान है जो मैंने कुछ समय पहले लिखा है और मुझे कभी विफल नहीं किया है। इसके लिए मानक लिनक्स प्रणाली के पास कुछ भी नहीं होना चाहिए।

#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 10

int main(int argc, char **argv) {
  FILE *fp;
  char scurr[BUFSIZE];
  long new, curr, incr, min = 10;

  /* An argument with an integer increment must be supplied */
  if (argc != 2 || (incr = strtol(argv[1], NULL, 10)) == 0) { return(1); }

  /* Retrieve the current brightness and increment it in the brightness file */
  if ((fp = fopen("/sys/class/backlight/ideapad/brightness", "r+")) 
      && fgets(scurr, BUFSIZE, fp)) {
    curr = strtol(scurr, NULL, 10);
    rewind(fp);
    new = curr + incr;
    if (new < min) { new = min; }
    fprintf(fp, "%ld\n", new);
    fclose(fp);
  } else { return(2); }

  return(0);
}

इसे संकलित करें ( br.cफ़ाइल का नाम, brनिष्पादन योग्य), रूट को स्वामी बनाएं, सेट्युड बिट चालू करें और निष्पादन योग्य को अपने में कहीं रखें PATH( /usr/local/bin/यह एक विशिष्ट विकल्प है)।

cc br.c -o br
chown root br
chmod u+s  br
mv br /usr/local/bin/

अब बस क्रियान्वित करने से br -100आपकी चमक 100 कम हो जाती है।

देखें कि मैंने न्यूनतम चमक भी निर्धारित की है min = 10। यह मेरी मशीन पर काफी कम है कि एक मुश्किल से नोटिस पर है। अपनी आवश्यकताओं के अनुसार उस मूल्य को ट्वीक करें। कई लोगों के लिए भी पथ घटक intel-backlightइसके बजाय कुछ ऐसा होगा ideapad


वैकल्पिक दृष्टिकोण

सेतुनिधि brपूरे मूल अधिकार देती है। यद्यपि यह इस विशेष कार्यक्रम में कारनामों को नहीं बढ़ाता है, यदि आप बहुत सतर्क रहना चाहते हैं और इसे केवल आवश्यक निजीकरण सेट देते हैं - अर्थात्, फ़ाइल की अनुमति जाँच को बायपास करने के लिए - chownऔर उपयुक्त क्षमता सेchmod ऊपर और लाइनों को स्थानापन्न करें।

setcap cap_dac_override+ep br
1 ArkadiuszDrabczyk Dec 19 2020 at 00:45

समूह स्वामित्व बदलना आमतौर पर जाने का तरीका है, लेकिन ध्यान दें कि आपको इसे रिबूट के बाद हर बार करना होगा। ऐसा करने के लिए आर्च विकी में वर्णित स्वचालित रूप से udev नियम बनाएं :

डिफ़ॉल्ट रूप से, केवल रूट इस विधि द्वारा चमक को बदल सकता है। वीडियो समूह में उपयोगकर्ताओं को चमक को बदलने की अनुमति देने के लिए, एक udev नियम जैसे कि निम्नलिखित का उपयोग किया जा सकता है:

/etc/udev/rules.d/backlight.rules

ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", GROUP="video", MODE="0664"

यदि आप videoसमूह के सदस्य नहीं हैं, तो अपने उपयोगकर्ता को इसमें जोड़ें:

sudo gpasswd video -a $(whoami)

ध्यान दें कि आपने समूह सदस्यता जानकारी को ताज़ा करने के लिए लॉग आउट किया है और लॉग इन करें:

su -l $(whoami)

जाँच करें कि क्या आप videoid वाले समूह के सदस्य हैं , इसे कुछ इस तरह प्रिंट करना चाहिए:

$ id
uid=1000(ja) gid=100(users) groups=100(users),16(dialout),17(audio),18(video),83(plugdev),215(vboxusers),281(docker)

बेशक, आप किसी भी समूह का उपयोग कर सकते हैं जो आपका उपयोगकर्ता udev नियम का सदस्य है, जरूरी नहीं video