몇 가지 문제점을 발견했습니다http://unix.stackexchange.com& 존재하다http://stackoverflow.comudev 규칙의 시작 스크립트와 관련됩니다. 하지만 수행할 정확한 솔루션이나 구체적인 답변을 찾을 수 없습니다.불다스크립트.
그래서 저는 다음과 같은 (표준적인) 질문을 합니다.udev 규칙을 통해 Bash 스크립트를 실행/시작/실행하는 방법은 무엇입니까?
또 발견한 사실udev 규칙 작성예:
udev는 활성 터미널에서 이러한 프로그램을 실행하지 않으며 쉘 컨텍스트에서 실행하지 않습니다. 프로그램이 실행 가능한 것으로 표시되어 있는지 확인하고, 쉘 스크립트인 경우 적절한 shebang(예: #!/bin/sh)으로 시작하는지 확인하고, 터미널에 표준 출력이 표시되지 않도록 하십시오.
그래서 "달리는 방법"이 가능한지 궁금했습니다.배쉬 스크립트udev 규칙에 따르면? "
이것은 bash 스크립트를 실행하는 간단한 예입니다.
99-myrule.rules
나는 무엇보다도 다음과 같은 글을 썼습니다 /etc/udev/rules.d
:
ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"
lsusb
출력에서 공급업체와 제품 ID를 찾았습니다.
$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade
zenity --info
내 펜 드라이브(위에 나열된 SanDisk)가 연결된 동안 실험적인 명령을 실행하고 싶습니다 .
그래서 나는 /home/pandya/example.sh
(udev 규칙에서 호출되는 RUN+=
) contians를 작성했습니다:
#!/bin/bash
zenity --info &
exit
그러나 이 스크립트는 실행되지 않습니다(실행 권한이 있음에도 불구하고). 또한 다음을 시도했습니다.
export DISPLAY=:0
이전 스크립트에서zenity --info
bash -c 'DISPLAY=:0 zenity --info
그리고 물론:
sudo restart udev
sudo udevadm control --reload-rules
하지만 출력을 얻을 수 없습니다 zenity --info
.
그러므로udev 규칙을 통해 Bash 스크립트를 실행하는 방법은 무엇입니까? 혹시 빠진 것이 있으면 제안해 주세요.
답변1
대부분의 경우 명령이 실행 중이지만 출력을 표시할 위치를 알 수 없습니다. 나는 당신이 루트가 아닌 사용자를 사용하여 X에 로그인하고 있고 규칙이 루트로 실행될 가능성이 높다고 가정합니다. 다음 명령을 시도해 보십시오:
su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'
실행을 위해배쉬 스크립트다음 명령을 따르십시오.
su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'
답변2
나는 최근에 발견했다우아한 방법DISPLAY에 대해 걱정하지 않고 udev 규칙에서 GUI 또는 X 작업을 표시합니다. 사용되는 쉘 스크립트의 경우 원칙은 동일합니다 export
.
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
:현재 tty 사용자가 X를 시작하면, 그렇지 않으면 삭제합니다.뿌리.
답변3
이 글을 읽는 다른 분들에게 말씀드리자면, 제가 Kali Linux 2016에서 스크립트를 실행할 수 있는 유일한 방법은 다음과 같습니다.
#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'