[关闭]
@dungan 2022-11-16T07:55:14.000000Z 字数 9322 阅读 127

Linux

linux 常用小工具


『接口调试』,『文件传输』,『服务器登入』等经常在图形界面做的操作,其实 linux 在命令行中也提供了一些工具来做这些事,例如『curl,wget,ssh,scp...』等,本节就来介绍下如何使用这些工具。

Curl

curl 是一个在命令行下工作的文件传输工具,持包括HTTP、HTTPS、ftp 等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。

它提供了很多选项来支持发送请求,curl -h 可以查看其使用帮助。

1. 设置请求方法 -x

  1. curl -X POST www.aaa.com
  2. curl -X GET www.aaa.com

2. post方法提交表单 --data/-d

  1. [root@centos] curl --data "name=xxx&passwd=xxx" https://mysite.net/api/login
  2. {
  3. "status": true,
  4. "code": 0,
  5. "msg": "成功"
  6. }

如果你提交的字段里面有特殊字符,例如空格之类的,还可以使用 --data-urlencode 对表单字段进行编码

  1. [root@centos] curl data-urlencode "name=I am tcl&passwd=xxx" https://mysite.net/api/login

对于 get 方法提交表单,只需要将字段添加到url中的查询字符串处就行了

  1. [root@centos] curl https://mysite.net/api/login?name=xxx&passwd=xxx

3. 上传文件 --form

html 中的文件我们是这样上传的

  1. <form method="POST" enctype='multipart/form-data' action="http://aaa.com/upload">
  2.   <input type=file name=upload>
  3.   <input type=submit name=press value="OK">
  4. </form>

对应在 curl 使用如下

  1. # localfilename 就是你要上传的文件
  2. curl --form upload=@localfilename --form press=OK http://aaa.com/upload

--cookie 来设置携带的 cookie,多个 cookie 使用分号分割

  1. curl --cookie "user=root;passwd:xxx" http://www.aaa.com

如果 cookie 太长,,可以将其存到文件,使用 -b 选项读取

  1. curl -b request_cookies http://aaa.com

还可以使用 -c 选项保存服务器返回的 cookie 到某个文件

  1. curl -c response_cookies http://aaa.com

如果想让 curl 自动保存新的 cookie,且提交请求时带上刚刚返回的 cookie 时,则应将读取的 cookie 文件和服务器响应的 cookie 文件设为相同

  1. curl --cookie "cookie.txt" --cookie-jar "cookie.txt" http://www.aaa.com

5. 设置请求头信息 -H/--header

如果有多个头信息,请多次使用该选项

  1. [root@centos tmp]# curl --header "Connection: keep-alive" -H "Cache-Control: no-cache" http://baidu.com
  2. <html>
  3. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
  4. </html>

6. 打印响应头信息 -I/--head

  1. [root@centos tmp]# curl -I baidu.com
  2. HTTP/1.1 200 OK
  3. Date: Fri, 15 Mar 2019 04:16:20 GMT
  4. Server: Apache
  5. Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
  6. ETag: "51-47cf7e6ee8400"
  7. Accept-Ranges: bytes
  8. Content-Length: 81
  9. Cache-Control: max-age=86400
  10. Expires: Sat, 16 Mar 2019 04:16:20 GMT
  11. Connection: Keep-Alive
  12. Content-Type: text/html

还有两个选项 -i-D, 选项 -i 可以输出网页代码和响应头信息,选项 -D 则可以让你将 header 写入文件中。

7. 网页跳转 -L

该选项可以支持跳转到某个网页,适用于爬虫类的业务场景

  1. [root@centos tmp]# curl -L baidu.com
  2. <html>
  3. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
  4. </html>

8. 查看服务器通信过程 -v

可以显示一次 http 通信的整个过程,包括端口连接和请求/响应头信息

  1. [root@centos tmp]# curl -v baidu.com
  2. * About to connect() to baidu.com port 80 (#0)
  3. * Trying 123.125.115.110...
  4. * Connected to baidu.com (123.125.115.110) port 80 (#0)
  5. > GET / HTTP/1.1
  6. > User-Agent: curl/7.29.0
  7. > Host: baidu.com
  8. > Accept: */*
  9. >
  10. < HTTP/1.1 200 OK
  11. < Date: Fri, 15 Mar 2019 06:27:46 GMT
  12. < Server: Apache
  13. < Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
  14. < ETag: "51-47cf7e6ee8400"
  15. < Accept-Ranges: bytes
  16. < Content-Length: 81
  17. < Cache-Control: max-age=86400
  18. < Expires: Sat, 16 Mar 2019 06:27:46 GMT
  19. < Connection: Keep-Alive
  20. < Content-Type: text/html
  21. <
  22. <html>
  23. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
  24. </html>
  25. * Connection #0 to host baidu.com left intact

还可以使用 --trace 将信息保存到文件,以便查看更详细的通信过程

  1. curl --trace trace.log baidu.com

9. 保存网页 -o

  1. # 搭配 --progress 可以显示进度条
  2. [root@centos tmp]# curl www.baidu.com -o baidu.html --progress
  3. % Total % Received % Xferd Average Speed Time Time Time Current
  4. Dload Upload Total Spent Left Speed
  5. 100 2381 100 2381 0 0 51292 0 --:--:-- --:--:-- --:--:-- 51760
  6. [root@centos tmp]# ll
  7. total 12
  8. -rw-r--r-- 1 root root 2381 Mar 15 11:19 baidu.html

10. 设置请求来源 --referer

  1. curl --referer http://www.aaa.com http://subsite.aaa.com

11. 设置用户代理 --user-agent/-A

  1. curl --user-agent "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36..." http://aaa.com
  2. curl -A "Mozilla/5.0..." http://aaa.com

12. 身份认证 -u

可以指定密码,也可以不指定密码在后续操作中输入密码

  1. curl -u name:password http://aaa.com
  2. curl -u name http://aaa.com

Wget

wget 用来从指定的URL下载文件,使用 wget -h 可以查看其帮助信息。

1. 下载单个文件

下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

  1. [root@centos test]# wget https://www.baidu.com/img/bd_logo1.png?qua=high&where=super
  2. [root@centos test]# ll
  3. total 8
  4. -rw-r--r-- 1 root root 7877 Sep 3 2014 bd_logo1.png?qua=high

可以看到下载的图片名被命名为url中最后一段,因此 wget 还支持对下载的文件重命名。

2. 下载并重命名 -O

  1. [root@centos test]# wget -O bd_log.png https://www.baidu.com/img/bd_logo1.png?qua=high&where=super
  2. [root@centos test]# ll
  3. total 8
  4. -rw-r--r-- 1 root root 7877 Sep 3 2014 bd_log.png

发现下载的图片确实被重命名为 bd_log.png 了。

3. 限速下载 --limit-rate

下载一个大文件时,它默认会占用全部可能的宽带下载,而你如果还需要下载其它文件就有必要限速了。

  1. [root@centos test]# wget --limit-rate=300k http://mirrors.cqu.edu.cn/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

4. 断点续传 -c

断点续传对于下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件

  1. wget -c http://mirrors.cqu.edu.cn/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

需要主要的是,如果你没有使用『断点续传』下载文件,那么每次你下载失败后再次重新下载,wget将会给文件加上一个.1后缀,如果.1后缀的存在,就加一个.2后缀,依次类推。

  1. [root@centos]# wget http://mirrors.cqu.edu.cn/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
  2. # 下载一会儿后我们 ctrl + c 中断后再次下载
  3. [root@centos]# ll
  4. total 964
  5. -rw-r--r-- 1 root root 984100 Mar 15 19:29 CentOS-7-x86_64-DVD-1810.iso
  6. [root@centos]# wget http://mirrors.cqu.edu.cn/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
  7. # 接着在当前目录下查看, 发现了 .1 后缀的重复文件
  8. [root@centos]# ll
  9. total 7648
  10. -rw-r--r-- 1 root root 984100 Mar 15 19:29 CentOS-7-x86_64-DVD-1810.iso
  11. -rw-r--r-- 1 root root 6842940 Mar 15 19:33 CentOS-7-x86_64-DVD-1810.iso.1

5. 后台下载 -b

  1. [root@centos]# [root@centos test]# wget -b https://www.baidu.com/img/baidu_resultlogo@2.png
  2. Continuing in background, pid 15121.
  3. Output will be written to wget-log’.

当然还可以使用 tail -f wget-log 移到前台来查看下载进度。

  1. [root@centos test]# tail -f wget-log
  2. Resolving www.baidu.com (www.baidu.com)... 180.97.33.108, 180.97.33.107
  3. Connecting to www.baidu.com (www.baidu.com)|180.97.33.108|:443... connected.
  4. HTTP request sent, awaiting response... 200 OK
  5. Length: 6511 (6.4K) [image/png]
  6. Saving to: baidu_resultlogo@2.png

6. 伪装代理

  1. [root@centos test]wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)" https://www.baidu.com/img/baidu_resultlogo@2.png

7. 测试下载链接是否有效 --spider

  1. [root@centos test]# wget --spider www.baidu.com
  2. # 如果有效会输出如下
  3. Spider mode enabled. Check if remote file exists.
  4. --2019-03-15 19:56:11-- http://www.baidu.com/
  5. Resolving www.baidu.com (www.baidu.com)... 180.97.33.108, 180.97.33.107
  6. Connecting to www.baidu.com (www.baidu.com)|180.97.33.108|:80... connected.
  7. HTTP request sent, awaiting response... 200 OK
  8. ...

8. 设置重试次数 --tries

如果你访问的资源迟迟没有回复,wget默认重试20次连接下载文件,而 --tries 则能让你自定义重试的次数。

  1. # 访问一个不存在的站点 www.aaa.com ,我们设置重试次数为一次
  2. [root@centos test]# wget --tries=1 www.aaa.com
  3. --2019-03-15 20:01:28-- http://www.aaa.com/
  4. Resolving www.aaa.com (www.aaa.com)... 63.240.178.211
  5. Connecting to www.aaa.com (www.aaa.com)|63.240.178.211|:80... failed: Connection timed out.
  6. Giving up.

9. 下载多个文件 -i

我们保存一份下载链接文件

  1. cat > filelist.txt
  2. url1
  3. url2
  4. url3
  5. url4

接着使用参数 -i 下载就可以下载这份文件的所有连接。

  1. wget -i filelist.txt

10. 镜像网站

  1. wget --mirror -p --convert-links -P ./LOCAL URL

10. 过滤指定格式的文件 --reject

比如我们爬某个站点时,忽略 .gif 格式的图片。

  1. # -r 是递归下载的意思,功能和爬虫一样
  2. wget -r --reject=gif url

11. 下载指定格式的文件 -A

例如爬某个站点时,我只想要 .html 文件。

  1. wget -r -A .html url

12. 把下载信息存入日志文件 -o

  1. wget -o download.log url

13. 限制总下载文件大小 -Q

这个限速的道理一样,考虑到你的硬盘容量,你可能相对下载文件的大小做个显示,需要注意的是这个参数对单个文件下载不起作用,只能递归下载时才有效。

  1. # 设置要下载的总大小不能超过5m
  2. wget -Q5m -r url

14. ftp 下载

ftp 如果要下载的 ftp 文件需要身份认证的话,请带上选项 --ftp-user--ftp-password

  1. wget ftp-url
  2. wget --ftp-user=user --ftp-password=passwd ftp-url

SSH

ssh 是一个客户端连接工具,它使用 ssh(Secure Shell) 加密协议实现安全的登录远程服务器,使用 SSH 时,所有传输的数据都进行了加密,所以在传输的过程中不易受到攻击。

还有一个好处就是使用 SSH 进行数据传输时,数据是经过压缩的,所以传输的速度比较快。利用 SSH 可以很方便的远程执行命令或者传输文件等等。

1. 账号密码登录

只需要一条简单的命令就可以登录服务器。

  1. # -p 是端口,端口可以不用指定,默认为22
  2. $ ssh -p 22 user@host

ssh 协议采用了公钥加密,过程如下:

  • 1 远程主机收到用户的登录请求,把自己的公钥发给用户。
  • 2 用户使用这个公钥,将登录密码加密后,发送回来。
  • 3 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这样远程服务器就能确保用户身份的合法性,可这样还有一个问题就是:

用户不知道它访问的远程服务器是不是合法的,如果有人截获用户登录请求将伪造的公钥发给用户,那么用户是很难辨别真伪的,那这样用户的密码就会被获取到,而这种风险就被称之为『中间人攻击』!

这也是为什么第一次登录远程主机时,会出现如下提示的原因:

  1. $ ssh root@192.168.109.137
  2. The authenticity of host '192.168.109.137 (192.168.109.137)' can't be established.
  3. ECDSA key fingerprint is 38:e2:9b:84:56:f6:3d:e6:15:8e:f1:73:10:21:8d:b3.
  4. Are you sure you want to continue connecting (yes/no)?

它询问你无法确定远程主机的合法性,问你还要继续么,如果你选择 yes,系统则提示你访问的主机已经被认可,并将该主机信息记录到了 known hosts 文件中,这个文件位于 $HOME/.ssh/known_hosts 中。

  1. Are you sure you want to continue connecting (yes/no)? yes
  2. Warning: Permanently added '192.168.109.137' (ECDSA) to the list of known hosts.

这时候你打开 $HOME/.ssh/known_hosts 你会发现多了一条以 192.168.109.137 开头的记录。

然后根据提示输入密码,就可以登录服务器了。

  1. $ ssh root@192.168.109.137
  2. root@192.168.109.137's password:
  3. Last login: Sat Mar 16 16:13:46 2019 from 192.168.109.1
  4. # 可以看到 centos 终端出现了
  5. [root@centos ~]#

2. 公钥登录

由于每次输入密码登录非常麻烦,因此还有另一种登录方法『公钥登录』。

公钥登录的原理:

  • 1 用户将自己的公钥储存在远程主机上。
  • 2 登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
  • 3 远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

如果你的系统里没有公钥,可先使用 ssh-keygen 来生成,生成过程很简单,一路回车就行了。

进入你的 $HOME/.ssh/ 下,可以看到两个文件,id_rsa.pub(公钥)和 id_rsa(私钥)。

  1. Administrator@WIN2008R2 ~/.ssh
  2. $ ls
  3. id_rsa id_rsa.pub known_hosts

2.1 将客户端公钥内容追加到远程服务器 authorized_keys 文件中

有了公钥以后,我们只需要将公钥添加进 $HOME/.ssh/authorized_keys 中就行了。

也可以使用 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.109.137 达到和下面操作等同的效果。

  1. Administrator@WIN2008R2 ~/.ssh
  2. $ ssh root@192.168.109.137 'cat >> .ssh/authorized_keys' < id_rsa.pub
  3. root@192.168.109.137's password:
  4. Administrator@WIN2008R2 ~/.ssh
  5. $ cat id_rsa.pub
  6. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDG23sMdPIADNB9MG+uTZXnB...

输入密码后,打开远程服务器上 authorized_keys 你会发现客户端的公钥被成功写入了。

  1. [root@centos ~]# ll .ssh/
  2. total 12
  3. -rw-r--r-- 1 root root 743 Mar 16 17:23 authorized_keys
  4. -rw------- 1 root root 1679 Mar 16 17:20 id_rsa
  5. -rw-r--r-- 1 root root 393 Mar 16 17:20 id_rsa.pub
  6. [root@centos ~]# cat .ssh/authorized_keys
  7. # 和 cat id_rsa.pub 的输出结果一样
  8. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDG23sMdPIADNB9MG+uTZXnB...

这样公钥登录就设置完成了,可以看到只要用户名和地址就可以登入服务器了。

  1. Administrator@WIN2008R2 ~/.ssh
  2. $ ssh root@192.168.109.137
  3. Last login: Sat Mar 16 16:39:08 2019 from 192.168.109.1
  4. [root@centos ~]#

备注: 如果发现无法使用公钥登入,则有可能是配置文件 /etc/ssh/sshd_config 引起的,需要将这几行的注释『#』去掉

  1. RSAAuthentication yes
  2. PubkeyAuthentication yes
  3. AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程主机的ssh服务

  1. service ssh restart

SCP

scp(Secure Copy) 命令用于跨服务器间的文件传输,数据传输使用 ssh 协议,并且使用了和 ssh 相同的认证方式。

上传本地文件到远程主机

  1. scp local_file user@host:remote_dir

上传本地目录到远程主机

  1. scp -r local_dir user@host:remote_dir

下载远程文件到本地

  1. scp user@host:remote_file local_dir

下载远程目录到本地

  1. scp -r user@host:remote_dir local_dir
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注