如何使脚本以root身份运行命令

时间:2015-03-24 02:42:46

标签: linux bash shell ubuntu

我是Ubuntu和bash脚本的新手,但我刚刚制作了runUpdates.sh并将其添加到我的.profile来运行它:

if [ -f "$HOME/bin/runUpdates.sh" ]; then
    . "$HOME/bin/runUpdates.sh"
fi

我遇到的问题是,我希望脚本像root运行一样运行(因为我不想输入我的sudo密码)

我找到了一些我可以做sudo chown root.root <my script>sudo chmod 4755 <my script>的地方,当我运行它时,它应该以root身份运行。但它不是......

脚本对我来说很好看。我错过了什么? -rwxr-xr-x 1 root root 851 Mar 23 21:14 runUpdates.sh*

请帮我以root身份运行此脚本中的命令?我真的不想更改sudors文件,我真的只想在root下运行这个脚本中的命令(如果可能的话)。

#!/bin/sh

echo "user is ${USER}"

#check for updates
update=`cat /var/lib/update-notifier/updates-available | head -c 2 | tail -c 1`;
if [ "$update" = "0" ]; then
        echo -e "No updates found.\n";
else
        read -p "Do you wish to install updates? [yN] " yn
        if [ "$yn" != "y" ] && [ "$yn" != "Y" ]; then
                echo -e 'No\n';
        else
                echo "Please wait...";
                echo `sudo apt-get update`;
                echo `sudo apt-get upgrade`;
                echo `sudo apt-get dist-upgrade`;
                echo -e "Done!\n";
        fi
fi

#check for restart
restartFile=`/usr/lib/update-notifier/update-motd-reboot-required`;
if [ ! -z "$restartFile" ]; then
        echo "$restartFile";
        read -p "Do you wish to REBOOT? [yN] " yn
        if [ "$yn" != "y" ] && [ "$yn" != "Y" ]; then
                echo -e 'No\n';
        else
                echo `sudo shutdown -r now`;
        fi
fi

我添加的用户是调试,它总是输出我的用户而不是root,并提示输入sudo密码(因为我用sudo调用命令)或者告诉我你是root用户吗? (如果我删除sudo)

另外,有没有办法实时输出更新命令stdout,而不是只有一个块完成后输出?

(我也尝试将shebang作为#!/bin/bash

2 个答案:

答案 0 :(得分:6)

出于安全原因,

setuid不适用于shell脚本。如果您想在没有密码的情况下以root身份运行脚本,则可以编辑/etc/sudoers以允许其在没有密码的情况下使用sudo运行。

要“实时更新”,您可以直接运行命令,而不是使用echo。

答案 1 :(得分:5)

它不安全,你应该使用sudoers但是如果你真的需要/想要,你可以用这样的东西来做:

echo <root password> | sudo -S echo -n 2>/dev/random 1>/dev/random
sudo <command> 

这是有效的,因为sudo在成功使用后不需要短暂窗口的密码。

很多年前,如果您真的想以root身份运行脚本,需要将它们包装在可执行文件中,那么SUID根脚本将被逐步淘汰,您可以在我的博客上看到如何执行此操作的示例: http://scriptsandoneliners.blogspot.com/2015/01/sanitizing-dangerous-yet-useful-commands.html

示例是如何使用shell脚本更改可执行权限并在其他可执行文件周围放置过滤器,但包装shell脚本的概念也适用于SUID,从shell脚本生成的可执行文件可以成为SUID。

https://help.ubuntu.com/community/Sudoers