mirror of
https://github.com/corundum/corundum.git
synced 2025-01-16 08:12:53 +08:00
69 lines
1.6 KiB
Bash
69 lines
1.6 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
ns=""
|
||
|
|
||
|
while getopts h-: option; do
|
||
|
case "${option}" in
|
||
|
-)
|
||
|
case "${OPTARG}" in
|
||
|
ns)
|
||
|
val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 ))
|
||
|
ns=$val
|
||
|
;;
|
||
|
ns=*)
|
||
|
val=${OPTARG#*=}
|
||
|
ns=$val
|
||
|
;;
|
||
|
*)
|
||
|
if [ "$OPTERR" = 1 ] && [ "${optspec:0:1}" != ":" ]; then
|
||
|
echo "Unknown option --${OPTARG}" >&2
|
||
|
fi
|
||
|
;;
|
||
|
esac;;
|
||
|
h)
|
||
|
echo $(basename $0): usage: $(basename $0) [-h] [--ns=name] [dev] [dev]
|
||
|
exit 0
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
shift $((OPTIND -1))
|
||
|
|
||
|
dev=$1
|
||
|
|
||
|
if [ -z "$ns" ]; then
|
||
|
if [ -z "$dev" ]; then
|
||
|
echo "Error: must specify either device or network namespace name"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
ns=$dev
|
||
|
fi
|
||
|
|
||
|
if [ -f "/var/run/netns/$ns" ]; then
|
||
|
echo "Network namespace '$ns' already exists"
|
||
|
else
|
||
|
echo "Creating network namespace '$ns'"
|
||
|
ip netns add $ns
|
||
|
for d in "$@"
|
||
|
do
|
||
|
echo "Adding interface '$d' to network namespace '$ns'"
|
||
|
ip link set dev $d netns $ns
|
||
|
ip netns exec $ns ip link set dev $d up
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
if [ -f "/var/run/netns/$ns" ]; then
|
||
|
echo "Starting shell in network namespace '$ns'"
|
||
|
echo "Note: \$dev='$dev'"
|
||
|
export dev
|
||
|
ip netns exec $ns bash
|
||
|
else
|
||
|
echo "Error: network namespace not found"
|
||
|
fi
|
||
|
|
||
|
if [ -f "/var/run/netns/$ns" -a -z "$(ip netns pids $ns)" ]; then
|
||
|
echo "Deleting network namespace '$ns'"
|
||
|
ip netns del $ns
|
||
|
fi
|
||
|
|