当此脚本由 ansible playbook 复制并运行时,为什么 doas -u 指定的用户不运行此脚本中的此命令?

当此脚本由 ansible playbook 复制并运行时,为什么 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 运行脚本时不会发生这种情况

我知道我可以通过允许非 root 登录远程主机并运行 playbook 来解​​决这个问题oumaima,如下所示ansible-playbook -u oumaima -i inventory.ini open-links.yml:让此类解决方案超出此问题的范围。我想解决将剧本运行为root.

关于主办方:与我的控制台位于同一房间、同一 LAN 上的一台笔记本电脑。控制台和远程主机上的 Ubuntu Desktop 22.04 LTS。

答案1

要使用 X11 显示器,您通常需要满足两件事:

  • 一个 Xauthority 文件(~/.Xauthority或者环境变量指向的文件XAUTHORITY),其中包含您要使用的显示的有效会话 cookie,
  • 以及DISPLAY指定您要使用的显示的环境变量。

如果您使用 X11 转发运行 SSH 会话,并且本地端在本地满足 X11 使用要求,并且远程端有xauth可用的命令,那么远程端sshd将自动为您设置这两个要求,从而显示最终将出现在您启动 SSH 客户端的本地屏幕上。

如果您远程运行 X11 程序并将其设置DISPLAY:0,则意味着您正在尝试使其在直接连接到远程系统的显示器,如果您将系统用作广告牌,这可能很有用,但可能不会立即对您可见。为了成功,远程系统应该已经与您用来运行 X11 程序的任何用户帐户建立了登录的 GUI 会话,以便 Xauthority 文件存在并且是最新的。

当 Ansible 使用 SSH 时,默认情况下它可能不会请求 X11 转发,除非您明确配置它这样做。

相关内容