Changing to root user inside shell script

后端 未结 5 1342
不思量自难忘°
不思量自难忘° 2021-01-03 21:13

I have a shell script which needs non-root user account to run certain commands and then change the user to root to run the rest of the script. I am using SUSE11. I have use

相关标签:
5条回答
  • 2021-01-03 21:44

    Short version: create a block to enclose all commands to be run as root.

    For example, I created a script to run a command from a root subdirectory, the segment goes like this:

    sudo su - <<EOF
    cd rootSubFolder/subfolder
    ./commandtoRun
    EOF
    
    0 讨论(0)
  • 2021-01-03 21:49

    There is an easy way to do it without a second script. Just put this at the start of your file:

    if [ "$(whoami)" != "root" ]
    then
        sudo su -s "$0"
        exit
    fi
    

    Then it will automatically run itself as root. Of course, this assumes that you can sudo su without having to provide a password - but that's out of scope of this answer; see one of the other questions about using sudo in shell scripts for how to do that.

    0 讨论(0)
  • 2021-01-03 21:52

    sudo will work here but you need to change you script a little bit:

    $ cat 1.sh 
    id 
    sudo -s <<EOF
    echo Now i am root
    id
    echo "yes!"
    EOF
    
    $ bash 1.sh
    uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
    Now i am root
    uid=0(root) gid=0(root) groups=0(root)
    yes!
    

    You need to run your command in <<EOF block and give the block to sudo.

    If you want, you can use su, of course. But you need to run it using expect/pexpect that will enter password for you.

    But even case you could manage to enter the password automatically (or switch it off) this construction would not work:

    user-command
    su 
    root-command
    

    In this case root-command will be executed with user, not with root privileges, because it will be executed after su will be finished (su opens a new shell, not changes uid of the current shell). You can use the same trick here of course:

    su -c 'sh -s' <<EOF
    # list of root commands
    EOF
    

    But now you have the same as with sudo.

    0 讨论(0)
  • 2021-01-03 21:54

    Also, note that if you are changing to "root" user inside a shell script like below one, few Linux utilities like awk for data extraction or defining even a simple shell variable etc will behave weirdly.

    To resolve this simply quote the whole document by using <<'EOF' in place of EOF.

    sudo -i <<'EOF'
    ls
    echo "I am root now"
    EOF
    
    0 讨论(0)
  • 2021-01-03 21:57

    The easiest way to do that would be to create a least two scripts.

    The first one should call the second one with root privileges. So every command you execute in the second script would be executed as root.

    For example:

    runasroot.sh

    sudo su-c'./scriptname.sh'
    

    scriptname.sh

    apt-get install mysql-server-5.5
    

    or whatever you need.

    0 讨论(0)
提交回复
热议问题