~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
41 lines · 2.9 KB Raw History
#!/bin/bash
P=/tmp/claude-1000/-home-johnandersen777-src-publicdomainrelay-kcp/90fa59d8-02f3-4261-b817-d037e7405f23/scratchpad/linux-proofs
T=$P/bin/tapexec
INNER="ip -br link show tap0; ip -br addr; exec $T attach tap0"
tree() { ps -o pid,ppid,pgid,sid,user,comm,args --forest -g "$1" 2>/dev/null | cut -c1-200; }
desc() { local p=$1; echo "pid $p exe=$(readlink /proc/$p/exe 2>&1) comm=$(cat /proc/$p/comm 2>&1) netns=$(readlink /proc/$p/ns/net 2>&1) userns=$(readlink /proc/$p/ns/user 2>&1)"; }

echo "== $(date -u +%FT%TZ) E4a: pasta + tapexec + execve, interactive (no systemd unit)"
echo "+ pasta --config-net -q -f -a 192.168.100.2 -n 255.255.255.0 -g 192.168.100.1 --dns-forward 192.168.100.1 -- /bin/sh -c 'exec \"\$0\" tap0 /bin/sh -c \"\$1\"' $T '$INNER'"
setsid pasta --config-net -q -f -a 192.168.100.2 -n 255.255.255.0 -g 192.168.100.1 --dns-forward 192.168.100.1 -- /bin/sh -c 'exec "$0" tap0 /bin/sh -c "$1"' $T "$INNER" > $P/e4a.out 2>&1 &
PP=$!
sleep 1.5
echo "--- output:"; cat $P/e4a.out
echo "--- process tree (session of pasta $PP):"
ps -o pid,ppid,comm,args --forest --ppid $PP -p $PP | cut -c1-160
CH=$(pgrep -P $PP)
echo "pasta pid=$PP children=[$CH]"
desc $PP; for c in $CH; do desc $c; echo "grandchildren of $c: [$(pgrep -P $c)]"; done
echo "host netns: $(readlink /proc/self/ns/net)"
echo "--- tap seen from inside ns via nsenter --preserve-credentials -U -n -t $CH:"
nsenter --preserve-credentials -U -n -t $CH ip -d -br link show tap0 2>&1
nsenter --preserve-credentials -U -n -t $CH ip -d link show tap0 2>&1 | grep -o 'tun type tap.*'
echo "--- fds of exec'd process (tun fd from tapexec must not leak; attach fd present):"
ls -l /proc/$CH/fd 2>&1 | awk '{print $9,$10,$11}' | grep -v '^ *$'
echo "== $(date -u +%FT%TZ) kill -TERM pasta $PP"
kill -TERM $PP; sleep 1
for p in $PP $CH; do kill -0 $p 2>/dev/null && echo "pid $p STILL ALIVE" || echo "pid $p gone"; done
pkill -f "$T attach" && echo "cleanup: had to kill leftover attach"

echo "== $(date -u +%FT%TZ) E4a': kill -9 of pasta"
setsid pasta --config-net -q -f -a 192.168.100.2 -n 255.255.255.0 -g 192.168.100.1 -- /bin/sh -c 'exec "$0" tap0 /bin/sh -c "$1"' $T "$INNER" > $P/e4a2.out 2>&1 &
PP=$!; sleep 1.5; CH=$(pgrep -P $PP); echo "pasta=$PP child=$CH"
kill -9 $PP; sleep 1
for p in $PP $CH; do kill -0 $p 2>/dev/null && echo "pid $p STILL ALIVE ($(cat /proc/$p/status | grep PPid))" || echo "pid $p gone"; done
pkill -f "$T attach" && echo "cleanup: had to kill leftover attach"

echo "== $(date -u +%FT%TZ) E4a'': kill -9 of the exec'd child (VMM stand-in) -> pasta exits?"
setsid pasta --config-net -q -f -a 192.168.100.2 -n 255.255.255.0 -g 192.168.100.1 -- /bin/sh -c 'exec "$0" tap0 /bin/sh -c "$1"' $T "$INNER" > $P/e4a3.out 2>&1 &
PP=$!; sleep 1.5; CH=$(pgrep -P $PP); echo "pasta=$PP child=$CH"
kill -9 $CH; sleep 1
kill -0 $PP 2>/dev/null && echo "pasta $PP STILL ALIVE" || { wait $PP; echo "pasta $PP exited rc=$?"; }