bfchengnuo / MyRecord

平时充电做的笔记,一个程序猿的自我修养.
https://bfchengnuo.com/MyRecord/
32 stars 8 forks source link

Linux实用命令整理 #31

Open bfchengnuo opened 5 years ago

bfchengnuo commented 5 years ago

bfchengnuo commented 4 years ago

后台运行命令 & 与 nohub

当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上 & 实现后台运行。 例如:sh test.sh &

在后台运行作业时要当心,需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中: command > out.file 2>&1 &

其中 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了 out.file 文件,即将标准出错也输出到 out.file 文件中。最后一个 &, 是让该命令在后台执行。


使用 & 命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行

nohup 命令可以在你退出帐户之后继续运行相应的进程。nohup 就是不挂起的意思 ( no hang up )。该命令的一般形式为: nohup command &

如果使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件: nohup command > myout.file 2>&1 &

退出时,请使用正常的 exit 命令,意外退出可能导致后台任务的终止。

相关快捷键: ctrl + z:可以将一个正在前台执行的命令放到后台,并且处于暂停状态


如果不想要输出,可以这样写: nohup command > /dev/null 2>&1 &


这两个我用的其实不多,我还是喜欢用 screen 之前在博客写过,挺好用的。

bfchengnuo commented 4 years ago

后台运行程序管理 jobs

这个命令与上面的 & 与 nohub 是一类的,使用前面的命令将任务放到后台,那么想要拿出来怎么办,就是这个 jobs

恢复(工作号在 jobs 查看):

如果工作号省略那就是执行最后一个加入的,也就是带有 + 标识的,- 是倒数第二个。

bfchengnuo commented 4 years ago

pkill

我目前主要就是用它来 T 人,偶尔会有 session 卡在哪里,只能这样给结束掉会话了;

一般配合 w 命令来查看当前在线用户;

完整踢人命令:pkill -KILL -t pts/0

bfchengnuo commented 4 years ago

netstat

netstat 命令可以显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组等信息。

#列出所有端口
netstat 
netstat -a

#列出所有 tcp 端口 
netstat -at

#显示网络接口列表
netstat -i

#显示网络工作信息统计表
netstat -s

#显示伪装的网络连线
netstat -m

#显示核心路由信息
netstat -r

#拒绝显示别名,能显示数字的全部转化成数字
netstat -n

# -l  (listen) 仅列出 Listen (监听) 的服务
# -t  (tcp) 仅显示tcp相关内容
# -n (numeric) 直接显示ip地址以及端口,不解析为服务名或者主机名
# -p (pid) 显示出socket所属的进程PID 以及进程名字
# --inet 显示ipv4相关协议的监听

我一般就是用它找出程序运行的端口:netstat -an | grep ':80'

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

# 查看 IPV4 端口上的 tcp 的监听
netstat -lntp --inet
# 过滤掉本地监听
netstat -lntp --inet | grep -v 127.0.0.1
bfchengnuo commented 4 years ago

lsof

lsof(list open files)是一个列出当前系统打开文件的工具。 在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。 所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。 因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

因为 lsof 需要访问核心内存和各种文件,所以可能需要 root 用户执行。

命令参数:

-a 列出打开文件存在的进程

-c<进程名> 列出指定进程所打开的文件

-g  列出GID号进程详情

-d<文件号> 列出占用该文件号的进程

+d<目录>  列出目录下被打开的文件

+D<目录>  递归列出目录下被打开的文件

-n<目录>  列出使用NFS的文件

-i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号> 列出指定进程号所打开的文件

-u  列出UID号进程详情

-h 显示帮助信息

-v 显示版本信息

而我的最大用途也就是用来查看某个进程监听的端口: lsof -i:80

查看所有进程监听的端口:sudo lsof -i -P | grep -i "listen"

bfchengnuo commented 4 years ago

curl

基本参数说明:

# 设置用户代理发送给服务器
-A/--user-agent <string>

# cookie字符串或文件读取位置
-b/--cookie <name=string/file>

# 操作结束后把cookie写入到这个文件中
-c/--cookie-jar <file>

# 断点续转
-C/--continue-at <offset>

# 把header信息写入到该文件中
-D/--dump-header <file>

# 来源网址
-e/--referer

# 模拟表单提交
-F/--form

# 跟踪重定向
-L/--location

# 用socks5代理给定主机和端口
--socks5

# 连接失败时不显示http错误
-f/--fail

# 把输出写到该文件中
-o/--output

# 把输出写到该文件中,保留远程文件的文件名
-O/--remote-name

# 检索来自HTTP/1.1或FTP服务器字节范围
-r/--range <range>

# 静音模式。不输出任何东西
-s/--silent

# 上传文件
-T/--upload-file <file>

# 设置服务器的用户和密码
-u/--user <user[:password]>

# 什么输出完成后
-w/--write-out [format]

# 在给定的端口上使用HTTP代理
-x/--proxy <host[:port]>

# 进度条显示当前的传送状态
-#/--progress-bar

常用示例:

# 使用重定向功能保存
curl http://www.linux.com >> linux.html

# 模拟表单提交(最后加 -v 显示详细信息)
curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.mydomain.com/login.php
# 模拟 post 提交(-x POST)
curl -d "log=aaaa&name=v" http://blog.mydomain.com/login.php
# post 提交文件
curl -F upload=$localfile  -F $btn_name=$btn_value http://mydomain.net
curl -F "file=@/Users/ff/401.png" -H "token: 222" -v http://localhost/api/v1/upimg

# 使用curl的内置option:-o(小写)保存网页
# 使用 -O (大写) 保存网页中的文件,URL 需要具体到文件
curl -o linux.html http://www.linux.com
# 显示进度条
curl -# -O http://www.linux.com/dodo1.JPG
# 开启断点续传
curl -C -O http://www.linux.com/dodo1.JPG

# 设置 (HTTP) 代理
curl -x 192.168.100.100:1080 http://www.linux.com

# 保存 cookie
curl -c cookiec.txt  http://www.linux.com
# 保存 header
curl -D header.txt http://www.linux.com

# 使用 cookie
curl -b cookiec.txt http://www.linux.com
# 模拟浏览器
curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com

# 伪造 referer
curl -e "www.linux.com" http://mail.linux.com

# 循环下载
curl -O http://www.linux.com/dodo[1-5].JPG
# 下载重命名
curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG
curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG
# 分块下载
curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG
curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG
curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG

补充说明(表格):

参数 描述
-I/--head 只显示传输文档,经常用于测试连接本身
-o/--output 把输出写到该文件中,必须输入保存文件名
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-F/--form 模拟表单提交
-s/--silent 静默模式,不输出任何东西
-S/--show-error 显示错误,在选项 -s 中,当 curl 出现错误时将显示
-L/--location 跟踪重定向
-f/--fail 不输出错误
-n/--netrc 从netrc文件中读取用户名和密码
--netrc-optional 使用 .netrc 或者 URL来覆盖-n
--ntlm 使用 HTTP NTLM 身份验证
-N/--no-buffer 禁用缓冲输出
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 选择任一代理身份验证方法
--proxy-basic 在代理上使用基本身份验证
--proxy-digest 在代理上使用数字身份验证
--proxy-ntlm 在代理上使用ntlm身份验证
-P/--ftp-port 使用端口地址,而不是使用PASV
-M/--manual 显示全手动
-Q/--quote 文件传输前,发送命令到服务器
-r/--range 检索来自HTTP/1.1或FTP服务器字节范围
--range-file 读取(SSL)的随机文件
-R/--remote-time 在本地生成文件时,保留远程文件时间
--retry 传输出现问题时,重试的次数
--retry-delay 传输出现问题时,设置重试间隔时间
--retry-max-time 传输出现问题时,设置最大重试时间
--socks4 用socks4代理给定主机和端口
--socks5 用socks5代理给定主机和端口
-t/--telnet-option Telnet选项设置
--trace 对指定文件进行debug
--trace-ascii Like 跟踪但没有hex输出
--trace-time 跟踪/ 详细输出时,添加时间戳
-T/--upload-file 上传文件
-u/--user 设置服务器的用户和密码
-U/--proxy-user 设置代理用户名和密码
-V/--version 显示版本信息
-w/--write-out [format] 什么输出完成后
-x/--proxy 在给定的端口上使用HTTP代理
-X/--request 指定什么命令
-y/--speed-time 放弃限速所要的时间。默认为30
-Y/--speed-limit 停止传输速度的限制,速度时间'秒
-z/--time-cond 传送时间设置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,进行第三方传送
--3p-user 使用用户名和密码,进行第三方传送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6
-#/--progress-bar 用进度条显示当前的传送状态
bfchengnuo commented 4 years ago

SSH 远程操作

SSH 不仅可以用于远程主机登录,还可以直接在远程主机上执行操作(当然还可以当作端口转发,内网穿透等工具 #43 )。

例如:

ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

单引号中间的部分,表示在远程主机上执行的操作;后面的输入重定向,表示数据通过 SSH 传向远程主机。

# 将 $HOME/src/ 目录下面的所有文件,复制到远程主机的 $HOME/src/ 目录。
cd && tar czv src | ssh user@host 'tar xz'

# 将远程主机 $HOME/src/ 目录下面的所有文件,复制到用户的当前目录。
ssh user@host 'tar cz src' | tar xzv

# 查看远程主机是否运行进程 httpd。
ssh user@host 'ps ax | grep [h]ttpd'
bfchengnuo commented 4 years ago

kill

发送信号量给进程使其结束。在一些后台执行中的程序上非常实用,用于正常或者强制结束。 不指定信号将发送 SIGTERM(15)终止指定进程。

参数:

-l  信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a  当处理当前进程时,不限制命令名和进程号的对应关系
-p  指定 kill 命令只打印相关进程的进程号,而不发送任何信号
-s  指定发送信号
-u  指定用户 

示例: kill -2 123 等同于 ctrl + c id 为 123 的进程。

常用信号量:


以默认的 15 来说:

  1. 程序立刻停止
  2. 当程序释放相应资源后再停止
  3. 程序可能仍然继续运行

大部分程序接收到 SIGTERM 信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以配置的。 该信号可以被阻塞和处理,如果无法停止再尝试使用 -9

SIGINT -2 多用于通知前台程序(Ctrl + c)

bfchengnuo commented 4 years ago

MD5

除了 md5,mac 还可以使用 shasum 查看 SHA1,用法都是一样的(-a 可指定版本 1 或者 256)。

md5 -q ./1.mp4 # 精简版
md5 ./1.mp4
shasum ./1.mp4

# 或者使用 OpenSSL:
openssl md5 <<<"String" 
openssl sha1 <<<"String"

# 修改:
echo a >> ./Downloads/1.mp4

Linux 下有 md5sum 命令,sha1sum 命令和 sha256sum 命令

bfchengnuo commented 4 years ago

SCP

在 Mac 下 rt 与 rz 不是很好用,也不想折腾了,使用传统的 scp 用来上传和下载文件吧。

示例:

# scp 源 目标地址
scp ./t mps@101.x.x.x:/home/mps/
bfchengnuo commented 4 years ago

curl

curl 是常用的命令行工具,用来请求 Web 服务器。 它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

所以,讲也是说各个参数的用法。

-A

-A 参数指定客户端的用户代理标头,即 User-Agent。 curl 的默认用户代理字符串是 curl/[version]。

伪装 Chrome: $ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

-x

-x 参数指定 HTTP 请求的代理,默认 http 代理。 -X 参数指定 HTTP 请求的方法。

curl -x socks5://myproxy.com:8080 https://www.example.com
 curl -X POST https://www.example.com

-b

-b 参数用来向服务器发送 Cookie。 $ curl -b 'foo=bar' https://google.com

或者使用文件的方式: $ curl -b c.txt https://google.com

-c

-c 参数将服务器设置的 Cookie 写入一个文件。

$ curl -c cookies.txt https://www.google.com

-d && --data-urlencode

-d 参数用于发送 POST 请求的数据体。

curl -d 'login=emma&password=123' -X POST https://google.com/login
# 或者
curl -d 'login=emma' -d 'password=123' -X POST  https://google.com/login
# 读取本地文本文件的数据,向服务器发送。
curl -d '@data.txt' https://google.com/login

使用 -d 参数以后,HTTP 请求会自动加上标头 Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略 -X POST


--data-urlencode 与 -d 一致,区别于它会自动 URL 编码。

-e

-e 参数用来设置 HTTP 的标头 Referer,表示请求的来源。

$ curl -e 'https://google.com?q=example' https://www.example.com

-F

-F 参数用来向服务器上传二进制文件。

curl -F 'file=@photo.png' https://google.com/profile
# -F 参数可以指定 MIME 类型
# 下面命令指定 MIME 类型为 image/png,否则 curl 会把 MIME 类型设为 application/octet-stream。
curl -F 'file=@photo.png;type=image/png;filename=me.png' https://google.com/profile

上面命令会给 HTTP 请求加上标头 Content-Type: multipart/form-data,然后将文件 photo.png 作为 file 字段上传。

-G

-G 参数用来构造 URL 的查询字符串。

$ curl -G -d 'q=kitties' -d 'count=20' https://google.com/search

如果需要 POST,使用 --G,如果需要 URL 编码,就添加 --data--urlencode

-H

-H 参数添加 HTTP 请求的标头。

$ curl -H 'Accept-Language: en-US' https://google.com

-o

-o 参数将服务器的回应保存成文件,等同于 wget 命令。 -O 参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

可配合管道符使用。

其他

-i :参数打印出服务器回应的 HTTP 标头。 -k:参数指定跳过 SSL 检测。 -L:参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。 --limit-rate:用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。 -u:参数用来设置服务器认证的用户名和密码。

https://www.ruanyifeng.com/blog/2019/09/curl-reference.html

bfchengnuo commented 4 years ago

source

source 是一个 Shell 内置命令,用以在当前上下文(当前 shell 环境)中执行某文件中的一组命令,source 命令可简写为一个点(.)。

简单说就是在当前 bash 环境下读取并执行 FileName 中的命令。

通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 还有就是用于编译环境中,因为

make mrproper
make menuconfig
make dep
make clean
make bzImage
…………

这些命令太常规太繁琐了,执行写入到一个文件中,使用 source 让它自动顺序执行,对于需要多次反复编译系统核心的用户来说会很方便。


PS:bash 可以理解为是 sh 的增强版本。 再某些系统,sh 就是 bash 的软链。或者说 说 /bin/sh 相当于 /bin/bash --posix (标准模式)

bfchengnuo commented 4 years ago

export

Linux export 命令用于设置或显示环境变量。

在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。 export 的效力仅限于该次登陆操作。

语法:

export [-fnp][变量名称]=[变量设置值]

参数说明: -f  代表[变量名称]中为函数名称。 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。 -p  列出所有的shell赋予程序的环境变量。

例子:

// list
export -p

// 设置代理
export https_proxy=http://127.0.0.1:1090 http_proxy=http://127.0.0.1:1090 all_proxy=socks5://127.0.0.1:1080

fish shell 中会自动转换为 set -gx ,p 参数就无法使用了,可以使用 bash -c 执行

bfchengnuo commented 4 years ago

crontab

简单的定时任务。

格式(使用 crontab -e 后): 38 22 * * * <CMD>

常用命令:

# 查看任务列表
crontab -l
# 编辑任务
crontab -e
# 删除任务
crontab -r

# 查看服务状态
service crond status

# 查看日志
tail -f /var/log/cron

请注意,Linux 中 cron 表达式一共是五位,没有秒,第一位是分钟。

参考:博客

bfchengnuo commented 3 years ago

nslookup与dig

这两个都是调试 DNS 解析的工具,nslookup 比较简单,win 下也可以直接用,dig 则功能更多。

使用 nslookup 不注明 dns 服务器的话就使用系统默认。 它们的使用示例:

nslookup -type=A baidu.com 114.114.114.114 dig @8.8.8.8 baidu.com A

dig 命令默认的输出信息比较丰富,大概可以分为 5 个部分。 第一部分显示 dig 命令的版本和输入的参数。 第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。 第三部分中的 "QUESTION SECTION" 显示我们要查询的域名。 第四部分的 "ANSWER SECTION" 是查询到的结果。 第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。

我们可以使用 dig 的 -x 选项来反向解析 IP 地址对应的域名:

dig -x 8.8.8.8 +short

使用 +short 选项来获取精简结果

如果你好奇 dig 命令执行查询时都经历了哪些过程,你可以尝试使用 +trace 选项,这个用的比较多

bfchengnuo commented 2 years ago

Systemd 相关: https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html