VirtualBox

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

Last change on this file since 96407 was 96407, checked in by vboxsync, 2 years ago

scm copyright and license note update

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