#!/bin/bash # Put this somewhere in your $PATH and execute w/o args once. # For sps it may be convenient to run spa and spd in sudo w/o pwd. p1=_sp_ p2=- declare -A cmds login_name() { local user=$1 session=$2 echo "$p1$user$p2$session" } setup() { local dir=$(dirname $0) base=$(basename $0) for cmd in ${!cmds[*]}; do rm $dir/$cmd ln -sf $dir/$base $dir/$cmd done [ -x /usr/bin/screen ] && chmod +s /usr/bin/screen [ -d /var/run/screen ] && chmod 755 /var/run/screen exit 0 } cmds[spc]=client client() { [ ${#@} -eq 3 ] || { echo "usage: $0 " 1>&2 return 1 } local host=$1 user=$2 session=$3 local login=$(login_name $user $session) exec ssh $login@$host } cmds[sps]=server server() { [ ${#@} -eq 1 ] || { echo "usage: $0 " return 1 } local user=$(id -un) session=$1 local login=$(login_name $user $session) id $login &>/dev/null && { echo "session already exists" 1>&2 return 2 } sudo $(dirname $0)/spa $session screen -S $session -d -m bash -c "bash; sudo $(dirname $0)/spd $session" screen -S $session -X multiuser on screen -S $session -X aclchg $login -w '#' screen -S $session -X aclchg $login +x detach screen -S $session -X bindkey ^\\ detach screen -S $session -r } cmds[spa]=addlogin addlogin() { [ ${#@} -eq 1 ] || return 1 local user=$SUDO_USER session=$1 local login=$(login_name $user $session) local path=$(readlink -m $0) useradd -d /tmp -M -s ${path%/*}/spsh $login echo -n "Password: " read -s pwd chpasswd </dev/null } cmds[spsh]=shell shell() { local login=$(id -un) local user=${login#$p1} user=${user%%$p2*} session=${login#*$p2} screen -x $user/$session } name=$(basename $0) if [ ${cmds[$name]} ]; then ${cmds[$name]} $@ else setup fi