Network and Remote Interaction

netstat:Network Statistics,查看本机网络信息

netstat程序被用来检测各种各样的本机网络设置。通过选用不同的选项,我们可以查看有关本机的不同网络信息。

1
netstat [OPTION]

如,-ie选项使得我们可以查看本系统的所有网络接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[meme@localhost ~]$ netstat -ie
Kernel Interface table
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.115.128 netmask 255.255.255.0 broadcast 192.168.115.255
inet6 fe80::9b04:dd5e:b9d5:202f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0a:87:bc txqueuelen 1000 (Ethernet)
RX packets 3440 bytes 258371 (252.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 654 bytes 80314 (78.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

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 1 (Local Loopback)
RX packets 456 bytes 95634 (93.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 456 bytes 95634 (93.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...

上述两个网络接口中,第一个ens33是因特网接口,主要信息有IPv4地址、掩码以及IPv6地址等;第二个接口lo就是我们常说的内部回环网络接口,其IPv4地址以127开头。

-ie外还有许多选项,如-r选项可以查看本机的路由表等。

wget:World Wide Web Get,从网页中下载文件

wget程序将互联网上的文件下载到当前目录,它的使用很简单,一般为wget+目标文件的域名(URL)。

1
wget [OPTION]... [URL]...

ssh:Secure Shell,安全的远程登陆

ssh既是一个互联网协议,又是Linux命令行中的一个程序。在SSH之前,常用的远程登录协议有Rlogin和Telnet,这两个协议的重大缺陷是所有的通讯信息均以明文的方式传播,因而十分地不安全。SSH从两个方面解决了这个问题:

  1. SSH客户端所连接的远程主机必须为客户端所知,由此阻止了中间人攻击;
  2. SSH对本地客户端主机和远程主机之间的通信进行了加密。

SSH由两部分组成,运行在本地的SSH客户端和运行在远端主机的SSH服务器。一般来说,Linux发行版会自带一个提供SSH功能的软件包OpenSSH,它包括OpenSSH-client和OpenSSH-server两个分别提供客户端和服务器服务的程序,但是有些发行版(如Ubuntu)的OpenSSH只包含了OpenSSH-client。要想让系统能够接受远程客户端的连接,则必须手动安装OpenSSH-server。

SSH配置

无论是想让系统充当远程的服务器还是想让系统能够作为客户端连接远程主机,都必须要正确地配置相关的SSH文件。对于Linux系统,SSH服务器的配置文件通常是/etc/ssh/sshd_config,SSH客户端的配置文件通常是~/.ssh/config,以上两个文件若没有则需要自己创建。

SSH客户端配置与连接

对于一般用户来说,SSH客户端是更常用的一方,因此只介绍SSH客户端的配置。通常,有4个主要配置项:

1
2
3
4
Host [HOST NAME]
HostName [HOST IP]
User [USER NAME]
Port [PORT]

其中,Host是用户为该远程主机指定的标识符,可任意;HostName是该远程主机的公网IP地址;User则是用户登录远程主机时的默认身份,该身份必须是远程主机上有且允许远程登录的用户;Port是要连接的SSH服务器监听的端口,要与远程主机SSH服务器配置文件中的端口匹配。配置完成后,我们便可用命令:

1
2
ssh [HOST NAME] 或
ssh [HOST IP]

连接远程主机。当然,我们也可以以远程主机允许的其他用户身份登录:

1
ssh [OTHER USER NAME]@[HOST NAME]

一般来说,我们登录远程主机的验证方式默认为输入登录用户的密码,当然也可以在配置文件中增加IdentityFile选项使得我们能以私钥文件的形式实现免密登录。

1
2
3
4
5
6
7
8
9
[meme@localhost ~]$ ssh remote-sys
The authenticity of host 'remote-sys (xxx.xxx.xxx.xxx)' can't be
established.
ECDSA key fingerprint is xxxxxxxxxxxxxxxxxxx.
ECDSA key fingerprint is xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added 'remote-sys,xxx.xxx.xxx.xxx' (RSA) to the list
of known hosts.
Bob@xxx.xxx.xxx.xxx's password:

第一次登录未曾登录过的远程主机时,客户端会启动保护机制,如上面的Are you sure...。成功输入密码后,我们便进入了远端的shell会话,直到我们输入exit,该会话都会一直存在。

需要注意的是,有时远程登录会报错Bad owner or permissions on ~/.ssh/config,这是因为有其他的用户拥有了对~/.ssh/config的使用权限,我们只要用chmod 600 ~/.ssh/config使得该文件只能由文件拥有者操作即可。

若没有可用的远程主机,则可以用localhost作为远端主机名,此时计算机会和自己建立“远程连接”且无需输入密码。

1
2
3
4
5
6
7
8
9
[meme@localhost ~]$ ssh localhost
Last login: Tue Aug 1 03:58:03 2023 from localhost
[meme@localhost ~]$ date
Tue Aug 1 04:00:53 PDT 2023
[meme@localhost ~]$ exit
logout
Connection to localhost closed.
[meme@localhost ~]$ date
Tue Aug 1 04:01:04 PDT 2023

有时,我们只想用远程主机执行个位数的命令,那么我们就没有必要登录又退出远程主机,而是可以直接在连接过程中就发送我们想要执行的命令:

1
2
3
4
5
6
7
[meme@localhost ~]$ ssh remote-sys 'ls ..'
Bob@xxx.xxx.xxx.xxx's password:
dev
...
var
Killed by signal 1.
[meme@localhost ~]$

上面的ls ..让远程主机执行ls命令列出默认登录目录的父目录的内容,然后就退出登录。特别需要注意的是,引号表示该命令由远程主机执行,因此下面两个命令得到的是完全不同的结果:

1
2
[meme@localhost ~]$ ssh remote-sys 'ls ..' > dirlist.txt
[meme@localhost ~]$ ssh remote-sys 'ls .. > dirlist.txt'

其中,第一个命令是让远程主机列出父目录的内容并将结果重定向至本地的dirlist.txt文件;而第二个命令则是让远程主机列出父目录的内容并将结果重定向至远程主机dirlist.txt文件。

scp:Secure Copy,安全的远程复制

scp是OpenSSH的内置程序,它基于SSH实现安全的远程复制:

1
scp [[USER@]HOST:]FILE

它的用法很简单,scp+SSH远程服务器+目标文件。程序运行的结果是远程的目标文件被复制到本地目录。

1
[meme@localhost ~]$ scp remote-sys:document.txt

sftp:Secure FTP,安全的FTP

sftp是用SSH强化了安全性的FTP协议,它也是OpenSSH的内置程序,同样也是基于SSH实现的。其用法与常规的ftp命令完全一样,只不过远程的SSH服务器充当了FTP服务器:

1
2
3
4
5
6
7
8
9
10
11
[meme@localhost ~]$ sftp remote-sys
Connecting to remote-sys...
me@remote-sys's password:
sftp> ls
ubuntu-8.04-desktop-i386.iso
sftp> lcd Desktop
sftp> get ubuntu-8.04-desktop-i386.iso
Fetching /home/me/ubuntu-8.04-desktop-i386.iso to ubuntu-8.04-
desktop-i386.iso
/home/me/ubuntu-8.04-desktop-i386.iso 100% 699MB 7.4MB/s 01:35
sftp> bye

输入密码后,我们将登录远程的shell。lcd指令即“Local Change Directory”,是指切换本地主机,即客户端主机的目录,而cd才是切换远程服务器的目录。get使得远程的文件被传输到本地主机的Desktop目录下。输入byeexitquit我们将退出远程服务器。

参考