Linux_Shell腳本學習第八章-無網不利(上)

一、網絡設置

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命令用它關聯無線網卡與對應的無線網絡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章