summaryrefslogtreecommitdiffstats
path: root/support/lsh.sh
diff options
context:
space:
mode:
Diffstat (limited to 'support/lsh.sh')
-rwxr-xr-xsupport/lsh.sh37
1 files changed, 37 insertions, 0 deletions
diff --git a/support/lsh.sh b/support/lsh.sh
new file mode 100755
index 0000000..db03422
--- /dev/null
+++ b/support/lsh.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# This script can be used as a "remote shell" command that is only
+# capable of pretending to connect to "localhost". This is useful
+# for testing or for running a local copy where the sender and the
+# receiver needs to use different options (e.g. --fake-super). If
+# we get a -l USER option, we try to use "sudo -u USER" to run the
+# command. Supports only the hostnames "localhost" and "lh", with
+# the latter implying the --no-cd option.
+
+user=''
+do_cd=y # Default path is user's home dir (just like ssh) unless host is "lh".
+
+while : ; do
+ case "$1" in
+ -l) user="$2"; shift; shift ;;
+ -l*) user=`echo "$1" | sed 's/^-l//'`; shift ;;
+ --no-cd) do_cd=n; shift ;;
+ -*) shift ;;
+ localhost) shift; break ;;
+ lh) do_cd=n; shift; break ;;
+ *) echo "lsh: unable to connect to host $1" 1>&2; exit 1 ;;
+ esac
+done
+
+if [ "$user" ]; then
+ prefix=''
+ if [ $do_cd = y ]; then
+ home=`perl -e "print((getpwnam('$user'))[7])"`
+ prefix="cd '$home' &&"
+ fi
+ sudo -H -u "$user" sh -c "$prefix $*"
+else
+ if [ $do_cd = y ]; then
+ cd || exit 1
+ fi
+ eval "${@}"
+fi