一些常用的linux命令记录

dd

  • 拷贝文件 dd if=infile of=outfile
  • 创建填充文件 dd if=/dev/zero of=xxx bs=1024000 count=100 (100 MB)
  • 备份磁盘 dd if=/dev/sda of=/dev/sdb
  • 备份磁盘到文件 dd if=/dev/sda of=/path/to/filename,恢复备份 dd if=/path/to/filename of=/dev/sda
  • 拷贝内存内容到硬盘 dd if=/dev/mem of=/path/to/filename.mem bs=1024
  • 销毁磁盘 dd if=/dev/urandom of=/dev/sdb

更详细的信息可以参考 菜鸟

scp

给 scp 加代理,方法和 ssh 一样: scp -o "ProxyCommand=nc -X 5 -x localhost:1080 %h %p" remotehost:~/xx ./xx

nc (ncat)

  • nc 可以监听 udp 端口, nc -luv 60001 ,也可以连接 udp nc -vu 46.46.46.46 60001
  • 通过 nc 发送文本消息, echo xxx | nc 46.46.46.46 1234
  • nc 调试 http server nc -lkp 50081 -c "nc 127.0.0.1 50080" -o /dev/stdout 但输出没有展示方向,看起来不太友好。
    • nc -kl 1234 -c 'tee -a xxin.txt - | nc 127.0.0.1 50080 | tee xxout.txt -a -'
    • 查看 tail -f xxin.txttail -f xxout.txt
    • 调试内容显示可以更加优化,加个中间件
  • nc 请求复制 ( 结合 tcpcopy )
  • nc 作为 http 代理 server nc -kl --proxy-type http 0.0.0.0 8888
  • nc 直接 serve files:
    1
    2
    3
    4
    	#!/bin/bash
    while read|grep :;do :;done;<a href="/notpublish/index.html" name=" -e .$g &&! $g = *..* " > -e .$g &&! $g = *..* </a>||exit
    printf "HTTP/1.1 200 OK\nContent-Length: $(stat -c%s .$g)\n\n"
    cat .$g)|nc -l -p $1;}>/dev/fd/0;$0 $1
  • nc 端口扫描 nc -w 1 -z [ip] [port]
  • nc 聊天消息 nc --chat -lkp 50081
    • nc 带认证聊天 (回头再看)
  • nc 调试 server,延迟 1s 收发 nc -lkp 50081 -d 1
  • nc 让一切命令行拥有 proxy 的能力 (回头再看)
  • nc 视频流媒体 ( 在树莓派上可以玩一下 )
  • nc 传输文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 传输文件 (可以有两种,服务端收、服务端发),下面案例是 服务端发
nc -l 1234 < file_receive # 发送方
nc 46.46.46.46 1234 > file_send # 接收方

# 传输文件夹 (服务端收)
nc -l 1234 | tar zxf - # 接收方
tar zcf - files_send | nc 46.46.46.46 1234 # 发送方

# 加密证书传输文件 (服务端收)
nc -l 1234 --ssl --ssl-cert xxxxxx > file_receive # 接收方
nc --ssl --ssl-cert xxxxxx < file_send # 发送方

# 加密密码传输文件夹 -- 是的,很丑……,可以用 tar ,虽然没有好看多少……
nc -l 1234 -c 'dd of=/tmp/xxreceive.zip' && unzip -P password /tmp/xxreceive.zip || rm -f /tmp/xxreceive.zip # 接收方

zip -rP password /tmp/xxsend.zip axel-2.17.5 && nc 127.0.0.1 1234 < /tmp/xxsend.zip || rm -f /tmp/xxsend.zip # 发送方

关于加密部分的玩法,可以参考 简单好用的加解密工具

nc 只能扫描某一个 ip 下的端口,如果想扫描某个网段,可以使用 nmap,eg: nmap -v -T4 172.20.0.1/16

ls

ls 进行时间排序,可以使用 ls -t,时间反向排序,可以使用 ls -tr,也可以使用 sort 进行排序 ls -l | sort -k 8 -n

curl

  • 用任意代理 curl --proxy xx://xxx.xx.x.xx:xxxx

find

  • 根据文件名搜索 find ./* -name xxxx
  • 根据文件名模糊匹配 find ./* -name '*hello*'
  • 查找最近 n 天修改过的文件 find -ltime/mtime/atime
  • 查找具体某天的文件 find ./* -newermt '2023-01-13' ! -newermt '2023-01-14'
  • 找出 3 天”以前”被改动过的文件 72小时之前: find /var/log/ -mtime +3 -type f -print
  • 找出 3 天內被改动过的文件 (0 ~ 72 小时內): find /var/log/ -mtime -3 -type f -print
  • 找出前第 3 天被改动过的文件 (72 ~ 96 小时): find /var/log/ -mtime 3 -type f -print

grep

  • 排除一些文件 grep -v xxx

jq

  • shell 对数据结构的处理真的是一言难尽,json 尤其如此
  • jq 可以用来提取 json curl http://xx.com/xx | jq .data 或者 jq .data xxx.json
  • eg: long.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "name": "longalong",
    "age": 18,
    "friends": [
    "long1",
    "long2",
    "long3"
    ]
    }
  • 获取 name : jq .name long.json
  • 过滤 数组: jq '.friends[] | select(. == "long1")'
  • 把多个 json 合成为一个数组: jq -s '.' xx.json xx1.json
  • 在使用 curl 时,json 的 data 很难处理,如果有一个长文本,这个长文本的格式有很多奇奇怪怪的东西 (比如 ‘ “ \n 这些),在拼接 data 的时候就可以使用:
    1
    2
    3
    JSON_STRING=$(jq -n --arg description "$(cat "new_release_desc_with_checksum.txt")" '{"description":$description}')

    curl -XPUT -H "Content-Type: application/json" https://xx.xx.com -d "$JSON_STRING"
  • 嗯,上面的方式真的贼拉好用

其他


I know but one freedom and that is the freedom of the mind.
Antoine de Saint-Exupéry


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!