이 스크립트가 ansible 플레이북에 의해 복사되고 실행될 때 doas -u로 지정된 사용자가 이 스크립트에서 이 명령을 실행하지 않는 이유는 무엇입니까?

이 스크립트가 ansible 플레이북에 의해 복사되고 실행될 때 doas -u로 지정된 사용자가 이 스크립트에서 이 명령을 실행하지 않는 이유는 무엇입니까?

나는 open-links.yml원격 호스트 중 하나에서 실행되도록 설계된 간단한 스크립트를 작성했습니다.

- name: Run Bash script
  hosts: myhosts
  gather_facts: false
  vars:
    au: "j"
  tasks:
    - name: Copy and run a script that opens a link
      script: /home/{{ au }}/CS/SoftwareDevelopment/MySoftware/Bash/ansible/open-links.sh

open-links.sh브라우저에서 링크를 여는 스크립트입니다.

#!/usr/bin/bash


# Link to open
link_to_open="https://calendar.google.com/calendar/u/0/r"


doas -u oumaima echo "From ${0}, $(whoami): It works, doesn't it"|tee ~/debug.log
doas -u oumaima brave-browser "${link_to_open}" > /dev/null 2>&1 &
#doas -u oumaima DISPLAY=:0 brave-browser "${link_to_open}" > /dev/null 2>&1 &
#doas -u oumaima DISPLAY=:0.0 brave-browser ${link_to_open} > /dev/null 2>&1 &
#neither of these two work, whatever the value of DISPLAY


실행하면 ansible-playbook -u root -i inventory.ini open-links.yml다음과 같은 출력이 제공되지만

PLAY [Run Bash script] **********************************************************************************

TASK [Copy and run a script that opens a link] ***********************************************************
changed: [fe80::cc08:9465:8dba:15a9%wlp4s0]

PLAY RECAP **********************************************************************************************
fe80::cc08:9465:8dba:15a9%wlp4s0 : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

링크가 열리지 않았습니다. 위치 debug.log는 이고 /root/내용은 From /root/.ansible/tmp/ansible-tmp-1702325377.165474-2513875-125933755232488/open-links.sh, root: It works, doesn't it이며 실제로 어떤 링크라도 열리면 아마도 그런 일이 일어날 것이라는 사실이 모두 나에게 알려줍니다 root. SSH를 사용하여 원격 호스트에 로그인하고 수동으로 실행할 때

link_to_open="https://calendar.google.com/calendar/u/0/r"
doas -u oumaima brave-browser "${link_to_open}" > /dev/null 2>&1 &

그러면 브라우저는 사용자에게 지정된 링크를 엽니다 oumaima. 원격 호스트가 같은 방에 있고 사용자 계정에서 브라우저를 볼 수 있기 때문에 링크가 열려 있다는 것을 알고 있습니다 oumaima.oumaima GUI에서 발생하는 일을 내 제어 스테이션으로 전달하는 것은 내가 원하는 것이 아니며 이 질문의 범위를 벗어납니다.링크를 열어보고 싶습니다. ansible-playbook -u root -i Inventory.ini open-links.yml을 사용하여 스크립트를 실행할 때 왜 이런 일이 발생하지 않습니까?

원격 호스트에 대한 루트가 아닌 로그인을 허용하고 oumaima다음과 같이 플레이북을 실행하면 이 문제를 해결할 수 있다는 것을 알고 있습니다 ansible-playbook -u oumaima -i inventory.ini open-links.yml. 이러한 솔루션은 이 질문의 범위를 벗어납니다. 플레이북을 root.

주최자 소개: 내 콘솔과 같은 방, 같은 LAN에 있는 노트북. 콘솔 및 원격 호스트의 Ubuntu Desktop 22.04 LTS.

답변1

X11 모니터를 사용하려면 일반적으로 두 가지가 필요합니다.

  • 사용하려는 디스플레이에 대한 유효한 세션 쿠키가 포함된 Xauthority 파일( ~/.Xauthority또는 환경 변수가 가리키는 파일 )XAUTHORITY
  • DISPLAY사용하려는 디스플레이를 지정하는 환경 변수 .

클라이언트의 로컬 화면을 사용하여 SSH 세션을 실행하는 xauth경우 .sshd

X11 프로그램을 원격으로 실행하고 다음 DISPLAY과 같이 설정하면:0원격 시스템에 직접 연결된 모니터, 이는 시스템을 광고판으로 사용하는 경우 유용할 수 있지만 즉시 표시되지 않을 수 있습니다. 성공하려면 X11 프로그램을 실행하는 데 사용하는 사용자 계정으로 원격 시스템에 로그인된 GUI 세션이 이미 설정되어 있어야 하며 Xauthority 파일이 존재하고 최신 상태여야 합니다.

Ansible이 SSH를 사용하는 경우 명시적으로 구성하지 않는 한 기본적으로 X11 전달을 요청하지 않을 수 있습니다.

관련 정보