shell脚本 - 如何使用gksudo只用一个密码提示执行连续的sudo操作?

时间:2012-05-06 11:12:42

标签: shell sudo gksudo

我想使用sudo在ad-hoc基础上安装两个独立的网络驱动器,因为我的NAS设备并不总是在线,所以我不相信在/ etc / fstab中添加任何东西是必要的。

以下代码能够实现这一点,但我不打算从终端运行脚本,因此sudo密码提示是我的问题:

#!/bin/sh

sudo mount -t cifs //10.1.1.9/Volume_1 /media/DNS323-A -ousername=user,password=pass,iocharset=utf8
sudo mount -t cifs //10.1.1.9/Volume_2 /media/DNS323-B -ousername=user,password=pass,iocharset=utf8

我需要选择“在终端中运行”才能从文件浏览器窗口成功运行该脚本。因此我更喜欢使用gksudo,这将打开一个提示窗口,让我输入sudo密码。

但是,如果我改为使用以下代码,我必须输入两次sudo密码!

gksudo "mount -t cifs //10.1.1.9/Volume_1 /media/DNS323-A -ousername=user,password=pass,iocharset=utf8"
gksudo "mount -t cifs //10.1.1.9/Volume_2 /media/DNS323-B -ousername=user,password=pass,iocharset=utf8"

此时我试图变得聪明并使用gksudo选项“以sudo身份运行”,如下所示, 但是,只有第一个驱动器像上面的第一个脚本一样安装,如果没有从终端运行,则会无声地失败:

gksudo -S "mount -t cifs //10.1.1.9/Volume_1 /media/DNS323-A -ousername=user,password=pass,iocharset=utf8"
sudo "mount -t cifs //10.1.1.9/Volume_2 /media/DNS323-B -ousername=user,password=pass,iocharset=utf8"

我真正希望能做的是以下内容,但我不确定是否可能:

gksudo this{
command1
command2
command3
}

这只是我还是gksudo记忆短暂?

2 个答案:

答案 0 :(得分:5)

这是一个脚本,所以最好的方法是不要在脚本中使用sudo / gksudo命令,而是使用sudo调用脚本。

我认为gksudo本身没有任何记忆,这就是在后台使用的所有sudo

另一种可能是使用:

gksudo "sh -c 'command1; command2; ...'"

但那不是很优雅。

答案 1 :(得分:0)

我经常使用它来确保用户运行我的脚本" root" - 从记忆中回忆起来,所以我可能会有一些事情发生转变。

#!/usr/bin/env

main() {
    # Code to be executed
}

if [[ "$0" == "${BASH_SOURCE[0]}" ]]; then
    [[ $EUID != 0 ]] && exec sudo "$0" $*
    main $*
fi