summaryrefslogtreecommitdiff
path: root/penyou
diff options
context:
space:
mode:
Diffstat (limited to 'penyou')
-rwxr-xr-xpenyou74
1 files changed, 71 insertions, 3 deletions
diff --git a/penyou b/penyou
index cc7fdda..0b1970a 100755
--- a/penyou
+++ b/penyou
@@ -1,4 +1,72 @@
1#!/bin/sh 1#!/bin/bash
2sudo=$([ $(id -u) -eq 0 ] || echo sudo --) 2set -e
3exec $sudo ssh -i /etc/ssh/ssh_host_ed25519_key -l root "$@"
4 3
4gethome()
5{
6# getent passwd "$1" | (IFS=:; read line; set -- $line; printf '%s\n' "$6")
7 eval printf '%s\\n' "~$1"
8}
9
10OPT=$(getopt -o 'l:u:' --long 'user:,login:' -n "$0" -- "$@")
11eval set -- "$OPT"
12unset OPT
13
14USERNAME=$(id -un)
15LOGINUSER=$USERNAME
16while true
17do
18 case "$1" in
19 -u | --user )
20 USERNAME=$2
21 shift 2
22 ;;
23 -l | --login )
24 LOGINUSER=$2
25 shift 2
26 ;;
27 -- )
28 shift
29 break
30 ;;
31 * )
32 exit 1
33 ;;
34 esac
35done
36
37q()
38{
39 printf '%q' "$*"
40}
41
42remote_code()
43{
44 set -e
45 cd
46 [ -d .ssh ] || mkdir .ssh
47 printf '%s\n' "$1" >> .ssh/authorized_keys
48}
49
50[ $# = 1 ]
51
52h=$(gethome "$USERNAME")
53[ "$h" ]
54d=$h/.ssh
55[ -d "$d" ]
56
57keytypes='id_ed25519 id_ed25519_sk id_ecdsa id_ecdsa_sk id_rsa id_dsa'
58for k in $keytypes
59do
60 f=$d/$k.pub
61 if [ -e "$f" ]
62 then
63 read authline < "$f"
64 (declare -f remote_code
65 echo remote_code $(q "$authline")) |
66 sash -T "$1" -- \
67 runuser -u "$LOGINUSER" -- bash
68 exit
69 fi
70done
71echo "$0: Error: no public key found for user $USERNAME" >&2
72exit 1