shell 学习笔记 常用命令 ifconfig ping traceroute ssh lsof

摘自 Linux Shell 脚本攻略 第八章 无网不利

网络设置

ifconfig命令用于配置及显示网络接口、子网掩码等细节信息。它通常位于/sbin/ifconfig中

列出当前的网络接口配置

$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:cfff:fe3f:726a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cf:3f:72:6a  txqueuelen 0  (Ethernet)
        RX packets 5377240  bytes 99267991261 (99.2 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11959095  bytes 817531794 (817.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.105  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::c308:2705:a1f9:8cab  prefixlen 64  scopeid 0x20<link>
        ether d8:bb:c1:2a:a3:70  txqueuelen 1000  (Ethernet)
        RX packets 294411893  bytes 373815865450 (373.8 GB)
        RX errors 0  dropped 672716  overruns 0  frame 0
        TX packets 210835575  bytes 142454603937 (142.4 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xb1200000-b1220000  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 579734582  bytes 119597977040 (119.5 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 579734582  bytes 119597977040 (119.5 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth566620a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::b455:cdff:fe68:cc0c  prefixlen 64  scopeid 0x20<link>
        ether b6:55:cd:68:cc:0c  txqueuelen 0  (Ethernet)
        RX packets 5375371  bytes 99342902301 (99.3 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11958865  bytes 817481224 (817.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth83f3eb4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::70c0:95ff:fe73:77e8  prefixlen 64  scopeid 0x20<link>
        ether 72:c0:95:73:77:e8  txqueuelen 0  (Ethernet)
        RX packets 31  bytes 2597 (2.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 105498  bytes 26306113 (26.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethd7806a9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::dca6:34ff:fe02:69a0  prefixlen 64  scopeid 0x20<link>
        ether de:a6:34:02:69:a0  txqueuelen 0  (Ethernet)
        RX packets 1838  bytes 367723 (367.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 107483  bytes 26559397 (26.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig输出的最左边一列是网络接口名,右边的若干列显示对应的网络接口的详细 信息

设置网络接口的IP地址

# ifconfig wlan0 192.168.0.80

你需要以root身份运行上述命令。192.168.0.80是为无线设备wlan0所设置的IP地址。

使用以下命令设置此IP地址的子网掩码

# ifconfig wlan0 192.168.0.80 netmask 255.255.252.0

请使用dhclient, 不要手动设置地址,以免和网络上的其他主机产生冲突

# dhclient eth0

打印网络接口列表

$ ifconfig |cut -c -8|tr -d ' '|tr -s '\n'
docker0:
eno1:fl
lo:flag
veth5666
veth83f3
vethd780

ifconfig输出的每行前8个字符被保留用于网络接口名称。因此我们用cut命令提取每一行的 前8个字符。tr -d ’ '删除每一行的所有空格。用tr -s 'n’压缩多个换行符以生成接口名称列表

显示IP地址

$ ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:cfff:fe3f:726a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cf:3f:72:6a  txqueuelen 0  (Ethernet)
        RX packets 5377240  bytes 99267991261 (99.2 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11959119  bytes 817538696 (817.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • inet 172.17.0.1 是IP地址
  • broadcast 172.17.255.255 是广播地址
  • netmask 255.255.0.0 是子网掩码

要从ifconfig输出中提取IP地址,可以使用

$ ifconfig docker0 |egrep -o "inet [^ ]*"|grep -o "[0-9.]*"
172.17.0.1

硬件地址(MAC地址)欺骗

如果采用了基于硬件地址的认证或过滤,那么我们可以使用硬件地址欺骗(hardware address spoofing)。硬件地址在ifconfig输出中是以HWaddr 00:1c:bf:87:25:d2形式出现的。

ifconfig的子命令可以定义设备类别以及MAC地址

# ifconfig eth0 hw ether 00:1c:bf:87:25:d5

在上面的命令中,00:1c:bf:87:25:d5是分配的新MAC地址。如果我们需要通过部署了MAC 认证的服务提供商才能够访问Internet,这招就能发挥作用了

名字服务器与DNS(域名服务)

Internet底层的寻址方案是采用点分十进制形式的IP地址(例如83.166.169.231)。相较于数字, 人类更喜欢使用文字,因此Internet上的资源是通过被称为URL或域名的字符串来标识的。例如, www.packpub.com就是一个域名,它对应着一个IP地址。在浏览器中输入IP地址或域名都可以访 问到该站点。

将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

我们可以编辑该文件来手动添加名字服务器或是使用下面的命令

# sudo

echo nameserver IP_ADDRESS >> /etc/resolv.conf

获取域名所对应IP地址的最简单方法就是用ping命令访问指定的域名。命令的回应信息中就 包含了IP地址

$ ping google.com 
PING google.com (64.233.181.106) 56(84) bytes of data.

64.233.181.106是google.com对应的IP地址

一个域名可以对应多个IP地址。对于这种情况,ping只会显示其中的一个地址。要想获取分 配给域名的所有IP地址,就得使用DNS查找工具了

DNS查找

host命令会列出某个域名所有的IP地址

$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 180.101.49.11
www.a.shifen.com has address 180.101.49.12

nslookup命令可以完成名字与IP地址之间的相互映射

$ nslookup www.baidu.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 180.101.49.11
Name:   www.a.shifen.com
Address: 180.101.49.12

上面第一行对应着用于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

显示路由表信息

多个网络相互连接是很常见的场景。例如,工作场所或学校的不同部门可能处于不同的网络 中。如果一个网络中的设备想同另一个网络中的设备通信,就需要借助某个同时连接了两个网络 的设备发送分组。这个特殊的设备叫作网关,它的作用是在不同的网络中转发分组。

操作系统维护着一个叫作路由表的表格,它包含了分组如何转发的信息。route命令可以显 示路由表:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 eno1
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 eno1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1

# 也可以使用
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eno1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
# -n指定以数字形式显示地址。默认情况下,route命令会将IP地址映射为名字

route add命令可以添加默认网关

# route add default gw IP_ADDRESS INTERFACE_NAME

# 例如:

# route add default gw 192.168.0.1 wlan0

ping

ping是一个基础的网络命令,所有主流操作系统都支持该命令。ping可用于检验网络上主 机之间的连通性,找出活动主机

检查某台主机是否可达

$ ping ADDRESS
# 默认情况下,ping会连续发送分组,回应信息将被打印在终端上。可以用Ctrl+C来停止ping 命令

# 如果主机可达,那么会输出如下信息
$ ping 10.18.11.214
PING 10.18.11.214 (10.18.11.214) 56(84) bytes of data.
64 bytes from 10.18.11.214: icmp_seq=1 ttl=62 time=1.08 ms
64 bytes from 10.18.11.214: icmp_seq=2 ttl=62 time=0.994 ms
64 bytes from 10.18.11.214: icmp_seq=3 ttl=62 time=0.961 ms
^C
--- 10.18.11.214 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.961/1.011/1.080/0.050 ms

# 如果主机不可达,则输出如下信息
$ ping 10.18.7.13
PING 10.18.7.13 (10.18.7.13) 56(84) bytes of data.
From 10.18.7.30 icmp_seq=1 Destination Host Unreachable
From 10.18.7.30 icmp_seq=2 Destination Host Unreachable
From 10.18.7.30 icmp_seq=3 Destination Host Unreachable
^C
--- 10.18.7.13 ping statistics ---
6 packets transmitted, 0 received, +3 errors, 100% packet loss, time 5068ms
pipe 3

往返时间

ping命令可以显示出每个分组的往返时间(Round Trip Time,RTT)。RTT的单位是毫秒。在 内部网络中,RTT基本上还不到1ms。在Internet上,RTT通常在10ms到400ms之间,有可能还会 超过1000ms

--- google.com ping statistics --
5 packets transmitted, 5 received, 0% packet loss, time 4000ms 
rtt min/avg/max/mdev = 118.012/206.630/347.186/77.713 ms

其中,最小的RTT是118.012ms,平均RTT是206.630ms,最大的RTT是347.186ms。ping输出中的 mdev(77.713ms)代表的是平均偏差(mean deviation)

序列号

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

在这个例子中,第二个分组被丢弃了,超时之后又进行了重发,因此在返回的时候出现了乱序, RTT时间也更长

生存时间

ping命令发送的每个分组都有一个可以在被丢弃前完成的跳数,这个值是预先定义好的。 分组途径的每个路由器会将该值减1。它表明了发出ping命令的主机和目的主机之间相隔了多少 个路由器。依据你所使用的系统或ping命令版本的不同,生存时间(Time To Live,TTL)的初 始值也不尽相同。你可以通过向环回接口发起ping命令来确定TTL的初始值

$> ping 127.0.0.1 
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.049 ms 
$> ping www.google.com
64 bytes from 173.194.68.99: icmp_seq=1 ttl=45 time=49.4 ms

在本例中,我们向环回地址发起ping命令,以此决定TTL的值。因为是环回地址,所以跳数不会 发生变化(仍是64)① 。然后向远程站点发起ping命令,使用TTL的初始值减去回应中的TTL值, 就得到了两个位置之间的跳数。在这里是19跳(64-45)。

两个位置之间的TTL值通常是固定的,但如果路径发生了变化,TTL的值也会随之变化。

限制发送的分组数量

我们可以用选项-c限 制所发送的echo分组的数量

$ ping 10.18.11.214 -c 2
PING 10.18.11.214 (10.18.11.214) 56(84) bytes of data.
64 bytes from 10.18.11.214: icmp_seq=1 ttl=62 time=0.841 ms
64 bytes from 10.18.11.214: icmp_seq=2 ttl=62 time=0.891 ms

--- 10.18.11.214 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1029ms
rtt min/avg/max/mdev = 0.841/0.866/0.891/0.025 ms

ping命令的返回状态

ping命令如果执行顺利,会返回退出状态0;否则,返回非0。执行顺利意味着目标主机可 达,执行失败意味着目标主机不可达

$ ping domain -c2 
if [ $? -eq0 ]; then
	echo Successful 
else
	echo Failure 
fi

跟踪 IP 路由

当应用程序通过Internet请求服务时,服务器可能位于远端,两者之间通过多个网关或路由器 相连。traceroute命令可以显示分组途径的所有网关的地址。这些信息可以帮助我们搞明白分 组到达目的地需要经过多少跳。中途的网关或路由器的数量给出了网络上两个节点之间的有效距 离,这未必和物理距离有关。传输时间会随着每一跳增加。对于路由器而言,接收、解析以及发 送分组都是需要花时间的

$ 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

列出网络中所有的活动主机

在这则攻略中,我们演示了两种方法。分别使用ping和fping。在脚本中使用fping更容易 些,而且比ping拥有更多的特性。fping默认并没有包含在Linux发行版中,需要用软件包管理 器手动安装

#!/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

#!/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命令会等待所有的子进程 结束后再终止脚本

使用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设备
    也可以采用命令行参数的方式手动指定一组IP地址,或者作为列表文件从stdin中接收。 例如
$ fping -a 192.168.0.1 192.168.0.5 192.168.0.6 
# 将IP地址作为参数传递 $ fping -a < ip.list 
# 从文件中传递一组IP地址

使用 SSH 在远程主机上执行命令

连接运行了SSH服务器的远程主机

$ 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 mec@proxy-1:~$

连接运行在端口422之上的SSH服务器

$ ssh user@locahost -p 422

要想在远程主机中执行命令,在本地shell中显示命令输出,可以这样做

$ ssh mec@192.168.0.1 'whoami' mec

$ ssh mec@192.168.0.1 "echo user: $(whoami);echo OS: $(uname)"
Password:
user: mec 
OS: Linux
# 在这个例子中,在远程主机上执行的命令是
echo user: $(whoami)
echo OS: $(uname)

SSH的压缩功能

SSH协议也支持对数据进行压缩传输。当带宽有限时,这一功能很方便。用ssh命令的选项 -C启用这一功能

$ ssh -C user@hostname COMMANDS

将数据重定向至远程shell命令的stdin

$ echo 'text' | ssh user@remote_host 'echo' text
#或者
# 重定向文件中的数据 
$ ssh user@remote_host 'echo'< file

# 这项功能可以将本地主机上的tar存档文件传给远程主机。这在第7章中有过详述:
$ tar -czf - LOCALFOLDER | ssh 'tar -xzvf-'

在远程主机上执行图形化命令

如果你打算在远程主机上执行采用了图形化窗口的命令,就会碰上类似于cannot open display 之类的错误。这是因为ssh shell尝试连接远程主机上的X服务器失败造成的

要想在远程主机上运行图像化应用你需要设置变量$DISPLAY来强制应用程序连接到本地主 机上的X服务器

ssh user@host "export DISPLAY=:0 ; command1; command2"""

这将启用远程主机上的图形化输出
如果你想在本地主机上显示图形化输出,使用SSH的X11转发选项(forwarding option)

ssh -X user@host "command1; command2"

通过网络传输文件

文件传输协议(File Transfer Protocol,FTP)是一个古老的协议,在很多公共站点上用于文 件共享。FTP服务器通常运行在端口21上。远程主机上必须安装并运行FTP服务器才能使用FTP。 我们可以使用传统的ftp命令或更新的lftp命令访问FTP服务器。两者都支持下面要讲到的命 令。很多公共网站都是用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会话

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

选项-u可以使用我们定义的USER和PASSWD登入远程站点。binary命令将文件模式设置为 二进制

SFTP(Secure FTP,安全FTP)

SFTP是一个运行在SSH连接之上并模拟了FTP接口的文件传输系统。它不需要远端运行FTP 服务器来进行文件传输,但必须要有SSH服务器。sftp是一个交互式命令,提供了命令提示符
启动sftp会话

$ sftp user@domainname

和lftp类似,输入quit命令可以退出sftp会话
SSH服务器有时候并不在默认的端口22上运行。如果它在其他端口运行,我们可以在sftp 中用选项-oPort=PORTNO来指定端口号

$ sftp -oPort=422 user@slynux.org
# -oPort应该作为sftp命令的第一个参数

SCP(Secure Copy Program,安全复制程序)

SCP是一个安全的文件复制命令,和旧式的、不安全的远程复制命令rcp类似。文件均通过 SSH加密通道进行传输

$ scp filename user@remotehost:/home/path

SOURCE或DESTINATION可以采用形如username@host:/path的格式

$ scp user@remotehost:/home/path/filename filename

用SCP进行递归复制

$ scp -r /home/usernameuser@remotehost:/home/backups 
# 将目录/home/username递归复制到远程主机中

scp的选项-p能够在复制文件的同时保留文件的权限和模式

连接无线网络

#!/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
# iwconfig命令用它关联无线网卡与对应的无线网络
/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

iwlist工具能够扫描并列出可用的无线网络

# iwlist scan wlan0 
Scan completed :
Cell 01 - Address: 00:12:17:7B:1C:65 
Channel:11 
Frequency:2.462 GHz (Channel 11) 
Quality=33/70 Signal level=-77 dBm 
Encryption key:on 
ESSID:"model-2"

实现 SSH 的无密码自动登录

设置SSH认证自动化需要两步

  1. 在本地主机上创建SSH密钥
  2. 将生成的公钥传给远程主机并将其加入到文件 ~/.ssh/authorized_keys中(这一步需要访问 远程主机)
# 输入命令ssh-keygen创建SSH密钥,指定加密算法类型为RSA
$ ssh-keygen -t rsa Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is: f7:17:c6:4d:c9:ee:17:00:af:0f:b3:27:a6:9c:0a:05 username@slynux-laptop The key's randomart image is:
# ssh-keygen程序会生成两个文件:~/.ssh/id_rsa.pub和~/.ssh/id_rsa。其中前者是公钥,后者是 私钥。公钥必须添加到想要自动登入的远程服务器的~/.ssh/authorized_keys文件中

# 可以使用下列命令添加密钥文件
$ ssh USER@REMOTE_HOST  "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub 
Password:

使用 SSH 实现端口转发

端口转发可以将来自某台主机的IP连接重定向到另一台主机。如果你使用Linux/Unix系统作 为防火墙,你可以将端口1234上的连接重定向到其他内部地址(如192.168.1.10:22),从而为外部 提供一个可以抵达内部主机的ssh隧道

  • 下列命令会将本地主机端口8000上的流量转发到www.kernel.org的端口80上
ssh -L 8000:www.kernel.org:80 user@localhost
  • 下列命令会将远程主机端口8000上的流量转发到www.kernel.org的端口80上
ssh -L 8000:www.kernel.org:80 user@REMOTE_MACHINE

非交互式端口转发

如果你只是想设置端口转发,而不希望在端口转发时有一个总是保持打开状态的shell,那么 可以像下面这样使用ssh

ssh -fL8000:www.kernel.org:80 user@localhost -N

-f指定ssh在执行命令前转入后台运行,-N告诉ssh无需执行命令,只进行端口转发

反向端口转发

反向端口转发是SSH最强大的特性之一。如果你有一台无法通过Internet访问到的主机,但是 又希望其他用户可以访问这台主机上的服务,那就是反向端口转发大显身手的时候了。如果你能 够使用SSH访问一台可以通过Internet访问的远程主机,那么就可以在这台主机上设置反向端口转 发,将流量转发到运行该服务的本地主机

ssh -R 8000:localhost:80 user@REMOTE_MACHINE

上述命令会将远程主机端口8000上的流量转发到本地主机的端口80上。和之前一样,别忘了把 REMOTE_MACHINE替换成远程主机的主机名或IP地址

在本地挂载点上挂载远程驱动器

在执行数据读写操作时,如果可以通过本地挂载点访问远程主机文件系统,那就再好不过了。 SSH是网络中常用的文件传输协议。sshfs利用SSH实现了在本地挂载点上挂载远程文件系统

GNU/Linux发布版默认并不包含sshfs。请使用软件包管理器自行安装。sshfs是FUSE文件 系统软件包的一个扩展,它允许用户像本地文件系统那样挂载各种数据。Linux、Unix、Mac OS/X、Windows等都支持FUSE的各种版本

将位于远程主机上的文件系统挂载到本地挂载点上

# sshfs -o allow_other user@remotehost:/home/path /mnt/mountpoint 
Password:

在收到提示时输入密码。 现在位于远程主机 /home/path 中的数据就可以通过本地挂载点 /mnt/mountpoint来访问了
使用下面的命令卸载

# umount /mnt/mountpoint

分析网络流量与端口

每一个应用程序都需要通过端口访问网络。通过获取开放端口列表、使用特定端口的应用以 及运行该应用的用户,是跟踪系统中出现预期和非预期行为的一种方法。这些信息既可用于分配 资源,也可用于检查rootkits或其他恶意软件

lsof(list open files)命令可以列出已打开的文件。选项-i将范围限制在已打开的网络连接

$ lsof -i
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
chrome     3586 amlogic  148u  IPv4     54145      0t0  UDP 224.0.0.251:mdns 
chrome     3586 amlogic  151u  IPv4     54143      0t0  UDP 224.0.0.251:mdns 
chrome     3707 amlogic   25u  IPv4 372686990      0t0  TCP amlogic-ThinkCentre-M930t-N000:60906->203.208.50.65:https (ESTABLISHED)
chrome     3707 amlogic   87u  IPv4 119264029      0t0  UDP 224.0.0.251:mdns 
chrome     3707 amlogic   91u  IPv4 119264031      0t0  UDP 224.0.0.251:mdns 
java     831468 amlogic   31u  IPv6   8389770      0t0  TCP localhost:6942 (LISTEN)
java     831468 amlogic   55u  IPv6   8380573      0t0  TCP localhost:63342 (LISTEN)
adb     1853441 amlogic   11u  IPv4 127110125      0t0  TCP localhost:5037 (LISTEN)
adb     1853441 amlogic   38u  IPv4 369947497      0t0  TCP localhost:39761 (LISTEN)

用netstat查看开放端口与服务

netstat也可以显示网络服务统计信息。该命令的功能非常多,已经超出了这则攻略的范围

$ netstat –tnp|head 
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 amlogic-ThinkCent:53294 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53310 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53360 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53304 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53318 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53340 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53344 _gateway:http           TIME_WAIT  
tcp        0      0 amlogic-ThinkCent:53336 _gateway:http           TIME_WAIT  

测量网络带宽

之前介绍的ping和traceroute能够测量网络的延迟以及节点间的跳数。
iperf能够提供更多的网络性能指标。系统中默认并没有安装该命令,可以通过发行版的包 管理器自行安装
iperf必须安装在链路的两端(服务器端和客户端)
安装好之后,启动服务器端

$ iperf -s
# 然后运行客户端,生成吞吐量统计
$ iperf -c 192.168.1.36

-----------------------------------------------------------
Client connecting to 192.168.1.36, TCP port 5001 
TCP window size: 19.3 KByte (default)
------------------------------------------------------------

[ 3] local 192.168.1.44 port 46526 connected with 192.168.1.36 port 5001 
[ ID] Interval Transfer Bandwidth 
[ 3] 0.0-10.0 sec 113 MBytes 94.7 Mbits/sec

# 选项-m会使得iperf找出最大传输单元(Maximum Transfer Size,MTU)
$ iperf -mc 192.168.1.36

-----------------------------------------------------------
Client connecting to 192.168.1.36, TCP port 5001 TCP window size: 19.3 KByte (default)
------------------------------------------------------------

[ 3] local 192.168.1.44 port 46558 connected with 192.168.1.36 port 5001 
[ ID] Interval Transfer Bandwidth 
[ 3] 0.0-10.0 sec 113 MBytes 94.7 Mbits/sec 
[ 3] MSS size 1448 bytes (MTU 1500 bytes, ethernet)

创建套接字

对于文件传输和远程shell这类操作,我们有现成的工具( ftp 和 ssh )可以使用。我们也 可以编写自己的脚本实现网络服务。在这则攻略中,我们会演示如何创建简单的套接字并利用 其通信

netcat或nc命令都可以创建用于在TCP/IP网络上传输数据的套接字。我们需要两个套接字: 一个负责侦听连接,一个负责发起连接

设置侦听套接字

nc -l 1234
# 这会在本地主机的端口1234上创建一个侦听套接字

连接到该套接字

nc HOST 1234

如果是在运行着侦听套接字的主机上执行该命令,那么需要将HOST更换成localhost, 否则将其更换成其他主机的IP地址或主机名

在执行第2步操作的主机终端中输入信息并按回车键,消息就会出现在执行第1步操作的 主机终端中

在网络上快速复制文件

我们可以利用 netcat 和shell重定向在网络上复制文件。 下面的命令能够向侦听主机发送 文件

  • 在侦听端执行下列命令
nc -l 1234 > destination_filename
  • 在发送端执行下列命令
nc HOST 1234 < source_filename

创建广播服务器

你可以利用netcat创建定制服务器。下面的脚本创建了一个能够定时(每隔10秒)发送时 间的服务器。可以使用客户端连接到侦听端口获取时间

# 该脚本会将时间发送到端口 
while [ 1 ]; do # 死循环
	sleep 10
	date  # 调用date命令并通过管道将命令输出传给nc命令
done | nc -l 12345 
echo exited

搭建网桥

如果你有两个独立的网络,可能需要某种方法将数据从一个网络传到另一个网络。这通常可 以通过使用路由器、集线器或交换机连接两个网络来实现。

Linux系统可以作为网桥使用。

网桥是一种低层连接,它并不是基于IP地址,而是使用MAC地址传递分组。其自身需要的资 源更少,效率也更高。

你可以使用网桥连接不可路由的私有网络(private, non-routed network)中的主机,或是连 接公司中独立的子网,亦或是将生产子网与运送子网互联,实现产品信息共享

在下面的例子中,有两个网卡:eth0被配置连接到子网192.168.1.0,eth1没有配置,但会 通过网桥连接到子网10.0.0.0

# 创建名为br0的新网桥 
ip link add br0 type bridge

# 将以太网适配器添加到网桥 
ip link set dev eth1 master br0

# 配置网桥的IP地址 
ifconfig br0 10.0.0.2

# 启用分组转发 
echo 1 >/proc/sys/net/ipv4/ip_forward

所创建出的网桥使得分组可以在eth0和eth1之间传递。在网桥生效之前,我们需要将其加 入路由表。

对于网络10.0.0.0/24中的主机,添加到网络192.168.1.0/16路由表项

route add -net 192.168.1.0/16 gw 10.0.0.2

网络192.168.1.0/16中的主机需要知道如何找到网络10.0.0.0/24 。 如果 eth0 配置了IP地址 192.168.1.2,则使用route命令

route add -net 10.0.0.0/24 gw 192.168.1.2

Internet 连接共享

大多数防火墙/路由器都能够让你的家庭或办公室设备共享Internet连接。这种技术叫作网络 地址转换(Network Address Translation,NAT)。安装了两块网络接口卡(Network Interface Card, NIC)的Linux计算机可以用作路由器,提供防火墙保护以及连接共享。

防火墙和NAT功能都是由建立在内核中的 iptables 所提供的。这则攻略介绍了如何通过 iptables实现以太网与无线设备之间的Internet连接共享

我们使用iptables设置了网络地址转换,使得多个联网设备能够共享Internet连接。你需要 使用iwconfig命令来获得无线接口的名称

  1. 连接到Internet。在这里我们假设使用的是有线网络连接,通过eth0连接到Internet。请按 照你个人的实际情况进行修改
  2. 使用发行版自带的网络管理工具,创建一个新的ad hoc无线连接,配置如下
    • IP地址:10.99.66.55
    • 子网掩码:255.255.0.0(16)
  3. 使用下面的shell脚本来实现Internet连接共享
#!/bin/bash 
#文件名: netsharing.sh 
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -A FORWARD -i $1 -o $2 -s 10.99.0.0/16 -m conntrack --ctstate NEW -j ACCEPT 
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A POSTROUTING -t nat -j MASQUERADE
  1. 执行脚本
./netsharing.sh eth0 wlan0
# 其中, eth0是连接到Internet的接口, wlan0是无线接口,支持与其他设备共享Internet 连接
  1. 将设备连接到刚才创建的无线网络
    • IP地址:10.99.66.56(以此类推)
    • 子网掩码:255.255.0.0

有3组不能被路由的IP地址① 。这意味着能接入Internet的网卡都不能使用这些地址。只有内部 网络可以使用。这3组地址分别是10.x.x.x、192.168.x.x以及172.16.x. x-> 172.32.x.x。在这则攻略 中,我们从10.x.x.x地址空间中选用了一部分作为内部网络地址。

默认情况下, Linux系统只接收或生成分组, 并不会重传(echo)分组。 这种行为是由 in/proc/sys/net/ipv4/ip_forward的值所控制的。

将该值设置为1会使Linux转发所有无法识别的分组。在子网10.99.66.x上的无线设备可以使用 10.99.66.55作为网关。这些无线设备会将发往Internet的分组交给10.99.66.55,由后者将分组再转 发给eth0上的Internet网关,然后送至目的地。

iptables命令负责与Linux内核中的iptables子系统交互。该命令可以添加各种规则,从而在 内部网络和外部网络之间转发分组。

使用 iptables 架设简易防火墙

防火墙是一种网络服务,它可以过滤、阻止不需要的网络流量,允许正常的网络流量通过。 Linux中的标准防火墙工具是iptables,它目前已经被集成到了内核中

如今所有的Linux发行版中默认都包含了iptables。对于一些典型的场景,iptables用起 来很简单

  1. 如果你不希望访问特定站点(例如恶意站点),可以阻止发送到该IP地址的流量
# iptables -A OUTPUT -d 8.8.8.8 -j DROP
# 如果在另一个终端中执行PING 8.8.8.8,然后再执行iptables命令,你会看到:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=56 time=221 ms 
64 bytes from 8.8.8.8: icmp_req=2 ttl=56 time=221 ms 
ping: sendmsg: Operation not permitted 
ping: sendmsg: Operation not permitted
# ping 命令在执行到第三次的时候失败了, 这是因为我们使用 iptables 将所有发送到 8.8.8.8的流量给丢弃了。
  1. 阻止发送到特定端口的流量
#iptables -A OUTPUT -p tcp -dport 21 -j DROP 
$ ftp ftp.kde.org 
ftp: connect: Connection timed out
# 如果你在/var/log/secure或/var/log/messages中发现类似于下面的信息,就说明 碰上了一点小麻烦:
Failed password for abel from 1.2.3.4 port 12345 ssh2 
Failed password for baker from 1.2.3.4 port 12345 ssh2
# 这些信息说明有机器人正在探测你的系统是否存在弱密码。你可以使用INPUT规则阻止机器 人访问站点,这条规则会丢弃所有机器人所在地址的流量:
# iptables -I INPUT -s 1.2.3.4 -j DROP

iptables是Linux系统中用来配置防火墙的命令。iptables中的第一个选项可以是-A,表 明向链(chain)中添加一条新的规则,也可以是-I,表明将新的规则插入到规则集的开头。接 下来的参数指定了链。所谓链就是若干条规则的集合,在早先的例子中我们使用的是OUTPUT链, 它可以控制所有的出站流量(outgoing traffic),而在上一个例子中,用到的是INPUT链,它能够 控制所有的入站流量(incoming traffic)。

-d指定了所要匹配的分组目的地址,-s指定了分组的源地址。最后,-j指示iptables执行到特定的处理(action)。在这些例子中,我们对分组采用的处理方式是DROP(丢弃)。其他处理 方式还包括ACCEPT和REJECT。

在第二个例子中,-p指定规则仅适用于TCP,-dport指定了对应的端口。这样我们就可以 只阻止所有出站的FTP流量了。

可以使用选项-flush清除对iptables链所作出的所有改动

#iptables -flush
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值