如何在没有进一步用户交互的情况下使用sudo在单独的终端中运行命令

时间:2017-11-15 10:04:05

标签: bash ubuntu terminal sudo

我正在尝试自动运行多个任务,但我需要将它们作为sudo运行。

我想在不同的终端中运行它们,以便我可以观察每个终端的输出。

这是我设置的一个最小例子(因为我想要做的更复杂)

设置两个文件 - 请注意,数据只能作为root读取,并包含3行示例文本:

-rw------- 1 root    root      33 Nov 15 09:29 data
-rwxrwxrwx 1 root    root      11 Nov 15 09:30 test.sh*

test.sh看起来像:

#!/bin/bash
cat data
read -p "Press enter to continue"

我还有一个名为&#34的用户级变量; SESSION_MANAGER"这是在bash启动中设置的...这似乎会导致一些问题(参见后面的例子)

所以现在我想生成运行这个脚本的各种终端。我尝试了以下方法:

尝试1

xfce4-terminal -e './test.sh'

输出:

cat: data: Permission denied
Press enter to continue

尝试2 - 在开始时使用sudo

~/src/sandbox$ sudo xfce4-terminal -e './test.sh' 
Failed to connect to session manager: Failed to connect to the session manager: SESSION_MANAGER environment variable not defined

(xfce4-terminal:6755): IBUS-WARNING **: The owner of /home/openbts/.config/ibus/bus is not root!

输出:

this is some data
more data
end
Press enter to continue

在这里你可以看到数据文件的输出打印正常,但是我遇到了会话管理器变量的一些问题。

尝试3 - 在命令中使用sudo

~/src/sandbox$ xfce4-terminal -e 'sudo ./test.sh' 

输出:

openbts的[sudo]密码: 这是一些数据 更多数据 结束 按enter键继续

在这里你可以看到一切都很好......但是我不得不再次输入我的密码,这有点会导致我的自动化:(

尝试4 - 以root身份启动

~/src/sandbox$ sudo su
root@openbts:/home/openbts/src/sandbox# xfce4-terminal -e './test.sh'
Failed to connect to session manager: Failed to connect to the session manager: SESSION_MANAGER environment variable not defined

输出:

this is some data
more data
end
Press enter to continue

在这里,输出再次看起来不错,但我有这个SESSION_MANAGER问题...而且新的xfce4-terminal出现了混乱的字体/外观 - 我想这是root用户设置。

问题

如何在新终端中运行多个test.sh实例,而不必输入密码(或根本不进行交互)。我可以在流程开始时(在原始终端中)输入一次密码吗?

正如你所看到的那样,当我进入sudo su时我得到了这种工作,但这里的问题是SESSION_MANAGER变量 - 不确定这是否是一个问题,但看起来非常混乱,但也是xcfe4-terminal看起来很糟糕(我想我可以将root设置更改为与我的用户设置相同)。那么如何在以root身份运行时避免出现SESSION_MANAGER问题?

1 个答案:

答案 0 :(得分:1)

如果在启动单独的终端之前更改用户ID,您将看到会话管理器问题。因此解决方案是在终端中运行sudo。

您不想在sudo中键入密码。您可以通过添加

来实现
yourname ALL=(ALL) NOPASSWD: ALL

/etc/sudoers(至少在slackware上)。您还可以尝试将文件的权限设置为正确,这样您就不会一直需要root。

请注意,添加该行会产生安全隐患;您可能只想允许cat没有密码(在您的示例中),或者为sudo制定更详细的规则。我给出的这一行只是一个例子。就个人而言,我会查看文件权限。