79 lines · 1.6 KB · Text
RawDownload
#!/bin/rc#uses MODELpid's namespace to remove all binds and mounts from TARGETpid that are not present in MODELpid's namespace rfork eifs=''while (~ $1 -*){	switch($1){	case -o		only=$2		shift		shift	case -x		xclude=$2		shift		shift	case -t		testonly=yes		shift	case -r		riosafe=yes		shift	case *		echo bad flag $1		shift	}} if(~ $2 ''){	echo usage: subns MODELpid TARGETpid	exit usage	}if(! test -e /proc/$1){	echo process $1 does not exist!	exit no.proc}if(! test -e /proc/$2){	echo process $2 does not exist!	exit no.proc}if(test -e /tmp/chnsuniq)	rm /tmp/chnsuniq orig=`{cat /proc/$2/ns}for (i in $orig){	search=''^$i^''	match=`{cat /proc/$1/ns |grep -e $search}	if(~ $match ''){		echo $i >> /tmp/chnsuniq	}}if(! test -e /tmp/chnsuniq){	echo no binds in $2 not in $1 to subtract	exit no.binds} sed 's/^/echo ⊞/g' /tmp/chnsuniq |sed 's/$/⊞ >\/proc\/'$2'\/ns/g'| tr ⊞ '''' |sed '/echo .cd/d' |sed 's/mount/unmount/g' | sed 's/bind/unmount/g' | sed 's/-. //g' |sed 's/-.. //g' |sed 's/  / /g' |sed '/\#\|\/data/d' |sed '/\#D\/ssl/d' |sed '/\#a\/tls/d' |sed '1!G;h;$!d' >/tmp/chnscom if(~ $riosafe yes){	cat /tmp/chnscom |sed '/\/mnt\/wsys/d' | sed '/\/mnt\/term/d' |sed '/\/dev\/cons/d' |sed '/rio/d' >/tmp/chnssafe	mv /tmp/chnssafe /tmp/chnscom}if (! ~ $xclude ''){	grep -v $xclude /tmp/chnscom >/tmp/chnssafe	mv /tmp/chnssafe /tmp/chnscom}if (! ~ $only ''){	grep $only /tmp/chnscom >/tmp/chnssafe	mv /tmp/chnssafe /tmp/chnscom}if (test -e /tmp/chnssafe)	rm /tmp/chnssafeif(~ $testonly yes){	cat /tmp/chnscom	exit}. /tmp/chnscom exit ''