সংক্ষিপ্ত উত্তর : আপনি শেল ফাংশনটিতে মোড়ানো না হলে আপনি পারবেন না। একজন দরিদ্র মানুষের সংস্করণ:
function ifaddrmtu() {
# Call: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254
# or: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254 1400
local label=$1
local ip=$2
local mask=$3
local mtu=$4
sudo ip addr add $ip/$mask brd + dev ${label%:*} label $label
[ ! -z $mtu ] && sudo ip link set mtu $mtu dev $label
}
এখন, আপনি যদি সত্যিই পুরানো ifconfig
আচরণটি মানচিত্র করতে চান তবে আপনাকে iproute2
একটি পার্সার লিখতে হবে, যা ifconfig
সিনট্যাক্স এবং শব্দার্থকে মানচিত্র করে iproute2
। দশ বছর আগে, আমি যে কোম্পানির জন্য কাজ করেছি তার পক্ষে শেলের এমন একটি বেষ্ট লিখেছিলাম। আপনার যদি এটির প্রয়োজন হয় তবে আমি এটি আমার পুরানো হার্ড ড্রাইভগুলির মধ্যে একটি থেকে বের করার চেষ্টা করতে পারি। এটি বেশ ঝরঝরে ছিল এবং রাউটিং টেবিলগুলি এবং তাদের এন্ট্রিগুলি দেখানোর আরও বেশি বন্ধুত্বপূর্ণ পদ্ধতি নিয়ে এসেছে।
আরও বিশদ উত্তর : iproute2
ফ্রেমওয়ার্কটি আইপি ঠিকানা যুক্ত করা এবং একটি ডিভাইসের এমটিটিও সেট করা কর্নেলের দৃষ্টিকোণ থেকে দুটি ভিন্ন বিষয়। ifconfig
কার্নেলের নেটওয়ার্ক স্ট্যাকের কনফিগারেশনটি পরিবর্তন করতে পুরানো-শৈলীর আইওসিটিএল যোগাযোগ ব্যবহার করার সময় (কার্নেল পরবর্তীকালে সমস্ত কাজ অভ্যন্তরীণভাবে একটি আইপি অ্যাড্রেস যুক্ত করার জন্য এবং mtu সেট করার জন্য সমস্ত কাজ করে) নেটওয়ার্ক স্ট্যাকের সাথে যোগাযোগের জন্য বার্তা কাঠামো iproute2
ব্যবহার করে netlink
।
আপনি স্ট্রেস (আমার লিনাক্স ভিএম এর অংশ) ব্যবহার করে এটি সেরা দেখতে পাচ্ছেন:
# ip addr del 1.1.1.1/32 dev eth4
# strace -e ioctl ifconfig eth4:new 1.1.1.1 netmask 255.255.255.255 mtu 1400
ioctl(4, SIOCSIFADDR, {ifr_name="eth4:new", ifr_addr={AF_INET, inet_addr("1.1.1.1")}}) = 0
ioctl(4, SIOCGIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFNETMASK, {ifr_name="eth4:new", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0
ioctl(4, SIOCSIFMTU, {ifr_name="eth4:new", ifr_mtu=1400}) = 0
# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
inet 1.1.1.1/32 scope global eth4:new
# ip addr del 1.1.1.1/32 dev eth4
# strace -e "send,sendmsg,recvmsg" ip addr add 1.1.1.1/32 dev eth4 label eth4:new
send(3, "\24\0\0\0\22\0\1\3\206\35\31R\0\0\0\0\0\0\0\0", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\340\3\0\0\20\0\2\0\206\35\31R\257\10\0\0\0\0\4\3\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\206\35\31R\257\10\0\0\0\0\0\0\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"8\0\0\0\24\0\5\6\207\35\31R\0\0\0\0\2 \0\0\2\0\0\0\10\0\2\0\1\1\1\1"..., 56}], msg_controllen=0, msg_flags=0}, 0) = 56
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$\0\0\0\2\0\0\0\207\35\31R\257\10\0\0\0\0\0\0008\0\0\0\24\0\5\6\207\35\31R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36 = ?
# strace -e "send,sendmsg,recvmsg" ip link set mtu 1420 dev eth4
send(3, " \0\0\0\20\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32, 0) = 32
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"4\0\0\0\2\0\0\0\0\0\0\0\250\10\0\0\355\377\377\377 \0\0\0\20\0\5\0\0\0\0\0"..., 8192}], msg_controllen=0, msg_flags=0}, 0) = 52
send(3, "\24\0\0\0\22\0\1\3;\35\31R\0\0\0\0\0\0\0\0", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\340\3\0\0\20\0\2\0;\35\31R\250\10\0\0\0\0\4\3\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0;\35\31R\250\10\0\0\0\0\0\0\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"(\0\0\0\20\0\5\0<\35\31R\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"..., 40}], msg_controllen=0, msg_flags=0}, 0) = 40
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$\0\0\0\2\0\0\0<\35\31R\250\10\0\0\0\0\0\0(\0\0\0\20\0\5\0<\35\31R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36
# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1420 qdisc pfifo_fast state UP qlen 1000
inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
inet 1.1.1.1/32 scope global eth4:new
ডিভাইস এন্ট্রি করার জন্য আইপি ঠিকানা এবং এমটিটিউয়ের সেটিং দুটি ভিন্ন জিনিস হওয়ার কারণ অবশ্যই রয়েছে more আসুন আমরা কেবল এটিই বলি যে আইপি ঠিকানাগুলি ইন্টারফেসের দ্বারা প্রস্তাবিত হিসাবে সত্যই নির্ভর করে না ifconfig
। নামটি কেবল ইন্টারফেসের নাম হিসাবে ব্যবহৃত একটি লেবেল যা ফরোয়ার্ড ইনফরমেশন বেস (এফআইবি) দেখতে / ফিল্টার করতে এবং প্যাকেটগুলি রুট করতে ব্যবহার করে। প্যাকেটের হ্যান্ডলিং পয়েন্টের দর্শন থেকে কার্নেলটি ডিভাইসের নাম ছাড়া খুব ভালভাবে বাঁচতে পারে।