VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/runasroot.sh@ 76747

Last change on this file since 76747 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1#!/bin/sh
2# $Id: runasroot.sh 76553 2019-01-01 01:45:53Z vboxsync $
3## @file
4# VirtualBox privileged execution helper script for Linux and Solaris
5#
6
7#
8# Copyright (C) 2009-2019 Oracle Corporation
9#
10# This file is part of VirtualBox Open Source Edition (OSE), as
11# available from http://www.virtualbox.org. This file is free software;
12# you can redistribute it and/or modify it under the terms of the GNU
13# General Public License (GPL) as published by the Free Software
14# Foundation, in version 2 as it comes in the "COPYING" file of the
15# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17#
18
19# Deal with differing "which" semantics
20mywhich() {
21 which "$1" 2>/dev/null | grep -v "no $1"
22}
23
24# Get the name and execute switch for a useful terminal emulator
25#
26# Sets $gxtpath to the emulator path or empty
27# Sets $gxttitle to the "title" switch for that emulator
28# Sets $gxtexec to the "execute" switch for that emulator
29# May clobber $gtx*
30# Calls mywhich
31getxterm() {
32 # gnome-terminal uses -e differently to other emulators
33 for gxti in "konsole --title -e" "gnome-terminal --title -x" "xterm -T -e"; do
34 set $gxti
35 gxtpath="`mywhich $1`"
36 case "$gxtpath" in ?*)
37 gxttitle=$2
38 gxtexec=$3
39 return
40 ;;
41 esac
42 done
43}
44
45# Quotes its argument by inserting '\' in front of every character save
46# for 'A-Za-z0-9/'. Prints the result to stdout.
47quotify() {
48 echo "$1" | sed -e 's/\([^a-zA-Z0-9/]\)/\\\1/g'
49}
50
51ostype=`uname -s`
52if test "$ostype" != "Linux" && test "$ostype" != "SunOS" ; then
53 echo "Linux/Solaris not detected."
54 exit 1
55fi
56
57HAS_TERMINAL=""
58case "$1" in "--has-terminal")
59 shift
60 HAS_TERMINAL="yes"
61 ;;
62esac
63
64case "$#" in "2"|"3")
65 ;;
66 *)
67 echo "Usage: `basename $0` DESCRIPTION COMMAND [ADVICE]" >&2
68 echo >&2
69 echo "Attempt to execute COMMAND with root privileges, displaying DESCRIPTION if" >&2
70 echo "possible and displaying ADVICE if possible if no su(1)-like tool is available." >&2
71 exit 1
72 ;;
73esac
74
75DESCRIPTION=$1
76COMMAND=$2
77ADVICE=$3
78PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/X11/bin
79
80case "$ostype" in SunOS)
81 PATH=$PATH:/usr/sfw/bin:/usr/gnu/bin:/usr/xpg4/bin:/usr/xpg6/bin:/usr/openwin/bin:/usr/ucb
82 GKSU_SWITCHES="-au root"
83 ;;
84 *)
85 GKSU_SWITCHES=""
86 ;;
87esac
88
89case "$HAS_TERMINAL" in "")
90 case "$DISPLAY" in ?*)
91 KDESUDO="`mywhich kdesudo`"
92 case "$KDESUDO" in ?*)
93 eval "`quotify "$KDESUDO"` --comment `quotify "$DESCRIPTION"` -- $COMMAND"
94 exit
95 ;;
96 esac
97
98 KDESU="`mywhich kdesu`"
99 case "$KDESU" in ?*)
100 "$KDESU" -c "$COMMAND"
101 exit
102 ;;
103 esac
104
105 GKSU="`mywhich gksu`"
106 case "$GKSU" in ?*)
107 # Older gksu does not grok --description nor '--' and multiple args.
108 # @todo which versions do?
109 # "$GKSU" --description "$DESCRIPTION" -- "$@"
110 # Note that $GKSU_SWITCHES is NOT quoted in the following
111 "$GKSU" $GKSU_SWITCHES "$COMMAND"
112 exit
113 ;;
114 esac
115 ;;
116 esac # $DISPLAY
117 ;;
118esac # ! $HAS_TERMINAL
119
120# pkexec may work for ssh console sessions as well if the right agents
121# are installed. However it is very generic and does not allow for any
122# custom messages. Thus it comes after gksu.
123## @todo should we insist on either a display or a terminal?
124# case "$DISPLAY$HAS_TERMINAL" in ?*)
125PKEXEC="`mywhich pkexec`"
126case "$PKEXEC" in ?*)
127 eval "\"$PKEXEC\" $COMMAND"
128 exit
129 ;;
130esac
131# ;;S
132#esac
133
134case "$HAS_TERMINAL" in ?*)
135 USE_SUDO=
136 grep -q Ubuntu /etc/lsb-release 2>/dev/null && USE_SUDO=true
137 # On Ubuntu we need sudo instead of su. Assume this works, and is only
138 # needed for Ubuntu until proven wrong.
139 case $USE_SUDO in true)
140 SUDO_COMMAND="`quotify "$SUDO"` -- $COMMAND"
141 eval "$SUDO_COMMAND"
142 exit
143 ;;
144 esac
145
146 SU="`mywhich su`"
147 case "$SU" in ?*)
148 "$SU" - root -c "$COMMAND"
149 exit
150 ;;
151 esac
152 ;;
153esac
154
155# The ultimate fallback is running 'su -' within an xterm. We use the
156# title of the xterm to tell what is going on.
157case "$DISPLAY" in ?*)
158 SU="`mywhich su`"
159 case "$SU" in ?*)
160 getxterm
161 case "$gxtpath" in ?*)
162 "$gxtpath" "$gxttitle" "$DESCRIPTION - su" "$gxtexec" su - root -c "$COMMAND"
163 exit
164 ;;
165 esac
166 esac
167esac # $DISPLAY
168
169# Failure...
170case "$DISPLAY" in ?*)
171 echo "Unable to locate 'pkexec', 'gksu' or 'su+xterm'. $ADVICE" >&2
172 ;;
173 *)
174 echo "Unable to locate 'pkexec'. $ADVICE" >&2
175 ;;
176esac
177
178exit 1
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette