How can I execute a series of commands in a bash subshell as another user using sudo?

后端 未结 6 885
别跟我提以往
别跟我提以往 2021-01-30 10:33

I\'m writing a bash script that needs to sudo multiple commands. I can do this:

( whoami ; whoami )

but I can\'t do this:

sudo          


        
相关标签:
6条回答
  • 2021-01-30 11:09

    You can pass the commands as standard input into sudo'ed bash with a here document:

    sudo bash <<"EOF"
    whoami
    id
    EOF
    

    This way there is no need to fiddle with correct quoting, especially if you have multiple levels, e.g.:

    sudo bash <<"EOF"
    whoami
    echo $USER ~
    sudo -u apache bash <<"DOF"
    whoami
    echo $USER ~
    DOF
    EOF
    

    Produces:

    root
    root /root
    apache
    apache /usr/share/httpd
    

    (Note that you can't indent the inner terminator — it has to be alone on its line. If you want to use indentation in a here document, you can use <<- instead of <<, but then you must indent with tabs, not spaces.)

    0 讨论(0)
  • 2021-01-30 11:13

    sudo only asks for your passwd the first time.The passwd answered is valid for about 5 minutes by default.You can change this value as this told.So just worry about the passwd prompt at the beginning of your script,then you can use sudo through out. changing Defaults:user_name timestamp_timeout's value to -1 may be a security hole on your system.

    0 讨论(0)
  • 2021-01-30 11:15

    If you would like to get syntax highlighting from your editor, not use quotes around your code, and have proper indentation, you can write your commands in a function and send it to bash using the declare command:

    function run_as_root() {
        whoami
        id
        echo $USER
    }
    
    sudo bash -c "$(declare -f run_as_root); run_as_root"
    
    0 讨论(0)
  • 2021-01-30 11:22

    The Brackets means that execute the command in a new bash.It execute the command with the interval of semicolon.Just use the code below instead.

    (sudo whoami;sudo whoami)
    

    BYW:the space is not necessary when using '()'.

    0 讨论(0)
  • 2021-01-30 11:27

    Run a shell inside sudo: sudo bash -c 'whoami; whoami'

    You can use any character except ' itself inside the single quotes. If you really want to have a single quote in that command, use '\'' (which technically is: end single-quote literal, literal ' character, start single-quoted literal; but effectively this is a way to inject a single quote in a single-quoted literal string).

    0 讨论(0)
  • 2021-01-30 11:29

    for example try this, I tested it:

    sudo bash -c "cd /;ls;ls|grep o"
    

    In this example you first change dir to /root, next list root directory and finally for root directory filter only directories having name with letter 'o'.

    But i thing better way is writting script that do all you need and give exitcode for all complex action. Then you can sudo script instead group of single commands like example above.

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