이 xdotool
명령을 사용하면 시스템의 그래픽 사용자 인터페이스를 제어하는 스크립트를 매우 쉽게 만들 수 있습니다. 예를 들어 다음 명령을 실행하면 다음 데스크톱에서 Chrome 브라우저를 열 수 있습니다 xdotool mousemove 26 146 click 1
.
이제 내 시스템에 대한 새 사용자를 생성한다고 가정해 보겠습니다.
# adduser newuser
newuser
다른 세션 에 로그인하여 xdotool
명령을 실행하면 제대로 작동합니다. 그러나 서로 다른 tty에 두 개의 서로 다른 GUI 세션이 열려 있고 그 중 하나가 내 세션과 다르다고 가정해 보겠습니다.일반 사용자및 기타 관련새로운 사용자, 그리고 우리는 또한 내가 그렇다고 말할 수 있습니다현재 실행 중내 GUI를 사용한 세션일반 사용자다음 스크립트를 만듭니다.
#!/bin/bash
xdotool mousemove 31 61 click 1
macro.bash
그런 다음 이를 내 홈 폴더에 저장 하고 chmod 777 ~/macro.bash
올바른 권한을 설정하기 위해 실행했습니다. 마지막으로 새 터미널을 열고 다음과 같이 로그인합니다 newuser
(현재 일반 사용자 세션을 사용 중인 경우).
$ su newuser
이제 스크립트를 실행하려고 하면 다음 오류가 발생합니다(편집 참조).
newuser@myPC:~$ /home/myregularuser/macro.bash
No protocol specified
Error: Can't open display: (null)
Failed creating new xdo instance
newuser로 기록된 GUI 세션을 실행하는 동안 스크립트를 실행하려고 하면 스크립트는 제대로 작동하지만내 목표는 일반 사용자 세션을 사용하는 동안 스크립트에서 새 사용자 세션의 그래픽 인터페이스를 제어할 수 있는 매크로 도구를 갖는 것입니다..가능합니까? 이 오류를 해결하는 해결 방법을 아는 사람이 있나요?
편집하다
~처럼비현실적인댓글에서 말했다통신회사그의 대답에는 $DISPLAY
환경 변수 및 $XAUTHORITY
. telcoM의 답변에 설명된 대로 문제를 해결하지는 못했지만 다음 프로세스를 통해 문제를 해결했습니다.
1- 내 newuser
세션에 로그인합니다.
2- 파일의 마지막 줄에 다음 명령을 삽입하십시오 ~/.bashrc
.
if xhost >& /dev/null; then
echo "export DISPLAY=\"$DISPLAY\"" > $HOME/.variableMemory
echo "export XAUTHORITY=\"$XAUTHORITY\"" >> $HOME/.variableMemory
fi
$DISPLAY
3- 스크립트가 실행될 때 및 변수를 올바른 값으로 재정의 하도록 스크립트를 변경합니다 .$XAUTHORITY
#!/bin/bash
source $HOME/.variableMemory
xdotool mousemove 31 61 click 1
이를 통해 그래픽 인터페이스를 사용하여 newuser 세션에 처음 로그인할 때 기본적으로 $DISPLAY
및 변수의 값을 캡처하여 저장하여 나중에 쉘을 사용하여 로그인할 때 사용할 수 있도록 합니다.$AUTHORITY
이제 오류가 표시되지 않으며 xdotool
스크립트를 실행할 때 명령을 사용하여 다른 세션에서 마우스를 완벽하게 움직일 수 있지만 새로운 문제가 있습니다.다른 GUI 세션에 있는 Xorg는 사용하지 않을 때 정지됩니다.. 전체적으로, 내가 보내는 모든 클릭을 대기열에 추가한 다음 수동으로 특정 GUI 세션으로 전환하면( xdotool
사용할 수 없게 됨) 모든 클릭을 즉시 해제합니다... 따라서 문제는 남아 있습니다.다른 GUI 세션을 실행할 때 매크로 도구를 사용하여 GUI 세션을 제어할 수 있습니까? 세션을 사용하지 않는 경우에도 실시간으로 클릭 명령을 받을 수 있도록 이 "정지 동작"을 비활성화할 수 있는 Xorg 구성이 있습니까?
추가 정보
- 우분투 18.04를 실행 중입니다.
- 사용된 디스플레이 서버는 Xorg입니다(Wayland xdotool을 사용하면 전혀 작동하지 않지만 이 질문은 Wayland와 관련이 없습니다).
- 그놈은 제가 현재 사용하는 GUI입니다.
- 나의 주요 목표는 매크로 도구를 사용하여 실제로 사용하지 않는 화면을 제어함으로써 매크로가 작업을 수행하는 동안 컴퓨터를 사용할 수 있도록 하는 것입니다. 이 문제를 해결하기 위해 xdotool, Ubuntu, Xorg 및 GNOME을 선택했지만 다른 도구, 데스크톱 환경, 심지어 다른 Linux 배포판을 사용하여 동일한 문제를 해결하는 답변도 열려 있습니다... 감사합니다!
답변1
누락된 또 다른 구성 요소는 .Xauthority
파일입니다. 여기에는 X11 서버가 다시 시작될 때마다 재생성되는 "세션 쿠키"가 포함되어 있으며 클라이언트는 X11 서버에 명령을 보내기 위해 이 쿠키가 필요합니다. 파일은 일반적으로 에 있지만 환경 변수를 사용하여 대체 위치를 지정할 ~/.Xauthority
수 있습니다 .$XAUTHORITY
귀하의 것이 아닌 GUI 세션을 제어하려면 해당 다른 세션에 대한 세션 쿠키에 대한 액세스 권한을 얻어야 합니다. 값이 다른 경우에는 다음 명령을 사용하여 $DISPLAY
세션 쿠키를 파일에 복사 하면 됩니다..Xauthority
xauth extract
xauth merge
su newuser -c "xauth extract /home/newuser/.Xauthority $newuserDISPLAY" | xauth merge
.Xauthority 파일은 동시에 여러 디스플레이에 대한 여러 세션 쿠키를 저장할 수 있습니다.
또는 세션 쿠키가 이미 액세스 권한이 있는 파일에 있는 경우 이 $XAUTHORITY
변수를 사용하여 이를 가리킬 수 있습니다.
이것은 다음과 같이 보이기 시작했습니다.XY 문제xdotool
: 당신은 성취하고 싶은 것이 있고, 그것을 성취하기 위한 가정된 방식에 정착했을 수도 있습니다 .
그러나 무언가를 자동화하려고 할 때 GUI를 사용하는 것이 xdotool
가장 편리한 방법인 경우가 많습니다. 예를 들어, 특정 사용자로서 Google Chrome을 자동으로 실행하려는 경우 아이콘 클릭을 시뮬레이션할 필요가 없습니다. 올바른 ID와 환경을 정렬하고 원하는 프로세스를 실행하기만 하면 됩니다.
예를 들어 google-chrome
사용자로 시작 하려면 newuser
다음을 수행할 수 있습니다.
su -lc "DISPLAY=<whatever> google-chrome" newuser
명령 에 옵션이 su
있으므로 프로세스에는 newuser 권한이 있으므로 기본 위치에 있게 됩니다 . 즉 , Google을 원할 경우 실제로 실행 중인 GUI 세션과 일치하는 변수에 올바른 값을 제공 하기만 하면 됩니다 . Chrome에서 특정 URL을 열 수 있습니다. 이 URL은 큰따옴표 안에 매개변수로 지정할 수 있습니다.-l
google-chrome
$HOME
.Xauthority
~newuser/.Xauthority
$DISPLAY
newuser
google-chrome