setpci - 编写脚本来手动更改亮度

setpci - 编写脚本来手动更改亮度

我可以使用类似的东西

setpci -s 00:02.0 F4.B=XX

将 00:02.0 替换为您的设备地址(通过 lspci | grep VGA 获得),并将 XX 替换为 00 和 FF 之间的值(FF = 100%、7F = 50% 等...),以从终端手动更改亮度(作为 root,或使用适当的 chmod)。

我希望制作一个脚本来通过按键手动更改亮度。为此,我需要获得当前状态(上面XX)为了将屏幕的当前亮度转发给脚本。

如何获取当前状态?

答案1

Xbacklight 在我的上网本上不起作用; ACPI 子系统看不到背光。不过,我已经将这两个 shell 脚本组合在一起:

brightup.sh:

#!/bin/bash
var1=`sudo setpci -s 00:02.0 f4.b | tr [:lower:] [:upper:]`;
var2=$(echo "obase=16;ibase=16;${var1} + 8" |bc)
sudo setpci -s 00:02.0 f4.b=$var2

brightdown.sh:

#!/bin/bash
var1=`sudo setpci -s 00:02.0 f4.b | tr [:lower:] [:upper:]`;
var2=$(echo "obase=16;ibase=16;${var1} - 8" |bc)
sudo setpci -s 00:02.0 f4.b=$var2

我遇到的问题是它需要 sudo。这样做的最终目标是将这两个 shell 脚本设置为作为键盘快捷键运行,因此我需要弄清楚如何设置 setpci 以便能够使用 sudo 在没有密码的情况下运行。我知道,这可能不安全,而且很混乱,但目前我没有看到任何其他选择。

另外,我为破坏这个线程而道歉,但自从我每天转回使用 Linux 以来,这些是我一直在互联网上寻找的两个脚本。

答案2

我最终制作了一些脚本来解决我的问题。

  • 我将以下三个脚本绑定到方便的按键(CTRL+ALT+PGUP 用于提高亮度,CTRL+ALT+PGDN 用于降低亮度,CTRL+ALT+HOME 用于将亮度恢复为默认值)。
  • 这些脚本需要 sudoless setpci (在查看运行 setpci 所得到的错误后,您可能可以使用一些 chmod 来避免编辑 sudoers),如下所示:

    androith ALL=(ALL) NOPASSWD: /usr/bin/setpci

  • 最后,您必须保存一个类似于 /home/androith/.scripts/brightness/state 的“状态文件”,其中仅包含一个状态(从 BF 开始就可以)。

亮度提升.sh

#!/bin/bash

# Get the stored state from file
exec < /home/androith/.scripts/brightness/state # stdin replaced by this file
read state # first line of file goes to state variable

# Increase the state, up to FF
new_state=$(echo "$[0x$state+0x10]") # in decimal
if [ "$new_state" -gt 255 ] # 255 = FF in hex
then
    echo "Already at maximal brightness."
else
    state=$(echo "obase=16; $new_state" | bc) # put into hex
    echo "Setting brightness to $state and storing state..."
    sudo setpci -s 00:02.0 F4.B=$state # passwordless sudo
    echo $state > /home/androith/.scripts/brightness/state
fi

亮度降低.sh

#!/bin/bash

# Get the stored state from file
exec < /home/androith/.scripts/brightness/state # stdin replaced by this file
read state # first line of file goes to state variable

# Decrease the state, down to FF
new_state=$(echo "$[0x$state-0x10]") # in decimal
if [ "$new_state" -lt 15 ] # 15 = 0F in hex
then
    echo "Already at minimal brightness."
else
    state=$(echo "obase=16; $new_state" | bc) # update and put into hex
    echo "Setting brightness to $state and storing state..."
    sudo setpci -s 00:02.0 F4.B=$state # passwordless sudo
    echo $state > /home/androith/.scripts/brightness/state
fi

亮度默认.sh

#!/bin/bash

# Set brightness to default value
state=AF
sudo setpci -s 00:02.0 F4.B=$state # passwordless sudo
echo $state > /home/androith/.scripts/brightness/state

答案3

有一个小程序叫xbacklight。它可以获取并设置屏幕的亮度。如果您有网络摄像头,您甚至可以让它通过拍照、获取平均亮度并相应地设置屏幕亮度来自动设置亮度。

image='/home/kim/brightness.jpeg'
streamer -c /dev/video0 -b 16 -o $image >/dev/null 2>/dev/null && \
meanline=`convert $image -colorspace gray -verbose info: | grep '^\s*mean: '`
if [[ $meanline =~ \((.*)\) ]]; then
    brightness="${BASH_REMATCH[1]}"
    brightness=`echo "$brightness * 200" | bc`
    echo $brightness
    xbacklight -set $brightness
    xbacklight
fi
rm -f "$image"

答案4

我知道这不是一种非常安全的方法..但它有效。

#!/bin/bash

password="your_password_here"

set_value_to=$(zenity --title="Brightness control" --scale --text="Adjust the     brightness value" --min-value=5 --max-value=95 --value=50)

echo $password | sudo -S setpci -s 00:02.0 f4.b=$set_value_to

相关内容