Handle case where become script is unreadable.
authorIain Patterson <me@iain.cx>
Tue, 26 Apr 2016 16:28:03 +0000 (17:28 +0100)
committerIain Patterson <me@iain.cx>
Tue, 24 May 2016 09:15:24 +0000 (10:15 +0100)
If the profile directory is not accessible to the target user it won't
be possible to run became.

Use the -d flag to specify an alternative directory in which became can
be found.

opt/bin/become

index 4b1c0dc..ea4926d 100755 (executable)
@@ -3,21 +3,29 @@
 chdir=0
 kerberos=0
 x11=0
-while getopts ":kx" opt; do
+dir=
+while getopts ":cd:kx" opt; do
   case $opt in
     c) chdir=1;;
+    d) dir=$OPTARG;;
     k) kerberos=1;;
     x) x11=1;;
   esac
 done
 shift $((OPTIND-1))
 
+if [ -z "$dir" ]; then
+  dir=${0%/*}
+  [ "$dir" = "$0" -o "$dir" = "." ] && dir=$PWD
+fi
+
 user="$1"; shift
 if [ -z "$user" ]; then
-  echo >&2 "Usage: become [-c] [-k] [-x] <user>"
-  echo >&2 "Options: -c   Stay in current directory even if target user is not root."
-  echo >&2 "         -k   Delegate Kerberos credentials even if target user is not root."
-  echo >&2 "         -x   Delegate X11 cookie even if target user is not root."
+  echo >&2 "Usage: become [-c] [-d <dir>] [-k] [-x] <user>"
+  echo >&2 "Options: -c         Stay in current directory even if target user is not root."
+  echo >&2 "         -d <dir>   Look for \"became\" script in given directory."
+  echo >&2 "         -k         Delegate Kerberos credentials even if target user is not root."
+  echo >&2 "         -x         Delegate X11 cookie even if target user is not root."
   exit 1
 fi
 
@@ -129,7 +137,5 @@ done
 [ $chdir = 1 ] && echo >&3 2>/dev/null "cd - &>/dev/null"
 
 exec 3>&-
-dir=$(dirname "$0")
-[ "$dir" = "." ] && dir="$PWD"
 exec sudo -H -u "$user" "$dir/became"
 exit 111