[SOLVED]How to execute script with sudo using session and startup?

Message
Author
User avatar
acecombat2
Posts: 12
Joined: Sun Sep 01, 2019 2:22 pm

[SOLVED]How to execute script with sudo using session and startup?

#1 Post by acecombat2 »

Good Morning,

I need help regarding auto start vm workstation application with running a particular vm machine using script. on login.

Code: Select all

#!/usr/bin/env bash

### BEGIN INIT INFO
# Provides: vmwareautostart
# Required-Start: $vmware $network $syslog
# Required-Stop: $vmware $network $syslog
# X-Start-Before:
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: This service auto-starts and stops VMware guests
### END INIT INFO

# To use this script, follow installation instructions at
# http://www.atrixnet.com/autostart-vmware-virtual-machines-on-boot-in-linux
# ...and then customize it below

# ======== USER CONFIGURABLE VARIABLES (CUSTOMIZE THESE PLEASE) ==========

# unless you have weird characters or shell escapes in your varable values
# there is no need to muddy up the shell code by using excessive quotes
# and punctuation.  For this reason, you'll see the example variable values
# below are simple and clean.  Don't put spaces between variables, values,
# and equal signs (=).  You can't do that in shell scripts.

# number of seconds to wait between startup of multiple VMs.  The faster
# your disk storage, the lower this number can be.  The idea is to not
# start more VMs at one time than your system can handle and still
# remain stable/responsive

VM_wait_between=30

# max number of seconds to wait for a virtual machine to gracefully shut
# down before taking it down hard.  Allow more time for app servers and
# windows virtual machines.

VM_max_stop_wait=30

# name the system user who runs your virtual machines.  you should not be
# running virtual machines as root, in the event that one gets compromised
# that could be a security liability.  I recommend that you consider
# creating an unprivileged system account that does nothing else but run
# virtual machines in vmware

VM_user=user

# list your virtual machines below, with each on its own line within the
# perenthesis block, as shown.  Make sure each VM is a fully-qualified
# path to the .vmx file for the virtual machine you want to auto-start

VM_list=(
   /media/Storage_OMV/virtualdirectory/Windows10x64/Windows10x64.vmx
);

# ======== THE REST OF THIS CODE IS NOT CONFIGURABLE ==========

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

if [[ $( id -u ) -ne 0 ]];
then
   echo You must run this script as root or with sudo

   exit 1
fi
if [[ "$( getent passwd $VM_user )" == "" ]];
then
   echo Could not locate specified VM user "'$VM_user'" on the system.  Abort.

   exit 1
fi

VM_user_group=$( id -gn $VM_user );

VM_cmd_exec="sudo -u $VM_user -g $VM_user_group vmrun"

case "$1"
in
   start)
      VM_iter=0
      VM_list_length=${#VM_list[@]};

      for vm in "${VM_list[@]}";
      do
         if [[ $( vmrun list 2>/dev/null | grep $vm | wc -l ) -ne 0 ]];
         then
            echo VM "$vm" is already running

            continue;
         fi

         echo Starting up VM "$vm" ...

         $VM_cmd_exec start "$vm" nogui >/dev/null 2>&1

         VM_iter=$(( $VM_iter + 1 ));

         if [[ $VM_iter -lt $VM_list_length ]];
         then
            echo -n ...waiting $VM_wait_between seconds before starting next VM

            for tick in $( seq 1 $VM_wait_between );
            do
               echo -n .

               sleep 1
            done

            echo
         fi
      done

      $0 status
   ;;

   stop)
      for vm in "${VM_list[@]}";
      do

         if [[ $( vmrun list 2>/dev/null | grep "$vm" | wc -l ) -eq 0 ]];
         then
            echo VM "$vm" is not running

            continue;
         fi
         echo Stopping "$vm"...

         $VM_cmd_exec stop "$vm" soft >/dev/null 2>&1 &

         VM_stop_pid=$!

         VM_stop_waited=0;

         echo -n ...Waiting $VM_max_stop_wait seconds for it to stop

         while kill -0 $VM_stop_pid >/dev/null 2>&1 ;
         do
            echo -n .

            sleep 1

            VM_stop_waited=$(( $VM_stop_waited + 1 ));

            if [[ $VM_stop_waited -gt $VM_max_stop_wait ]];
            then
               echo
               echo -n ...Timeout reached while waiting for graceful shutdown.
               echo -n Hard shutdown forced...

               $VM_cmd_exec stop "$vm" hard >/dev/null 2>&1;
            fi
         done

         echo
         echo ...VM "$vm" stopped.
      done

      $0 status
   ;;

   status)
      $VM_cmd_exec list
   ;;

   restart)
      $0 stop && $0 start
   ;;

   *)
      echo Usage: $0 '{start|stop|status|restart}'

      exit 1
   ;;

esac

# vim: set ft=sh :
The script works fine when execute via terminal which asking for user password when using sudo.

I'm stuck since the command I've searched via google search won't work.

The behavior I'm seeing as soon as the command execute within session and startup it immediately exit. :confused:

Code: Select all

echo mypassword | sudo -S /home/user/Documents/Apps/vmautostart.sh start
can anyone help me point the right direction? I can't find any similar use case from search engine.
Last edited by acecombat2 on Sun Jan 19, 2020 2:40 am, edited 1 time in total.

User avatar
JayM
Posts: 6796
Joined: Tue Jan 08, 2019 3:47 am

Re: How to execute script with sudo using session and startup?

#2 Post by JayM »

I don't know whether it may lead to a possible security issue but I found this site via searching the web (using Duckduckgo) for the keywords

Code: Select all

auto run command as sudo
https://linuxize.com/post/how-to-run-su ... -password/
What you would need to do is edit /etc/sudoers using visudo and set up sudo so just your script can be run without requiring your password, but passwords are still required for everything else.

EDIT: even better, edit /etc/sudoers.d/antixers as root and add the information there rather than editing /etc/sudoers. There are already several instances of commands that can run without password entry being required within that antixers file. Just add your script to them.
Please read the Forum Rules, How To Ask For Help, How to Break Your System and Don't Break Debian. Always include your full Quick System Info (QSI) with each and every new help request.

User avatar
dolphin_oracle
Developer
Posts: 22265
Joined: Sun Dec 16, 2007 12:17 pm

Re: How to execute script with sudo using session and startup?

#3 Post by dolphin_oracle »

that looks like a sysVinit script.

have you tried enabling the init script at bootup?

Code: Select all

sudo update-rc.d path_to_init_script defaults
by convention init scripts are usually kept in /etc/init.d
http://www.youtube.com/runwiththedolphin
lenovo ThinkPad X1 Extreme Gen 4 - MX-23
FYI: mx "test" repo is not the same thing as debian testing repo.

User avatar
acecombat2
Posts: 12
Joined: Sun Sep 01, 2019 2:22 pm

Re: How to execute script with sudo using session and startup?

#4 Post by acecombat2 »

dolphin_oracle wrote: Sat Jan 18, 2020 10:42 pm that looks like a sysVinit script.

have you tried enabling the init script at bootup?

Code: Select all

sudo update-rc.d path_to_init_script defaults
by convention init scripts are usually kept in /etc/init.d
am using systemd as default init system. Due to installation of jellyfin. Thus, looking for alternative like session and startup.

I'm going to try JayM suggestion.

User avatar
acecombat2
Posts: 12
Joined: Sun Sep 01, 2019 2:22 pm

Re: [SOLVED]How to execute script with sudo using session and startup?

#5 Post by acecombat2 »

JayM Suggestion works except ended up follow the tutorial link create own sudoer.d file.

Don't want to mess with antixxers file.

Then proceed create start up command using session and startup normally without password

Code: Select all

sudo /path/to/script start
Thanks JayM & dolphin_oracle

User avatar
JayM
Posts: 6796
Joined: Tue Jan 08, 2019 3:47 am

Re: [SOLVED]How to execute script with sudo using session and startup?

#6 Post by JayM »

I didn't think of creating a new file in /.etc/sudoers.d. Good job!
Please read the Forum Rules, How To Ask For Help, How to Break Your System and Don't Break Debian. Always include your full Quick System Info (QSI) with each and every new help request.

User avatar
Head_on_a_Stick
Posts: 919
Joined: Sun Mar 17, 2019 3:37 pm

Re: [SOLVED]How to execute script with sudo using session and startup?

#7 Post by Head_on_a_Stick »

Less hacky solution: http://0pointer.de/blog/projects/system ... ins-3.html ← convert the init script to a unit file.
mod note: Signature removed, please read the forum rules

User avatar
fehlix
Developer
Posts: 12702
Joined: Wed Apr 11, 2018 5:09 pm

Re: [SOLVED]How to execute script with sudo using session and startup?

#8 Post by fehlix »

Head_on_a_Stick wrote: Sun Jan 19, 2020 5:57 am Less hacky solution: http://0pointer.de/blog/projects/system ... ins-3.html ← convert the init script to a unit file.
IIRC, in MX-19 installed init.d scripts will automatically generated and setup systemd service files.

User avatar
Head_on_a_Stick
Posts: 919
Joined: Sun Mar 17, 2019 3:37 pm

Re: [SOLVED]How to execute script with sudo using session and startup?

#9 Post by Head_on_a_Stick »

fehlix wrote: Sun Jan 19, 2020 6:48 am in MX-19 installed init.d scripts will automatically generated and setup systemd service files.
Yes, the adherence to LSB should allow the init script to be used natively even with systemd as PID1.
mod note: Signature removed, please read the forum rules

User avatar
acecombat2
Posts: 12
Joined: Sun Sep 01, 2019 2:22 pm

Re: How to execute script with sudo using session and startup?

#10 Post by acecombat2 »

dolphin_oracle wrote: Sat Jan 18, 2020 10:42 pm that looks like a sysVinit script.

have you tried enabling the init script at bootup?

Code: Select all

sudo update-rc.d path_to_init_script defaults
by convention init scripts are usually kept in /etc/init.d
fehlix wrote: Sun Jan 19, 2020 6:48 am
Head_on_a_Stick wrote: Sun Jan 19, 2020 5:57 am Less hacky solution: http://0pointer.de/blog/projects/system ... ins-3.html ← convert the init script to a unit file.
IIRC, in MX-19 installed init.d scripts will automatically generated and setup systemd service files.
If I understood correctly, following dolphin_oracle instruction automatically the script will run as part of systemd boot sequence? I'm still in learning curve albeit, slowly.

Post Reply

Return to “Software / Configuration”