個人筆記,只會列出我自己還不太熟悉的命令
Linux Shell
# 1. 后台運行命令
nohup python xxx.py &
# 也可以使用 tmux,tmux 提供的 session 功能比 nohup 更好用。
# 1. 輸入 `tmux` 啟動一個 tmux 會話。(或者用 `tmux new -s <session-name>` 啟動一個命名會話)
# 2. 輸入 `python xxx.py`,python 進程開始運行。
# 3. 按快捷鍵 `ctrl+b`,然后再按一下 `d` 脫離(detatch)當前會話。此時 python 進程進入后台運行,關閉當前終端對 python 進程沒有影響。
# 4. 輸入 `tmux ls` 可以查看當前正在后台運行的會話。(命名會話會顯示名稱,否則只顯示 id)
# 5.1 通過 `tmux attach -t <session-name/id>` 重新接入后台會話。
# 5.2 或者通過 `tmux kill-session -t <session-name/id>` 殺死一個后台會話。
# 詳見 https://www.ruanyifeng.com/blog/2019/10/tmux.html
# 官方文檔:https://github.com/tmux/tmux/wiki/Getting-Started
# 查找替換
## 只在目錄中所有的 .py 和 .dart 文件中遞歸搜索字符"main()"
grep "main()" . -r --include *.{py, dart}
## 1) 全文搜索並替換
sed -i "s/pattern_str/replace_str/g" `grep "key_pattern" 'path_pattern' -rl`
## 2)文件名搜索,替換文件內容
sed -i "s/pattern_str/replace_str/g" `find . -name "pattern"`
## 3)批量轉換大小寫
# 將當前文件夾內,所有的 gitlab URL 都轉換成小寫
# \L 轉小寫 \U 轉大寫
sed -i 's@http://GITLAB.*.git@\L&@g' `find . -name pubspec*`
# 文件傳輸
# 如果使用 ssh 命令進行文件傳輸,可安裝 pv 命令查看傳輸速度(pipeviewer)
## ubuntu
sudo apt-get install pv
## centos
sudo yum install epel-release
sudo yum install pv
## 1)從本地上傳到服務器
### 使用 ssh 的好處是流式傳輸不會占用目標機器的存儲空間,適合傳輸可能引起空間不足的大文件,並在目標機器上實時處理該文件。
cat <filename> | pv | ssh <user>@<host> -p 22 "cat - > <new-filename>"
tar cz <filename or foldername or glob> | pv | ssh <user>@<host> -p 22 "tar xz" # 壓縮傳輸
## scp 命令比 ssh 命令更簡潔(但是不適合用於傳文件夾,它會破壞文件的權限設置,把文件夾弄得一團糟)
scp -P 22 <filename> <user>@<host>:<folder-name or filename> # 通過 scp 傳輸,傳文件夾時記得添加 -r 參數(recursive)
## 2) 從服務器下載到本地
ssh <user>@<host> -p 22 "tar cz <filename or foldername or glob>" | pv | tar xz # 壓縮傳輸
scp -P 22 <user>@<host>:<folder-name or filename> <filename> # 通過 scp 傳輸,傳文件夾時記得添加 -r 參數(recursive)
文件拷貝/同步命令 rsync
rsync 的功能其實和前面的 scp/(tar+ssh) 是一樣的,將文件從一個地方拷貝到另一個地方。
區別在於它只做增量同步,在多次拷貝文件時,只拷貝(同步)修改過的部分,很多場景下可以大大加快拷貝/備份速度。
rsync 的常用命令:
# 將一個文件夾歸檔、壓縮,並通過 ssh 協議(默認)同步到另一個地方
# -a, --archive # 歸檔模式,保留文件的所有元信息,等同於 `-rlptgoD`
# -r, --recursive # 遞歸復制文件夾,`-a` 隱含了這個參數,通常都用 -a。
# -v, --verbose # 輸出詳細信息
# --progress # 顯示傳輸進度
# -z, --compress # 傳輸文件時進行壓縮
rsync -avz --progress src host:dest
rsync -avz --progress -e "ssh -p225" /path/src user@host:dest # 使用非默認的 ssh 端口進行傳輸
rsync -avz --progress -e "ssh -i id_xxx" /path/src user@host:dest # 使用指定的私鑰連接 ssh 服務端,其他各種 ssh 參數都可以在這里指定
# 有時我們希望在同步數據時修改文件的 user/group
# --chown # 設置文件的 user:group,必須與 `-og`/`--owner --group` 同時使用!(`-a` 隱含了 `-og`)
rsync -avz --progress --chown=root:root src user@host:dest # 傳輸時修改 user/group 為 root
# 詳細說明 src 和 dest 的位置
rsync -avz --progress path/src user@host:/tmp # 將 src 拷貝到遠程主機的 /tmp 中(得到 /tmp/src)
## 注意 src 結尾有 /
rsync -avz --progress path/src/ user@host:/tmp/src # 將 src 目錄中的文件拷貝到遠程主機的 /tmp/src 目錄中(同樣得到 /tmp/src)
# 有時候我們在傳輸文件時不希望保留文件的元信息
# rsync 默認不會刪除 dest 中多余的文件,使用 --delete 可讓 rsync 刪除這部分無關的文件
# 對 src 文件夾進行完全鏡像,保證兩個文件夾的內容一模一樣,不多不少
rsync -avz --progress --delete src user@host:dest
# 也可以使用 --ignore-existing 讓 rsync 忽略掉 dest 已經存在的文件。就是只同步新增的文件。
rsync -avz --progress --ignore-existing src user@host:dest
# 另有使用雙冒號 :: 分隔的傳輸命令,這種命令使用 rsync 協議進行傳輸,要求目標主機啟用 rsync-daemon
# 暫時不做介紹
詳見 https://rsync.samba.org/documentation.html
# 用戶與群組
## 查看用戶屬於哪些群組
groups <user-name> # 方法一
id <username> # 方法二,它會額外列出 gid/uid
cat /etc/group | grep <user-name> # 方法三,直接查看配置
## 查看群組中有哪些用戶,第一列是群組,最后一列是用戶名
cat /etc/group | grep <group-name>
Powershell
powershell 的命令有一致的命名規則:謂詞-名詞,謂詞表示動作:Get/Set/Stop/Start 等,名詞指示操作對象:Service/Member/ChildItem/Command 等。
這樣的命名格式使我們可以很容易地猜測到自己需要的命令的名稱。
為了使用方便,powershell 還提供了一些常用命令的縮寫,並且添加了大量類似 Linux 命令的別名。
還有就是,Windows 默認不區分字母大小寫,日常使用可以全部小寫。
# 刪除文件/文件夾
remove-item xxx -confirm
ri xxx # 別名1
rm xxx # 別名2
rmdir xxx # etc...
# 復制
copy-item xxx xx -r
cp -r xxx xx
# 顯示工作目錄
get-location
gl
pwd
# 切換工作目錄
set-location xxx
sl xxx
cd xxx
# 查看環境變量
get-childitem env:
gci env:
gci env:PATH # 查看 PATH 變量
$env:XXX="value" # 臨時設置環境變量
$env:Path += ";SomeRandomPath" # 臨時在 Path 末尾添加新路徑
## 以下三行命令只對 windows 有效,linux 下無效
[Environment]::SetEnvironmentVariable("XXX", $env:XXX + ";value", [EnvironmentVariableTarget]::User) # 修改當前用戶的環境變量(永久),只對新進程有效
[Environment]::SetEnvironmentVariable("XXX", "value", [EnvironmentVariableTarget]::Machine) # 給這台電腦設置環境變量(永久),只對新進程有效,需要管理員權限
[Environment]::SetEnvironmentVariable("XXX", $env:XXX + ";value", "User") # target 也可用字符串指定
# 刪除文件/文件夾
rm xxx # 刪除文件夾時會進入交互界面,按提示輸入就行。
# 查看命名位置(類似 Linux Shell 的 which)
get-command xxx
gcm xxx
# 通過關鍵字查找 powershell 命令
gcm | select-string <keyword>
# 通過關鍵字查找 powershell 命令和環境變量中的程序,比較慢
gcm * | select-string <keyword>
# 查看別名對應的真實命令
get-alias
# 類似 linux 的 find/ls 命令
get-childitem -Recurse -Include *.py
gci -r -i *.py
# 清空終端的輸出
clear-host
clear
# 查看文件內容
get-content xx.py | more
get-content xx.py | out-host -paging
cat xx.py
gc xx.py
# 字符串搜索,不能對對象使用
# 類似 linux 的 grep 命令
cat xxx.log | select-string <pattern>
gci env: | out-string -stream | select-string <pattern> # 需要先使用 out-string 將對象轉換成 string
gci env: | where-object {$_.Name -like <pattern>}
# 計算輸出的行數/對象個數
gci env: | measure-object
gci env: | measure # 這是縮寫
# 查看所有進程
get-process | more
ps | more # 別名
# 查找某進程(替代掉 tasklist)
get-process -name exp*,power* # 使用正則查找進程
get-process | select-string <pattern> # 效果同上
# 通過 id 殺掉某進程(替代掉 taskkill)
# 也可以通過 -Name 用正則匹配進程
stop-process <pid>
kill <pid> # 別名
# 網絡相關命令
## 1. dns 相關(dns-client)
Clear-DnsClientCache # 清除 dns 緩存(替換掉 `ipconfig /flushdns`)
Get-DnsClientCache # 查看 dns 緩存
Resolve-DnsName baidu.com # 解析域名
## 2. TCP/IP 相關命令
Get-Command Get-Net* # 查看所有 TCP/IP 相關的命令
Get-NetIPAddress # 查看 IP 地址
Get-NetIPInterface # 查看 IP 接口
Get-NetRoute # 查看路由表
Get-NetNeighbor # 獲取鏈路層 MAC 地址緩存
Get-NetTCPConnection # 查看 TCP 連接
### 也可以對 TCP/IP 的 IP 地址、接口、路由表進行增刪改
New-NetRoute
Remove-NetNeighbor # 清除 MAC 地址緩存
# 關機/重啟
stop-computer
restart-computer
# windows 計算 hash 值
# 功能等同於 linux 下的 sha256sum/sha1sum/sha512sum/md5sum
Get-FileHash -Path /path/to/file -Algorithm SHA256
Get-FileHash -Path /path/to/file -Algorithm SHA256 | Format-List # 用 format 修改格式化效果
# base64 編解碼
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("xxx")) # base64 編碼
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("eHh4")) # 解碼
# 另外 windows 同樣自帶 ssh/scp 命令,參數也和 linux 一致