一、网络设置
1.1 列出当前的网络接口配置
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:6078 errors:0 dropped:0 overruns:0 frame:0
TX packets:6078 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:634520 (634.5 KB) TX bytes:634520 (634.5 KB)
wlan0 Link encap:EthernetHWaddr 00:1c:bf:87:25:d2
inet addr:192.168.0.82 Bcast:192.168.3.255 Mask:255.255.252.0
inet6addr: fe80::21c:bfff:fe87:25d2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:420917 errors:0 dropped:0 overruns:0 frame:0
TX packets:86820 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:98027420 (98.0 MB) TX bytes:22602672 (22.6 MB)
ifconfig输出的最左边一列是网络接口名,右边的若干列显示对应的网络接口的详细信息。
1.2 设置网络接口的IP地址
# ifconfig wlan0 192.168.0.80
使用以下命令设置此IP地址的子网掩码:
# ifconfig wlan0 192.168.0.80 netmask 255.255.252.0
1.3 动态主机配置协议(DHCP)
# dhclient eth0
1.4 打印网络接口列表
这个单行命令可以打印系统可用的网络接口列表:
$ ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'
lo
wlan0
ifconfig输出的每行前10个字符被保留用于网络接口名称。因此我们用cut命令提取每一行的前10个字符。tr -d ’ '删除每一行的所有空格。用tr -s 'n’压缩多个换行符以生成接口名称列表。
1.5 显示IP地址
$ ifconfig iface_name
例如
$ ifconfig wlan0
wlan0 Link encap:EthernetHWaddr 00:1c:bf:87:25:d2
inet addr:192.168.0.82 Bcast:192.168.3.255 Mask:255.255.252.0
inet6 addr: fe80::3a2c:4aff:6e6e:17a9/64 Scope:Link
UP BROADCAST RUNNINT MULTICAST MTU:1500 Metric:1
RX Packets...
要想控制某台网络设备,我们需要IP地址、广播地址、硬件地址和子网掩码
HWaddr 00:1c:bf:87:25:d2是硬件地址(MAC地址);
inet addr:192.168.0.82是IP地址;
Bcast:192.168.3.255是广播地址;
Mask:255.255.252.0是子网掩码。
要从ifconfig输出中提取IP地址,可以使用:
$ ifconfig wlan0 | egrep -o "inetaddr:[^ ]*" | grep -o "[0-9.]*"
192.168.0.82
egrep -o "inetaddr:[^ ]" 会打印出inet addr:192.168.0.82。其中的模式以inetaddr:作为起始,以非空格字符序列(由 [^ ] 指定)作为结束。接下来命令grep -o "[0-9.]*"只输出数字与点号(.)的组合,也就是IP地址。
1.6 硬件地址(MAC地址)欺骗
如果采用了基于硬件地址的认证或过滤,那么我们可以使用硬件地址欺骗(hardware addressspoofing)。硬件地址在ifconfig输出中是以HWaddr 00:1c:bf:87:25:d2形式出现的。
ifconfig的子命令可以定义设备类别以及MAC地址:
# ifconfig eth0 hw ether 00:1c:bf:87:25:d5
1.7 名字服务器与DNS(域名服务)
将IP地址映射为符号名称的这种技术称为域名服务(DNS)。当我们输入www.google.com,计算机使用DNS服务器将域名解析为对应的IP地址。在本地网络中,我们可以设置本地DNS为本地主机命名。
名字服务器是在文件 /etc/resolv.conf中定义的:
$ cat /etc/resolv.conf
# Local nameserver
nameserver 192.168.1.1
# External nameserver
nameserver 8.8.8.8
获取域名所对应IP地址的最简单方法就是用ping命令访问指定的域名。命令的回应信息中就包含了IP地址:
$ ping google.com
PING google.com (64.233.181.106) 56(84) bytes of data.
一个域名可以对应多个IP地址。对于这种情况,ping只会显示其中的一个地址。要想获取分配给域名的所有IP地址,就得使用DNS查找工具了。
1.8 DNS查找
有多种基于命令行的DNS查找工具都可以实现名字与IP地址的解析。host和nslookup就是其中两个常用工具。
host命令会列出某个域名所有的IP地址:
$ host google.com
google.com has address 64.233.181.105
google.com has address 64.233.181.99
google.com has address 64.233.181.147
google.com has address 64.233.181.106
google.com has address 64.233.181.103
google.com has address 64.233.181.104
nslookup命令可以完成名字与IP地址之间的相互映射
$ nslookup google.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: google.com
Address: 64.233.181.105
Name: google.com
Address: 64.233.181.99
Name: google.com
Address: 64.233.181.147
Name: google.com
Address: 64.233.181.106
Name: google.com
Address: 64.233.181.103
Name: google.com
Address: 64.233.181.104
Server: 8.8.8.8
上面最后一行对应着用于DNS解析的默认名字服务器。
也可以通过向文件/etc/hosts中加入条目来实现名字解析。
/etc/hosts文件格式如下:
IP_ADDRESS name1 name2 ...
用下面的方法更新该文件:
# echo IP_ADDRESS symbolic_name >> /etc/hosts
例如:
# echo 192.168.0.9 backupserver >> /etc/hosts
添加了条目之后,任何时候解析backupserver,都会返回192.168.0.9。
如果backupserver有多个名字,将其全部写入同一行中:
# echo 192.168.0.9 backupserver backupserver.example.com >> /etc/hosts
1.9 显示路由表信息
多个网络相互连接是很常见的场景。例如,工作场所或学校的不同部门可能处于不同的网络中。如果一个网络中的设备想同另一个网络中的设备通信,就需要借助某个同时连接了两个网络的设备发送分组。这个特殊的设备叫作网关,它的作用是在不同的网络中转发分组。
操作系统维护着一个叫作路由表的表格,它包含了分组如何转发的信息。route命令可以显示路由表:
$ route
Kernel IP routing table
Destination Gateway GenmaskFlags Metric Ref UseIface
192.168.0.0 * 255.255.252.0 U 2 0 0wlan0
link-local * 255.255.0.0 U 1000 0 0wlan0
default p4.local 0.0.0.0 UG 0 0 0wlan0
也可以使用
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref UseIface
192.168.0.0 0.0.0.0 255.255.252.0 U 2 0 0 wlan0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlan0
0.0.0.0 192.168.0.4 0.0.0.0 UG 0 0 0 wlan0
-n指定以数字形式显示地址。默认情况下,route命令会将IP地址映射为名字。
如果系统不知道如何分组到目的地的路由,它会将其发送到默认网关。默认网关可以连接到Internet或部门内部的路由器。
route add命令可以添加默认网关:
# route add default gw IP_ADDRESS INTERFACE_NAME
例如:
# route add default gw 192.168.0.1 wlan0
二、ping!
ping命令使用Internet控制消息协议(Internet Control Message Protocol,ICMP)中的echo分组检验网络上两台主机之间的连通性。当向某台主机发送echo分组时,如果分组能够送达且该主机处于活动状态,那么它就会返回一条回应(reply)。如果没有通往目标主机的路由或是目标主机不知道如何将回应返回给请求方,ping命令则执行失败。
2.1 检查某台主机是否可达
$ ping ADDRESS
默认情况下,ping会连续发送分组,回应信息将被打印在终端上。可以用Ctrl+C来停止ping命令。
2.2 往返时间
ping命令可以显示出每个分组的往返时间(Round Trip Time,RTT)。
2.3 序列号
ping发出的每个分组都有一个序列号,从1开始,直到ping命令结束。如果网络接近饱和,分组可能会因为冲突、重试或被丢弃的原因,以乱序的形式返回:
$> ping example.com
64 bytes from example.com (1.2.3.4): icmp_seq=1 ttl=37 time=127.2 ms
64 bytes from example.com (1.2.3.4): icmp_seq=3 ttl=37 time=150.2 ms
64 bytes from example.com (1.2.3.4): icmp_seq=2 ttl=30 time=1500.3 ms
2.4 限制发送的分组数量
ping命令会不停地发送echo分组并等待回复,直到按下Ctrl+C为止。我们可以用选项-c限制所发送的echo分组的数量。
2.5 ping命令的返回状态
ping命令如果执行顺利,会返回退出状态0;否则,返回非0。执行顺利意味着目标主机可达,执行失败意味着目标主机不可达。
返回状态可以通过下面的方法获得:
$ ping domain -c2
if [ $? -eq0 ];
then
echo Successful ;
else
echo Failure
fi
三、跟踪IP路由
当应用程序通过Internet请求服务时,服务器可能位于远端,两者之间通过多个网关或路由器相连。traceroute命令可以显示分组途径的所有网关的地址。
traceroute命令的格式如下:
traceroute destinationIP
$ traceroute google.com
traceroute to google.com (74.125.77.104), 30 hops max, 60 byte packets
1 gw-c6509.lxb.as5577.net (195.26.4.1) 0.313 ms 0.371 ms 0.457 ms
2 40g.lxb-fra.as5577.net (83.243.12.2) 4.684 ms 4.754 ms 4.823 ms
3 de-cix10.net.google.com (80.81.192.108) 5.312 ms 5.348 ms 5.327 ms
4 209.85.255.170 (209.85.255.170) 5.816 ms 5.791 ms 209.85.255.172
(209.85.255.172) 5.678 ms
5 209.85.250.140 (209.85.250.140) 10.126 ms 9.867 ms 10.754 ms
6 64.233.175.246 (64.233.175.246) 12.940 ms 72.14.233.114 (72.14.233.114)
13.736 ms 13.803 ms
7 72.14.239.199 (72.14.239.199) 14.618 ms 209.85.255.166 (209.85.255.166)
12.755 ms 209.85.255.143 (209.85.255.143) 13.803 ms
8 209.85.255.98 (209.85.255.98) 22.625 ms 209.85.255.110 (209.85.255.110)
14.122 ms
*
9 ew-in-f104.1e100.net (74.125.77.104) 13.061 ms 13.256 ms 13.484 ms
四、列出网络中所有的活动主机
4.1 ping
#!/bin/bash
# 文件名: ping.sh
#根据你所在网络的实际情况修改网络地址192.168.0
for ip in 192.168.0.{1..255} ;
do
ping $ip -c 2 &> /dev/null ;
if [ $? -eq 0 ];
then
echo $ip is alive
fi
done
输出如下:
$ ./ping.sh
192.168.0.1 is alive
192.168.0.90 is alive
ping $ip -c 2 &> /dev/null会对相应的IP地址执行ping命令。选项-c 2将发送的分组数量限制为两个。&> /dev/null用于将stderr和stdout重定向到 /dev/null,使得终端上不会出现任何输出信息。
4.2 并行ping
上一节的脚本是依次测试每个地址的。每次测试累积下来的延迟时间可不短。我们可以利用并行方式来提高整体执行速度。要使ping命令可以并行执行,可将循环体放入()&。()中的命令会在子shell中运行,而&会将其置入后台。例如:
#!/bin/bash
# 文件名: fast_ping.sh
#用途:根据你所在网络的实际情况修改网络地址192.168.0。
for ip in 192.168.0.{1..255} ;
do
(
ping $ip -c2 &> /dev/null ;
if [ $? -eq 0 ];
then
echo $ip is alive
fi
)&
done
wait
在for循环体中执行了多个后台进程,然后结束循环并终止脚本。wait命令会等待所有的子进程结束后再终止脚本。
4.3 使用fping
fping可以为多个IP地址生成ICMP分组,然后等待回应。其运行速度要比之前的脚本快得多。
fping的选项如下:
选项 -a指定显示出所有活动主机的IP地址;
选项 -u指定显示出所有不可达的主机;
选项 -g指定从“IP地址/子网掩码”记法或者“IP地址范围”记法中生成一组IP地址;
$ fping -a 192.160.1/24 -g
或者
$ fping -a 192.160.1 192.168.0.255 -g
2>/dev/null用于将由于主机不可达所产生的错误信息输出到null设备
五、使用SSH 在远程主机上执行命令
SSH代表的是Secure Shell(安全shell)。它使用加密隧道连接两台计算机。SSH能够让你访问远程计算机上的shell,从而在其上执行交互命令并接收结果,或是启动交互会话。
5.1 连接运行了SSH服务器的远程主机
$ ssh username@remote_host
其中:
username是远程主机上的用户;
remote_host可以是域名或IP地址。
$ ssh mec@192.168.0.1
The authenticity of host '192.168.0.1 (192.168.0.1)' can't be
established.
RSA key fingerprint is
2b:b4:90:79:49:0a:f1:b3:8a:db:9f:73:2d:75:d6:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.1' (RSA) to the list of
known hosts.
Password:
Last login: Fri Sep 3 05:15:21 2010 from 192.168.0.82
mec@proxy-1:~$
5.2 连接运行在端口422之上的SSH服务器
$ ssh user@locahost -p 422
在shell脚本中使用ssh时,并不需要交互式shell,因为我们只是需要在远程系统中执行命令并处理命令输出。
5.3 在远程主机中执行命令,在本地shell中显示命令输出
$ ssh user@host 'COMMANDS'
例如:
$ ssh mec@192.168.0.1 'whoami'
mec
可以输入多条命令,命令之间用分号分隔:
$ ssh user@host "command1 ; command2 ; command3"
例如:
$ ssh mec@192.168.0.1 "echo user: $(whoami);echo OS: $(uname)"
Password:
user: mec
OS: Linux
5.4 SSH的压缩功能
SSH协议也支持对数据进行压缩传输。当带宽有限时,这一功能很方便。用ssh命令的选项-C启用这一功能:
$ ssh -C user@hostname COMMANDS
5.5 将数据重定向至远程shell命令的stdin
SSH允许你使用本地系统的命令输出作为远程系统的输入:
$ echo 'text' | ssh user@remote_host 'echo'
text
或者
# 重定向文件中的数据
$ ssh user@remote_host 'echo' < file
六、通过网络传输文件
6.1 FTP
文件传输协议(File Transfer Protocol,FTP)是一个古老的协议,在很多公共站点上用于文件共享。FTP服务器通常运行在端口21上。远程主机上必须安装并运行FTP服务器才能使用FTP。我们可以使用传统的ftp命令或更新的lftp命令访问FTP服务器。两者都支持下面要讲到的命令。很多公共网站都是用FTP共享文件。
6.1.1 连接FTP服务器传输文件
要连接FTP服务器传输文件,可以使用:
$ lftpusername@ftphost
它会提示你输入密码,然后显示一个像下面这样的登录提示符:
lftp username@ftphost:~>
你可以在提示符后输入各种命令,如下所示。
cd directory:更改远程主机目录。
lcd:更改本地主机目录。
mkdir:在远程主机上创建目录。
ls:列出远程主机当前目录下的文件。
get FILENAME:将文件下载到本地主机的当前目录中。
lftp username@ftphost:~> get filename
put filename:将文件从当前目录上传到远程主机。
lftp username@ftphost:~> put filename
quit命令可以退出lftp会话。
lftp提示符支持命令自动补全。
6.1.2 FTP自动传输
lftp和ftp为用户启动一个交互式会话。下面的脚本可以用来实现FTP自动传输
#!/bin/bash
#FTP传输自动化
HOST=example.com'
USER='foo'
PASSWD='password'
lftp -u ${USER}:${PASSWD} $HOST <<EOF
binary
cd /home/foo
put testfile.jpg
quit
EOF
上面的脚本包含下列结构:
<<EOF
DATA
EOF
这种结构用来通过stdin向lftp命令发送数据。
选项-u可以使用我们定义的USER和PASSWD登入远程站点。binary命令将文件模式设置为二进制。
6.2 SFTP(Secure FTP,安全FTP)
SFTP是一个运行在SSH连接之上并模拟了FTP接口的文件传输系统。它不需要远端运行FTP服务器来进行文件传输,但必须要有SSH服务器。sftp是一个交互式命令,提供了命令提示符。
sftp支持与ftp和lftp相同的命令。
6.2.1 启动sftp会话
$ sftp user@domainname
和lftp类似,输入quit命令可以退出sftp会话。
SSH服务器有时候并不在默认的端口22上运行。如果它在其他端口运行,我们可以在sftp中用选项-oPort=PORTNO来指定端口号。例如:
$ sftp -oPort=422 user@slynux.org
-oPort应该作为sftp命令的第一个参数。
七、连接无线网络
配置以太网很简单,因为它使用物理线缆,无需认证之类的特殊要求。但是无线LAN需要使用ESSID(Extended Service Set Identification,扩展服务集标识),可能还得输入口令。
要连接有线网络,我们只需要用ifconfig分配IP地址和子网掩码就行了。对于无线网络,则需要iwconfig和iwlist工具来配置更多的参数。
下面的脚本会连接到启用了WEP(Wried Equivalent Privacy,有线等效加密)的无线LAN:
#!/bin/bash
#文件名: wlan_connect.sh
#用途: 连接无线LAN
#根据你的设置修改下面的参数
######### PARAMETERS ###########
IFACE=wlan0
IP_ADDR=192.168.1.5
SUBNET_MASK=255.255.255.0
GW=192.168.1.1
HW_ADDR='00:1c:bf:87:25:d2'
#如果不想使用物理地址欺骗,把上面这一行注释掉
ESSID="homenet"
WEP_KEY=8b140b20e7
FREQ=2.462G
#################################
KEY_PART=""
if [[ -n $WEP_KEY ]];
then
KEY_PART="key $WEP_KEY"
fi
if [ $UID -ne 0 ];
then
echo "Run as root"
exit 1;
fi
#设置新的配置之前先关闭接口
/sbin/ifconfig $IFACE down
if [[ -n $HW_ADDR ]];
then
/sbin/ifconfig $IFACE hw ether $HW_ADDR
echo Spoofed MAC ADDRESS to $HW_ADDR
fi
/sbin/iwconfig $IFACE essid $ESSID $KEY_PART freq $FREQ
/sbin/ifconfig $IFACE $IP_ADDR netmask $SUBNET_MASK
route add default gw $GW $IFACE
echo Successfully configured $IFACE
无线LAN需要essid、key(密钥)以及frequency(频率)等参数。essid是我们想要连接的无线网络的名称。一些网络需要用WEP密钥进行认证, WEP密钥通常是一个5位或10位十六进制数口令。频率则是分配给特定网络的,iwconfig命令用它关联无线网卡与对应的无线网络。