#!/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 ''
#!/bin/rc
#uses MODELpid's namespace to remove all binds and mounts from TARGETpid that are not present in MODELpid's namespace
rfork e
ifs='
'
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/chnssafe
if(~ $testonly yes){
cat /tmp/chnscom
exit
}
. /tmp/chnscom
exit ''