跳到主要内容

Linux 简单使用

· 阅读需 11 分钟

常用的命令,备忘。

Linux

开发环境

sudo apt update && sudo apt upgrade -y
sudo apt install build-essential
sudo apt remove build-essential
sudo apt autoremove

执行 sudo 命令时自动输入密码

echo "password" | sudo -S apt update

归档文件和提取归档文件

1、使用 tar 归档

  • -c 表示创建新的归档文件
  • -f 表示归档文件名,该选项后面必须跟一个文件名称,文件名必须紧跟在-f 之后出现,而且-f 应该是选项中的最后一个
  • -t 可以列出归档文件中所包含的文件
  • -v 或-vv 参数可以在命令输出中加入更多的细节信息
  • -r 可以将新文件追加到已有的归档文件末尾
  • -t 可以列出归档文件中的内容
  • -x 可以将归档文件的内容提取到当前目录
  • -C 将归档文件的内容提取到指定目录中
  • -A 合并多个 tar 文件
  • -j 指定压缩成 bunzip2 格式;
  • -z 指定压缩成 gzip 格式;
  • --lzma 指定压缩成 lzma 格式
  • -a 或--auto-compress 选项根据扩展名自动选择压缩算法
tar -cf archive.tar file1 file2 file3 folder1 .. # 创建新的归档文件
tar -rvf original.tar new_file # 将新文件追加到已有的归档文件末尾
tar -xf archive.tar -C /path/to/extraction_directory # 将归档文件的内容提取到指定目录中
tar -xvf file.tar file1 file4 # 只提取file1和file4,忽略其他文件
tar -xf archive.tar -C /path/to/extraction_directory
tar -Af file1.tar file2.tar # 合并多个tar文件
tar -f archive.tar --delete file1 file2 .. # 从归档中删除文件
tar -acvf archive.tar.gz filea fileb filec # 根据扩展名自动选择压缩算法

使用 ssh 在远程主机上执行命令

1、执行一条命令

ssh mec@192.168.0.1 'whoami'

2、执行多条命令

ssh mec@192.168.0.1 "echo user: $(whoami);echo OS: $(uname)"

配置 ssh 无密码自动登录

1、在本地主机上创建 SSH 密钥

ls -al ~/.ssh # 如果已经存在id_rsa文件就不必再次生成
ssh-keygen -t rsa -b 4096

2、将生成的公钥传给远程主机并将其加入到文件~/.ssh/authorized_keys

ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

主机之间传输文件

1、使用 sftp 传输文件

sftp -oPort=422 user@slynux.org

2、使用 scp 传输文件

scp filename user@remotehost:/home/path # 将文件复制到远程主机中
scp user@remotehost:/home/path/filename filename # 将远程主机中的文件复制到当前目录并使用给定的文件名

如果 SSH 没有运行在端口 22,使用和 sftp 相同的语法,利用选项-oPort 指定其他端口。

3、使用 rsync 传输文件

rsync 可以同步不同位置上的文件和目录。

  • -a 表示进行归档操作
  • -v(verbose)表示在 stdout 上打印出细节信息或进度
  • -z 指定在传输时压缩数据
  • -r 强制 rsync 以递归方式复制目录中所有的内容
rsync -av /home/slynux/data slynux@192.168.0.6:/home/backups/data
rsync -av source_dir username@host:PATH
rsync -av username@host:PATH destination
rsync -av /home/test/ /home/backups # 将一个目录中的内容同步到另一个目录
rsync -av /home/test /home/backups # 将包括目录本身在内的内容复制到另一个目录中

4、使用 netcat 传输文件

接收端等待接收文件:

nc -l -p 8080 > bak.tgz

发送端发送文件:

nc 192.168.1.1 8080 < bak.tgz

使用 SSH 实现端口转发

端口转发可以将来自某台主机的 IP 连接重定向到另一台主机。

1、将本地主机端口 8000 上的流量转发到www.kernel.org的端口80上:

ssh -L 8000:www.kernel.org:80 username@localhost

2、将远程主机端口 8000 上的流量转发到www.kernel.org的端口80上:

ssh -L 8000:www.kernel.org:80 username@REMOTE_MACHINE

按照上面的方法,一旦端口转发设置完毕,你会得到一个 shell 提示符。在进行端口转发的过程中,这个 shell 必须保持打开状态,什么时候想停止转发,只需要退出该 shell 就可以了。

3、非交互式端口转发

ssh -fL 8000:www.kernel.org:80 username@localhost -N

-f 指定 ssh 在执行命令前转入后台运行,-N 告诉 ssh 无需执行命令,只进行端口转发。

4、反向端口转发

将远程主机端口 8000 上的流量转发到本地主机的端口 80 上:

ssh -R 8000:localhost:80 username@REMOTE_MACHINE

使用 cron 进行任务调度

cron 表项指定了执行时间以及要执行的命令。cron 表中的每一行都定义了单条命令。命令 可以是脚本或二进制可执行文件。

cron 表中的每一行(表项)均由 6 个字段组成,字段之间以空格分隔,字段中的多个值以逗号分隔,字段按照以下顺序排列:

分钟(0~59) 小时(0~23) 天(1~31) 月份(1~12) 星期中的某天(0~6) 命令(在指定时间执行的脚本或命令)

星号表示任何时间段。除号表示调度的时间间隔(在分钟字段上出现的*/5 表示每隔 5 分钟)。

crontab -e 可用于编辑 cron 表:

02 * * * * /home/slynux/test.sh # 在每天中每小时的第2分钟执行脚本test.sh
00 5,6,7 * * * /home/slynux/test.sh # 在每天的第5、6、7小时执行脚本test.sh
00 */2 * * 0 /home/slynux/script.sh # 在周日的时候,每隔2个小时执行脚本script.sh
00 02 * * * /sbin/shutdown -h # 在每天凌晨2点关闭计算机
  • -l 可以列出当前用户的 cron 表
  • -r 可以删除当前用户的 cron 表

SSH 登录

ssh -oPort=6000 root@192.168.1.1
ssh -p 10385 root@xxx.xxx.com
ssh user@locahost -p 422

查看端口号

# 查看4222端口是否打开
lsof -i:4222
netstat -nupl (UDP类型的端口)
netstat -ntpl (TCP类型的端口)
netstat -nupl | grep 3306
netstat -ntpl | grep 15740
find / -name cci-agent

统计

# 统计代码行数
find . | grep '\.c$\|\.h$' | xargs wc -l
# 统计磁盘使用情况
du -sc /usr/share/* | sort -nr
du -sc /usr/share/* | sort -nr | more
# 将反汇编的结果保存到output文件中
objdump -d myprog > output
# 输出到文件的同时也输出到屏幕上
objdump -d myprog | tee output
# time工具记录了这一过程所消耗的时间
time ./myprog < data | tee output
# /dev/null是一个特殊的文件, 任何试图输出到它的信息都会被丢弃
time ./myprog < data > /dev/null

Redis

# From source code
wget https://download.redis.io/releases/redis-6.2.5.tar.gz
tar xzf redis-6.2.5.tar.gz
cd redis-6.2.5
make

# From the official Ubuntu PPA
sudo add-apt-repository ppa:redislabs/redis
sudo apt-get update
sudo apt-get install redis

# Run Redis
src/redis-server
src/redis-cli

docker

国内镜像

https://mirrors.ustc.edu.cn/repogen/

http://mirrors.ustc.edu.cn/

https://mirrors.163.com/

docker 国内镜像

vim /etc/docker/daemon.json

{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}

删除镜像

docker rmi -f $(docker images | grep "userpool" | awk '{print $3}')
docker rmi -f $(docker images | grep "/test/golang-gin-app" | awk '{print $3}')
docker rmi -f $(docker images | grep "none" | awk '{print $3}')
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')
docker stop $(docker ps -a | grep "Up" | awk '{print $1 }')
docker rm -f $(docker ps -a | grep "Exited" | awk '{print $1 }')

docker exec -it container_name bash

sql

su - postgres
--- 所有数据库
SELECT * FROM pg_database;

# 备份
pg_dumpall > pg_backup.bak
psql -f pg_backup.bak postgres
pg_dumpall -U postgres > databackup.bak

# 还原
psql basicinfo2 < basicinfo_20210223_171724

tar -zcvf test4.tar.gz test4/ //将test4文件夹做为归档文件
tar -zxvf test4.tar.gz //归档文件解压缩

k8s

kubectl get namespace
kubectl get ns

# 获取一个 shell 进入 Pod 中运行的容器:
kubectl exec -it secret-test-pod -- /bin/bash
kubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME'


curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl


curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
install minikube-linux-amd64 /usr/local/bin/minikube



kubectl exec test-deployment-8697bdd6c4-sdhmm -it bash

# 位于名字空间中的资源
kubectl api-resources --namespaced=true

# 不在名字空间中的资源
kubectl api-resources --namespaced=false


# 创建 Pod:
kubectl apply -f memory-request-limit-3.yaml --namespace=mem-example

# 查看 Pod 状态:
kubectl get pod memory-demo-3 --namespace=mem-example

# 查看 Pod 日志:
kubectl logs <podname>

# 查看前一个 Pod 日志:
kubectl logs <podname> --previous

# 删除 Pod:
kubectl delete pod memory-demo-3 --namespace=mem-example


# 删除命名空间。下面的命令会删除你根据这个任务创建的所有 Pod:
kubectl delete namespace mem-example


# 显示有关 Deployment 的信息:
kubectl get deployments hello-world
kubectl describe deployments hello-world

# 显示有关 ReplicaSet 对象的信息:
kubectl get replicasets
kubectl describe replicasets

# 创建公开 Deployment 的 Service 对象:
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service

# 显示有关 Service 的信息:
kubectl get services my-service
kubectl describe services my-service

# pod的内部地址
kubectl get pods --output=wide
kubectl get pods -l run=my-nginx -o yaml | grep podIP
kubectl get pods --selector="run=load-balancer-example" --output=wide

# 自动打开 Hello World 应用程序
minikube service my-service

# 删除服务
kubectl delete services my-service

# 删除正在运行 Hello World 应用程序的 Deployment,ReplicaSet 和 Pod
kubectl delete deployment hello-world


# 创建 Service
kubectl expose deployment/my-nginx
service/my-nginx exposed

# 查看你的 Service 资源:
kubectl get svc my-nginx
kubectl describe svc my-nginx





# kustomization.yaml
kubectl apply -k ./
kubectl get -k .
kubectl delete -k ./


# 创建 secret
kubectl create secret docker-registry regcred1 --docker-server=docker.pkg.coding.net --docker-username=1112@qq.com --docker-password=123 --docker-email=test@qq.com -n log



kubectl create secret generic harborsecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson

kubectl create secret generic harborsecret \
--from-file=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson




minikube delete
kubectl delete node --all
rm -rf /usr/local/bin/kubectl
rm -rf ~/.kube







port
port是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service

nodePort
nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service。

targetPort
targetPort是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

containerPort
containerPort是pod内部容器的端口,targetPort映射到containerPort。

helm

# 安装
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# 安装 minio
helm repo remove stable
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
helm repo update
helm install stable/minio --generate-name

k3s


# 安装k3s

# 下载 k3s 二进制文件,k3s-airgap-images-$ARCH.tar(k3s-airgap-images-amd64.tar) tar文件
mkdir -p /var/lib/rancher/k3s/agent/images/
cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
cp ./k3s /usr/local/bin/k3s

wget https://get.k3s.io

INSTALL_K3S_SKIP_DOWNLOAD=true ./install-k3s.sh


systemctl restart k3s
systemctl restart k3s-agent
service k3s restart
service k3s-agent restart

k8s service

---
apiVersion: v1
kind: Service
metadata:
name: kube-node-service
labels:
name: kube-node-service
spec:
type: NodePort #这里代表是NodePort类型的
ports:
- port: 8080 #这里的端口和clusterIP对应,即ip:8080,供内部访问。
targetPort: 8080 #端口一定要和container暴露出来的端口对应
protocol: TCP
nodePort: 32143 # 所有的节点都会开放此端口,此端口供外部调用。
selector:
app: web #这里选择器一定要选择容器的标签,之前写name:kube-node是错的。

npm

# 代理
--proxy http://127.0.0.1:10809
# 镜像
--registry=https://registry.npmmirror.com
# 升级npm
npm install -g npm --registry=https://registry.npmmirror.com
# 清缓存
npm cache verify
npm cache clean --force
npm uninstall *
# 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 "get-help about_signing"

# 使用管理员身份运行 PowerShell
set-executionpolicy remotesigned
Y

Windows

# 杀死进程
taskkill /F /im Xshell.exe
# 树形文件列表
tree /F

Go


wget -c https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

# linux
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64

# 代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct