因为有些时候项目需要,几大主流操作系统如下:
注:此方法是存在内存中的虚拟IP地址,即非静态,表示重启会丢失。对于静态IP,WINDOWS请参考netsh,Linux请参考setup等设置,AIX请参考smit mktcpip,本文不做讨论,比较简单。
由于WINDOWS没有直接提供内存IP的添加方法,找到API接口我从C++翻译过来的,由于学过一些汇编比较熟一点。下面是源码
include masm32rt.inc
include Iphlpapi.inc
includelib Iphlpapi.lib
include ws2_32.inc
includelib ws2_32.lib
include masm32.inc
includelib masm32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include windows.inc
include c:\radasm\masm32\macros\macros.asm
;===================================================================================
printf MACRO format:REQ, args:VARARG
IFNB <args>
invoke crt_printf, cfm$(format), args
ELSE
invoke crt_printf, cfm$(format)
ENDIF
EXITM <>
ENDM
;===================================================================================
typedef struct {
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO *Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
|
IP_ADDRESS_STRING STRUCT
String BYTE 16 dup(?)
IP_ADDRESS_STRING ENDS
IP_MASK_STRING TYPEDEF IP_ADDRESS_STRING
IP_ADDR_STRING STRUCT
Next DWORD ?
IpAddress IP_ADDRESS_STRING <>
IpMask IP_MASK_STRING <>
Context DWORD ?
IP_ADDR_STRING ENDS
PIP_ADDR_STRING TYPEDEF PTR IP_ADDR_STRING
MAX_ADAPTER_DESCRIPTION_LENGTH equ 128
MAX_ADAPTER_NAME_LENGTH equ 256
MAX_ADAPTER_ADDRESS_LENGTH equ 8
IP_ADAPTER_INFO STRUCT
Next DWORD ?
ComboIndex DWORD ?
AdapterName BYTE MAX_ADAPTER_NAME_LENGTH + 4 dup(?)
Description BYTE MAX_ADAPTER_DESCRIPTION_LENGTH + 4 dup(?)
AddressLength DWORD ?
Address BYTE MAX_ADAPTER_ADDRESS_LENGTH dup(?)
Index DWORD ?
_Type DWORD ?
DhcpEnabled DWORD ?
CurrentIpAddress PIP_ADDR_STRING ?
IpAddressList IP_ADDR_STRING <>
GatewayList IP_ADDR_STRING <>
DhcpServer IP_ADDR_STRING <>
HaveWins BOOL ?
PrimaryWinsServer IP_ADDR_STRING <>
SecondaryWinsServer IP_ADDR_STRING <>
LeaseObtained DWORD ?
LeaseExpires DWORD ?
IP_ADAPTER_INFO ENDS
MIB_IF_TYPE_OTHER equ 1
MIB_IF_TYPE_ETHERNET equ 6
MIB_IF_TYPE_TOKENRING equ 9
MIB_IF_TYPE_FDDI equ 15
MIB_IF_TYPE_PPP equ 23
MIB_IF_TYPE_LOOPBACK equ 24
MIB_IF_TYPE_SLIP equ 28
CTXT MACRO quoted_text:VARARG
EXITM <offset literal(quoted_text)>
ENDM
;===================================================================================
MAKELANGID MACRO p,s
mov eax, ((((WORD )(s)) << 10) | (WORD )(p))
exitm <eax>
endm
.const
c_ParamNum equ 5
.data
outBufLen dd SIZEOF IP_ADAPTER_INFO
d_prarmeter dd ?
d_ip UINT ?
d_mask UINT ?
sz_temp db ?
ifIndex dd 0
NTEContext dd 0
NTEInstace dd 0
lpMsgBuf LPVOID ?
dwRetVal DWORD 0
g_dwParamArray dd c_ParamNum+1 dup(0);存放各命令行参数首地址
g_szCmdLine db 256 dup (?);存放命令行参数
sz_command db 3 dup(?)
sz_ip db 15 dup(?)
sz_mask db 15 dup(?)
sz_delip_command db "interface",10,13,
"ip",10,13,
"add address ",0
.code
GetCmdParam proc lpszCmdLine: LPSTR, lpdwParam: dword
local dwFlag: dword
local dwParamCount: dword
invoke GetCommandLine ;取命令行
invoke lstrcpy, lpszCmdLine, eax
mov eax, lpszCmdLine
mov esi, eax
mov edi, lpdwParam
mov dword ptr [edi], eax ;save param 0
add edi, 4
mov dwFlag, 1
mov dwParamCount, 1
@GetCmdParamNext:
inc esi
movzx eax, byte ptr [esi]
cmp eax, 0
je @GetCmdParamRet
cmp eax, ' ' ;skip Space
jne @F
cmp dwFlag, 0
je @GetCmdParamNext
jne @GetCmdParamEnd
@@:
cmp eax, 9 ;skip Tab
jne @F
cmp dwFlag, 0
jne @GetCmdParamEnd
je @GetCmdParamNext
@@:
cmp eax, '/'
jne @F
cmp dwFlag, '"'
je @GetCmdParamNext
jne @GetCmdParamSave
@@:
cmp eax, '"'
jne @F
cmp dwFlag, 0
je @GetCmdParamSave
inc esi
mov dwFlag, 1
jmp @GetCmdParamEnd
@@:
cmp dwFlag, 0
jne @GetCmdParamNext
@GetCmdParamSave:
inc dwParamCount
cmp dwParamCount, c_ParamNum
jg @GetCmdParamRet
mov dwFlag, eax
mov dword ptr [edi], esi
add edi, 4
jmp @GetCmdParamNext
@GetCmdParamEnd:
cmp dwFlag, '"'
je @GetCmdParamNext
mov dwFlag, 0
mov byte ptr [esi], 0
jmp @GetCmdParamNext
@GetCmdParamRet:
ret
GetCmdParam endp
;===================================================================================
start:
;===================================================================================
;printf("SIZEOF IP_ADAPTER_INFO: %d\n\n", outBufLen)
mov ebx, alloc(outBufLen)
.IF ebx == 0
printf("内存分配错误\n")
inkey "Press any key to exit..."
exit 1
.ENDIF
invoke GetAdaptersInfo, ebx, ADDR outBufLen
.IF eax == ERROR_BUFFER_OVERFLOW
free ebx
mov ebx, alloc(outBufLen)
.IF ebx == 0
printf("内存分配错误\n")
inkey "Press any key to exit..."
exit 1
.ENDIF
.ENDIF
invoke GetAdaptersInfo, ebx, ADDR outBufLen
.IF eax == NO_ERROR
mov esi, ebx
.WHILE esi
printf("\t\n序号: \t%d\n", [esi].IP_ADAPTER_INFO.ComboIndex)
;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{3EB7347E-D1B8-4015-BEB1-CE35E7E0A042}\Connection
mov eax, OFFSET IP_ADAPTER_INFO.AdapterName
add eax, esi
printf("名称: \t%s\n", eax)
mov eax, OFFSET IP_ADAPTER_INFO.Description
add eax, esi
printf("描述: \t%s\n", eax)
printf("地址: \t")
mov edi, 1
.WHILE edi < [esi].IP_ADAPTER_INFO.AddressLength
movzx eax, BYTE PTR [esi+edi-1].IP_ADAPTER_INFO.Address
printf("%.2X-", eax)
inc edi
.ENDW
movzx eax, BYTE PTR [esi+edi-1].IP_ADAPTER_INFO.Address
printf("%.2X\n", eax)
printf("\tIndex: \t%d\n", [esi].IP_ADAPTER_INFO.Index)
printf( "\tType: \t")
SWITCH [esi].IP_ADAPTER_INFO._Type
CASE MIB_IF_TYPE_OTHER
printf("Other\n")
CASE MIB_IF_TYPE_ETHERNET
printf("Ethernet\n")
CASE MIB_IF_TYPE_TOKENRING
printf("Token Ring\n")
CASE MIB_IF_TYPE_FDDI
printf("FDDI\n")
CASE MIB_IF_TYPE_PPP
printf("PPP\n")
CASE MIB_IF_TYPE_LOOPBACK
printf("Lookback\n")
CASE MIB_IF_TYPE_SLIP
printf("Slip\n")
DEFAULT
printf("Unknown type %d\n", [esi].IP_ADAPTER_INFO._Type)
ENDSW
mov eax, OFFSET IP_ADAPTER_INFO.IpAddressList.IpAddress.String
add eax, esi
printf("\tIP 地址: \t%s\n", eax)
; mov eax, IP_ADAPTER_INFO.IpAddressList.Next
; mov eax,OFFSET IP_ADAPTER_INFO.IpAddressList.IpAddress[48]
; add eax, esi
; printf("\tIP 地址: \t%s\n", eax)
mov eax, OFFSET IP_ADAPTER_INFO.IpAddressList.IpMask.String
add eax, esi
printf("\t子网掩码: \t%s\n", eax)
mov eax, OFFSET IP_ADAPTER_INFO.GatewayList.IpAddress.String
add eax, esi
printf("\t网关: \t%s\n", eax)
printf("\t***\n")
.IF [esi].IP_ADAPTER_INFO.DhcpEnabled
printf("\tDHCP Enabled: Yes\n")
mov eax, OFFSET IP_ADAPTER_INFO.DhcpServer.IpAddress.String
add eax, esi
printf("\t DHCP Server: \t%s\n", eax)
.ELSE
printf("\tDHCP Enabled: No\n")
.ENDIF
.IF [esi].IP_ADAPTER_INFO.HaveWins
printf("\tHave Wins: Yes\n")
mov eax, OFFSET IP_ADAPTER_INFO.PrimaryWinsServer.IpAddress.String
add eax, esi
printf("\t Primary Wins Server: %s\n", eax)
mov eax, OFFSET IP_ADAPTER_INFO.SecondaryWinsServer.IpAddress.String
add eax, esi
printf("\t Secondary Wins Server: %s\n", eax)
.ELSE
printf("\tHave Wins: No\n")
.ENDIF
printf("\n")
mov esi, [esi].IP_ADAPTER_INFO.Next
.ENDW
.ELSE
printf("失败: %d\n", eax)
inkey "Press any key to exit..."
exit 1
.ENDIF
free ebx
invoke GetCmdParam, addr g_szCmdLine, addr g_dwParamArray
mov edi, offset g_dwParamArray
add edi, 4
push edi
invoke lstrcpy ,offset sz_command,[edi]
pop edi
add edi, 4
push edi
invoke lstrcpy ,offset ifIndex,[edi]
pop edi
add edi, 4
push edi
invoke lstrcpy ,offset sz_ip,[edi]
pop edi
add edi,4
invoke lstrcpy ,offset sz_mask,[edi]
mov eax, offset sz_ip
invoke inet_addr,eax
.if eax==INADDR_NONE
printf("IP Adress不是一个有效的值 %d\n", eax)
.endif
mov d_ip,eax
mov eax, offset sz_mask
invoke inet_addr,eax
.if eax==INADDR_NONE
printf("MASK不是一个有效的值 %d\n", eax)
.endif
mov d_mask,eax
invoke AddIPAddress, d_ip, d_mask,uval(offset ifIndex),offset NTEContext,offset NTEInstace
.if eax==NO_ERROR
printf("IPv4 address successfully added.\n")
.else
printf("IPv4 address add failure.\n")
.endif
printf("\t\n-------------------------------------------\t\n")
printf("ifcfg add index 192.168.1.2 255.255.255.0")
exit 0
end start
添加:
ifcfg add index 192.168.1.2 255.255.255.0
删除:
ifcfg del 192.168.1.2
Linux:
添加:
[root@demo ~]# ifconfig eth0:0 10.0.0.128 netmask 255.255.255.0 up
[root@demo ~]# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:24:21:1D:D8:9E
inet addr:10.0.0.128 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:28 Base address:0x6000
删除:
[root@demo ~]# ifconfig eth0:0 down
这里额外提一下双网卡帮定的方式:
[root@hnoracle2 ~]# cd /etc/sysconfig/network-scripts
[root@hnoracle2 network-scripts]# ls
ifcfg-bond0 ifdown-aliases ifdown-post ifup-aliases ifup-ipx ifup-ppp init.ipv6-global
ifcfg-eth0 ifdown-ippp ifdown-ppp ifup-ib ifup-isdn ifup-routes network-functions
ifcfg-eth1 ifdown-ipsec ifdown-sit ifup-ippp ifup-plip ifup-sit network-functions-ipv6
ifcfg-lo ifdown-ipv6 ifdown-sl ifup-ipsec ifup-plusb ifup-sl
ifdown ifdown-isdn ifup ifup-ipv6 ifup-post ifup-wireless
[root@hnoracle2 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 network-scripts]# cat ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
IPADDR=10.0.0.90
NETMASK=255.255.255.0
NETWORK=10.0.0.0
BROADCAST=10.0.0.255
GATEWAY=10.0.0.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 cat /etc/rc.local
ifenslave bond0 eth0 eth1
Master 'bond0': Error: handshake with driver failed. Aborting
重启网络
service
添加路由
route add -net 10.0.0.0 netmask 255.255.255.0 bond0
AIX6.1
添加
lbq:/#>ifconfig en0 172.16.0.205 netmask 255.255.255.0 broadcast 172.16.0.255 alias
lbq:/#>ifconfig en0
en0: flags=1e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
inet 172.16.0.206 netmask 0xffffff00 broadcast 172.16.0.255
inet 172.16.0.205 netmask 0xffffff00 broadcast 172.16.0.255
tcp_sendspace 131072 tcp_recvspace 65536 rfc1323 0
删除
lbq:/#>ifconfig en0 172.16.0.205 delete