【问题标题】:Run external applications using Python and call their methods inside使用 Python 运行外部应用程序并在内部调用它们的方法
【发布时间】:2021-10-17 19:42:19
【问题描述】:

祝大家阳光明媚! :D,

我有一个问题要问你们。我有以下python“脚本”:

import os    
os.system('ubuntu.exe')

这会打开在我的 WSL 上运行的 Ubuntu。现在,当 Ubuntu 终端出现时: 我想执行以下命令:sudo /etc/init.d/dbus startsudo /etc/init.d/xrdp start 使用我的 python 脚本(只是自动执行)。但是,当我运行上述命令之一时,终端会请求我的密码: 所以脚本应该也能输入密码。 有什么办法吗,怎么办?

亲切的问候, D.

【问题讨论】:

标签: python ubuntu windows-subsystem-for-linux


【解决方案1】:

虽然 cmets 中链接的 question/answers 是一个不错的读物(尤其是 sudoers),但对于 WSL,还有更好的方法。不要使用ubuntu.exe,而是使用更新的wsl.exe 替换。 wsl 命令提供了对启动的更多控制,包括能够更改用户:

import os    
os.system('wsl ~ -u root -e sh -c "nohup service xrdp start"')
os.system('wsl -u root service dbus start')

nohup 是必需的,因为这似乎是一个时间问题。通过 WSL 命令启动时,shell(拥有进程)将在 xrdp 有机会分叉之前终止。 nohup 只是确保完整的 xrdp 初始化脚本有机会在此之前运行。本质上,这确实不是 WSL 问题。如果您对 exec sh -c "sudo service xrdp start" 执行类似操作,也可以复制它。

还有一些其他注意事项。首先,这不需要密码,因为 WSL 没有“登录”的概念。 /init 进程(WSL 的 PID1 和初始化)负责为每个会话设置拥有用户。这不被视为安全风险,因为即使是根 WSL 用户也以不超过 Windows 用户的权限运行。

另外请注意,根据我的经验,没有必要为xrdp 访问启动dbus,即使我已经看到说明是这样的。当然,最终这将取决于您希望在 xrdp 会话中运行什么。

【讨论】:

  • 谢谢:D,但不确定它是否有效...当我运行脚本时,它显示“正在启动远程桌面协议服务器 [OK]”,所以没问题,但使用 Windows 远程连接到 Ubuntu不工作。为了让它工作,我需要使用 WSL 手动启动 Ubuntu 并输入上面的命令。
  • @Dandys 哦,听起来很熟悉。我知道我们在 Stack 站点之一的另一个问题中遇到了这个问题。让我找到它。相当肯定,当我找到答案时,答案对我来说是显而易见的。
  • @Dandys 好吧,我发现了这个问题,但现在我想起来了,它远非显而易见。有一种解决方法,但无论如何它都不是我最喜欢的。编辑到我的答案中。
  • @Dandys 然后想出了一个比我第一次尝试这个更好的解决方法。再次编辑。
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多