git
git:分布式的(每一个开发者在本地克隆一个存储库,最后合并),不需要联网就可以本地看到不同版本,内容按元数据方式存储,鼓励分支
svn:非分布式,按文件存储,需要联网查看不同版本,分支在 SVN 中就是版本库中的另外的一个目录
查看git全局配置 git config --global --list
修改全局配置
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
版本回退
git reset --hard HEAD^ 回退到上个版本
git reset --hard HEAD~num 回退到num次提交前的版本
git reset --hard 版本号
git reset --soft 软回滚(回滚指定版本之前的提交记录,对应代码保存到暂存区,生成最新提交替换之前的记录和代码,一般用于相同功能的提交记录规范)
git revert 版本号 (回滚自己的提交,只撤销回滚的版本号,之后的提交记录会保存,生成一条新的提交记录)
初始化远端库 git clone name
创建存储库 git init
查看远程库 git remote -v(详细信息)
推送到远程库 git push -u(第一次推送时需要) origin master(推送master分支) --force(-f)
创建SSH-KEY ssh-keygen -m PEM -t rsa -b 4096 -f C:/Users/wulongmiao/Desktop/z
添加到暂存区 git add name
所有修改添加到暂存区 git add .
提交 git commit -m '添加注释'
指定提交组合成一个新的分支 git cherry-pick name1 name2 (a..b] [a^..b]
创建分支 git checkout(切换到这个分支) -b(创建) name tagName
查看(新增)分支 git branch name
删除分支 git branch -d name
合并冲突(先从远端拉取代码) git pull
合并分支 git merge name
取消合并 git merge --abort
变基 git rebase
取消变基 git rebase --abort
git标签
创建本地tag git tag -a <tagName> -m '提交额外信息'
推送到远程仓库 git push origin <tagName>
推送本地所有标签 git push --tags
本地分支标签删除 git tag -d <tagName>
远程库标签删除 git push origin :refs/tags/<tagName>
贮存代码
git stash 暂存缓存区代码
git stash clear 清空贮存区
git stash pop 恢复缓存区最后一个元素代码
git stash apply name 恢复指定贮存区代码
git stash list 查看贮存区
vim
vim name 打开文件
u 撤销上一步操作
i 进入插入模式
o 当前行后插入一行
Esc 退出插入模式
:w 保存文件
:q 退出 Vim
:q! 强制退出 Vim,不保存更改
:wq 保存文件并退出 Vim
:set nu 显示行号
:set nonu 隐藏行号
:/keyword 在文件中查找关键字
N 搜索结果跳转上一条
n 搜索结果跳转下一条
yy 复制当前行
p 粘贴复制的内容
dd 删除当前行
Ctrl + r 重做上一步被撤销的操作
linux
sftp username@remote_host 连接远程sftp服务器,远程访问文件系统
scp username@remote:/path/to/remote/directory /path/to/local/file scp 远程路径 本地路径(下载服务器文件)
scp 本地路径 远程路径 (上传到服务器)
get 下载的文件 本地路径
put 上传文件 远程路径
wget 下载文件,支持http,https,ftp协议
wput 本地文件 远程路径
curl -o local_url http://aa 指定保存文件路径
curl请求选项: -d请求参数 -b使用cookie -X请求方法 -H请求头 -m超时时间 --insecure忽略SSL证书检查 --cacert指定CA证书
curl -X POST -d "param1=value1¶m2=value2" -b "session=abc123" http://example.com
-x解压 -c压缩 -f指定文件名 -v显示详细信息 -z 指定gzip格式
tar -xf archive.tar -C /path/to/extract/to 解压
tar -xzvf archive.tar.gz
tar -czvf archive.tar 压缩
zip -r name.zip *.jsx 压缩
unzip -q archive.zip(folder1/file.txt) -d /home/user/target/ 解压缩指定文件到指定目录
7z a test.7z /path/to/file_or_directory 压缩
7z x test.7z -o /path/to/destination_directory 解压到指定目录
sz aaa.zip 下载到本地
rz 上传
wc -l name 计算行数
ls -lh aaa 计算文件大小,非字节表示方式
split -l 100 -b 100M name prefix_ 分割大文件,小文件以指定前缀生成
df -h 查看磁盘使用
free -h 查看内存使用
top 查看总览资源
ps -ef | grep 'top' 查看进程
ps -ef |grep -v grep | grep root |awk '{print $2}' | xargs kill -9
source ~/.bashrc
pkill pname 按进程名杀死进程
kill -9 pid 按进程名pid强制杀死进程
ln -s targetfile linkfile 设置软链接
export VAR_NAME=value
export PATH=$PATH:/path/to/new/dir 追加环境变量
unset VAR_NAME 删除环境变量
head -n 10 file 文件头几行内容
tail -f -n 100 /path/to/local/file 追踪文件最后100行实时变化
grep -C(匹配前后) -A(匹配后) -B(匹配前) 10(行数) -v(非) searchContent /path/to/to | grep
more 逐行查看文件
sed -i 's/oldstring/newstring/g' script.sh 替换内容
sudo 管理员权限
ls -a 列出目录所有文件,包括隐藏文件
ls -l 列出文件详细信息
ls -t 按修改时间显示,最新修改在前
ls -S 按文件大小排序,最大在前
pwd查看当前路径
cd跳到指定目录
mv a b 重命名文件 a -> b 或者 移动a到b
hostname -I ifconfig ip addr查看本机ip
mkdir创建文件夹 fileName
touch fileName 创建文件名
rm删除文件 -f(强制删除) -i(逐一询问) -r(删除子目录) -v(显示结果) fileName
echo 'content' >a.txt 覆盖写入
echo 'content' >>a.txt 文件追加写入
echo 'content' 打印内容
cat fileName 查看文件
cat file1 file3 file4 > file2 1,3,4内容合并到2
mv移动文件或者重命名 fileName ../aa/
cp原文件复制到目标文件a->b a.txt b.txt
systemctl is-enabled mongod 查看服务是否开机自启
systemctl list-unit-files --type=service | grep enabled 所有服务状态
sudo systemctl start ssh # 启动服务
sudo systemctl enable ssh # 开机自启
sudo systemctl status ssh # 检查状态
chmod [options] mode file 文件及文件夹权限变更
-f 强制,不中断 -R 递归
u文件所有者 g文件所属组的成员 o其他用户 a所有用户
+添加权限 -移除权限 =设置为特定的权限
r可读 w可写 x可执行 X特殊的执行权限
chmod -Rf a+xrw
chown -R user.group nginx-1.22.0 更改文件所有权,root权限可操作
sudo reboot 重启
last reboot 重启日志
su - (切换对应用户环境变量) user
history 查看历史命令
apt(Debian、Ubuntu、Linux Mint)
包管理yum dnf(Fedora、CentOS、RHEL):
yum install [package_name]: 安装指定的软件包。
yum update [package_name]: 更新指定的软件包。
yum remove [package_name]: 删除指定的软件包。
yum search [keyword]: 在可用的软件包中搜索包含指定关键字的软件包。
yum list: 列出所有已安装的软件包。
yum info [package_name]: 显示指定软件包的详细信息。
yum clean all: 清理yum缓存。
yum repolist: 列出所有可用的软件源。
yum check-update: 检查是否有可用的软件包更新。
yum upgrade: 升级所有可用的软件包。
sh 脚本语法
单引号不解释执行输出原始值,变量没有作用域概念声明后文件任何地方都能使用 $PATH 环境变量 env 当前用户下的环境变量
#!/bin/sh 声明解释器,类似<!DOCTYPE html>
chmod +x file 提升权限
# 代码注释
$0 脚本名称 $1 $2...脚本参数
$# 传递给脚本参数数量 $? 上个命令退出状态 0===成功执行,其他===失败
$@ 传递给脚本参数列表,类似js process.argv
name1 = 'yum' 声明变量
echo "aaa ${name1}"
unset name1 删除变量
字符串表示: 单引号,双引号(常用,可以包含变量、转义字符),无引号
${#aa} === ${#aa[0]} 获取字符长度
${string:1:4} == string.slice(0,4)
${string:0-4} == string.slice(-4)
${str#*/} == str.match(/[/](.*$)/)[1] 匹配后缀
${str#*/} == str.match(/[/]([^/]*$)/)[1]
${str#%/*} == str.match(/^(.*)[/].*$/)[1] 匹配前缀
${str#%/*} == str.match(/^[^/]*/)[0]
expr 5 + 6 计算表达式
关系运算符: -eq 相等 -ne 不等 -gt(ge) 大(等)于 -lt(le) 小等于
布尔运算: !非 -o或 -a与
其他: -z 字符长度==0 -n 字符len!=0 $不为空字符
文件测试运算符: -d file是否目录 -f是否普通文件 -r file是否可读
-w file是否可写 -x file是否可执行 -s file是否空文件 -e file是否目录或文件存在
数组
my_array=(1 2 3 4 5)
${array_name[@]} 获取数组所有元素
${#array_name[@]} === ${#array_name[*]} 数组长度
控制语句:
使用((...)), 可使用 > <
if [ $age -ge 18 ]; then 条件表达式
echo "You are an adult"
elif [-d -f '$file']; then
echo "You are a teenager"
else
echo "You are a child $0"
fi
case "$site" in
"runoob") echo
;;
"google") echo
;;
"taobao") echo
;;
esac
for item in list cc ccc; do 循环
done
while [ $cc -le 4 ]; do
((cc++))
done
函数定义 function sss() {}
调用 sss 'name2' 'name3'
函数执行后立即获取返回值 $?
nginx
goaccess 可视化日志分析工具
tail -f /var/log/nginx/access.log cd etc/nginx
nginx 命令
nginx -s reopen 重启Nginx
nginx -s reload 重新加载配置文件,优雅重启 推荐使用
nginx -s stop 强制停止
nginx -s quit 安全退出
nginx -t 检测配置文件地址 以及检测配置是否正常
nginx -v 显示版本信息并退出
killall nginx 杀死所有nginx进程
nginx 常用配置
user test; // 以指定管理员运行
worker_processes 4; // 进程数,一般小于服务器2倍cpu
error_log logs/error.log notice; // 包括警告、错误、以及更严重的日志信息
pid logs/nginx.pid; // 进程pid
worker_rlimit_nofile 204800; // 单进程可以打开的最大文件描述符数量
events {
use epoll; // 监听事件
worker_connections 204800; // 单进程最大连接数
}
https {
listen 443 ssl;
server_name chat.jiangly.com; // https协议证书配置
ssl_certificate conf.d/chat.jiangly.com_ssl/1_chat.jiangly.com_bundle.crt;
ssl_certificate_key conf.d/chat.jiangly.com_ssl/2_chat.jiangly.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
}
http {
client_max_body_size 500m; #客户端请求体最大500m
gzip on; #开启gzip压缩功能
gzip_min_length 10k; #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小.
gzip_buffers 4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
gzip_http_version 1.1; #压缩版本
gzip_comp_level 2; #设置压缩比率,一般折中为6
gzip_types text/css text/xml application/javascript; #制定压缩的类型,线上配置时尽可能配置多的压缩类型!
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
limit_conn_zone $binary_remote_addr zone=mylimit:10m;
limit_req_zone $binary_remote_addr zone=myrate:10m rate=1r/s; # 每秒最多1个请求
server {
location / {
limit_conn mylimit 100; # 每个IP最多100个并发连接
limit_req zone=myrate burst=5; # 每秒最多1个请求,允许突发5个请求
}
# location = 绝对匹配 location ^~ 高优先级前缀匹配 location ~ 正则匹配 location ~* 不区分大小写正则匹配 普通前缀匹配
# proxy_pass 代理地址+斜杠 【不拼接location的路径】 代理地址不加斜杠 【拼上location的地址】
# 用root方式,location中的路径会拼加到root的地址后面
# 用户输入请求路径为:http://localhost:8080/files/index.jpg
# 服务器内查询地址为:/dist/assets/files/index.jpg
location ~ ^/files/ {
root /dist/assets/;0
index index.html index.htm;
}
# 用alias方式,location中的路径不会拼加到alias的地址后面
# 用户输入请求路径为:http://localhost:8080/files/index.jpg
# 服务器内查询地址为:/dist/assets/index.jpg
location ~ ^/files/ {
alias /dist/assets/;
index index.html index.htm;
}
location / {
# 防止 SQL 注入等攻击
rewrite ^/(.*)$ /index.php?param=$1 break;
# 限制请求方法,只允许 GET 和 POST
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}
# 防止跨站请求伪造
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
}
location / {
proxy_pass http://127.0.0.1:7000; // 反向代理配置
proxy_set_header X-Forwarded-For $remote_addr;
add_header Content-type charset=utf-8;
root html;
try_files $uri $uri/ @router;
index index.html index.htm;
}
location @router {
rewrite ^.*$ /index.html last; // 正则匹配,重定向,last标志表示停止处理其他rewrite规则,该规则优先级最高
}
# 禁止访问隐藏文件,即以点开头的文件或目录
location ~ /. {
deny all;
allow 1.116.33.29 允许访问的ip
}
# 根据请求头定义访问指定资源
location ~ /. {
set $gray $http_X_Gray;
set $lane 'default';
if ($gray) {
# 如果用户指定了泳道
set $lane $gray;
}
proxy_pass http://192.168.1.8:5500/$lane$uri;
}
location ~* .(?:css(.map)?|js(.map)?|gif|svg|jfif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
expires 24h;
# 静态资源设置七天强缓存
expires 7d;
access_log off;
}
}
}
// 负载均衡 1.默认轮询算法,按权重分配机率 2.ip哈希算法,根据ip分配,保证同一ip请求相同服务器 3.fair算法:根据服务器的响应时间和负载来分配请求 4.URL哈希算法:根据请求的 URL 的哈希值分配请求,每个请求的URL会被分配到指定的服务器,有助于提高缓存效率,需要额外模块
http {
upstream backend {
ip_hash; # 哈希算法
hash $request_uri; # URL哈希算法
fair # Nginx默认不支持公平调度算法,需要安装额外的模块(upstream_fair)来实现
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060; (默认权重1)
server 127.0.0.1:6060 fail_timeout=60s max_fails=2; (两次请求失败触发存活机制,60s内所有请求不转发给这台机器)
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
check interval=10s fails=3 passes=2; // 健康检查,服务器不健康转发给其他节点, 默认不可用需要独立安装nginx_upstream_check_module模块
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; // 转发
}
}
}
docker
镜像->安装包,容器->应用,数据卷-> 本地数据 docker pull quay.io/oceanbase/oceanbase-ce
常用命令
docker pull name:tag_name 云端拉取镜像,默认标签latest
docker logs container_Id 查看应用日志
docker search name 查看远端相关镜像name
docker info 查看docker配置
docker version 查看docker版本
docker ps (-a) 查看运行中的容器
docker start 启动一个已经停止的容器
docker stop 停止一个容器
docker rm 删除一个容器
docker inspect 查看容器详情
docker images 查看本地镜像
docker volume 管理数据卷
docker exec -it contain_id bash 进入容器
exit // 退出容器
docker run -d -p 8000:8081 -v 宿主数据卷路径:容器内路径:ro --name my-nginx nginx
docker run -d -p 6060:6060 -v E:\docker\nginx-data:/nginx-data --name my-nginx nginx
启动参数配置:
-d 后台方式运行(不把执行命令的结果输出在当前宿主机下)
-p 宿主机端口8000->容器端口8001 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
-v 指定数据卷 :ro 只读 :rw 读写
-e 指定环境变量 KEY11=VALUE11
--name 容器名称
docker save -o C:\Users\Administrator\wulongmiao.github.io\mg.tar bitnami/mongodb 导出镜像文件
docker load -i C:\DockerImages\my_image.tar 导入镜像文件
docker export CONTAINER_ID > ubuntu.tar 导出本地容器快照
cat ubuntu.tar | docker import -newimage 导入快照并创建镜像
docker build -t aaa:ccc . // 默认制作镜像文件 Dockerfile
docker build -t name1:sdd -f bbb.Dockerfile // 指定制作镜像文件名
docker tag myapp:latest
docker login
docker push myapp:latest 推送服务镜像
docker stats name 实时查看容器占用系统资源
docker port CONTAINER_ID 80 查看指定容器端口映射的宿主机端口
docker file
定制镜像
from node:16 基于一个基础镜像来修改
workdir user/src/app 指定容器工作目录
copy package*.json . 把容器外的内容复制到容器内
volume ./data 自定义数据卷
run pnpm install 在容器内执行命令
copy . . 把容器外的内容复制到容器内
ENV NAME World 定义环境变量
expose 6000 指定要暴露的端口
cmd ['node', 'app.js'] 容器启动的时候执行的命令
docker compose
一个方便维护多个容器的 yaml 文件,docker 认为一个容器对应一个进程,但一个应用会有多个进程,例如上面的 mysql 和 wordpress。
配置文件规则
version: // docker compose版本号,v2不需要配置
services:
service1:
image: name // service1为我们自定义的服务名称,而image则是对应的镜像文件名或者id,如果我们定义了一个没有的镜像,会自动帮我们拉取下载。
build: /path/a/b // 指定 Dockerfile 所在文件夹的路径。利用它自动构建镜像,然后使用这个镜像启动服务容器。
command: bundle exec thin -p 3000 // 容器启动后默认执行的命令
container_name: test // 自定义容器名称
depends_on: redis // 定义依赖容器,将在定义后的容器后启动
env_file: - ./common.env // 定义环境变量文件路径
environment:
- MYSQL_ROOT_PASSWORD=secret // 定义环境变量
ports: // 端口号
volumes: // 数据卷
restart: always // 重启参数
volumes: 共享数据卷,命名空间
local_data:
external: true
test_data:
driver: local
network:
configs:
docker-compose 命令
docker compose -f ttt-compose.yml up -d -p 基于docker-compose.yml启动管理的容器
up 自动完成包括构建镜像、创建服务、启动服务并关闭关联服务相关容器一系列操作
exec 在运行的容器中执行一个命令
logs 查看服务容器的输出
ps 列出项目中目前的所有容器
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
down 停止并删除容器,网络,镜像和数据卷
kill 通过发送SIGKILL信号来强制停止服务容器
pause 暂停一个服务容器
unpause 恢复处于暂停状态中的服务
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器,但不删除它
restart 重启项目中的服务
rm 删除所有(停止状态的)服务容器
k8s
google 开源容器编排平台,分布式管理容器,默认容器技术为 docker,提供负载均衡、自动扩缩容、容错、故障恢复,系统监控及日志
Kubernetes 的核心概念包括:
Pod:最小的可部署单元,包含一个或多个容器。 Service:用于暴露 Pod 的网络地址,以便其他服务可以访问它。 ReplicaSet:用于控制 Pod 的数量,以确保指定数量的 Pod 正在运行。 Deployment:用于管理 ReplicaSet 的版本和升级。 Namespace:用于隔离不同的应用程序和服务。 Kubernetes 还提供了一组工具和插件,用于扩展和定制平台,例如:
kubectl:命令行工具,用于管理和操作 Kubernetes 集群。 Helm:包管理工具,用于管理和部署 Kubernetes 应用程序。 Istio:服务网格,用于管理和监控 Kubernetes 集群中的服务通信。
创建一个Pod kubectl create pod [pod名称] --image=[镜像名称]
查看所有Pod kubectl get pods
查看特定Pod的详细信息 kubectl describe pod [pod名称]
删除一个Pod kubectl delete pod [pod名称]
扩展或缩小Pod的副本数量 kubectl scale deployment [deployment名称] --replicas=[副本数量]
查看集群中所有的节点 kubectl get nodes
查看特定节点的详细信息 kubectl describe node [节点名称]
创建一个Deployment kubectl create deployment [deployment名称] --image=[镜像名称]
查看所有Deployment kubectl get deployments
查看特定Deployment的详细信息 kubectl describe deployment [deployment名称]
telepresence
管理和操作 Telepresence 工具的命令行工具
ktctl create 创建一个新的Telepresence代理,将本地环境连接到Kubernetes集群中的服务。
ktctl delete 删除一个Telepresence代理,断开本地环境与Kubernetes集群的连接。
ktctl status 查看当前Telepresence代理的状态,包括连接的服务和代理的运行状态。
ktctl list 列出当前所有的Telepresence代理,可以查看已经创建的代理列表。
本地调试集群服务
telepresence version 查看版本
telepresence status 连接状态
telepresence connect 连接到 Kubernetes 集群
telepresence --namespace [namespace] [command] 在指定的命名空间中执行命令
telepresence --swap-deployment [deployment] --expose [port] 与指定的部署交换,并暴露指定的端口
telepresence --run-shell 在本地 shell 中启动与集群的代理连接
telepresence --env-file [file] 使用指定的环境变量文件启动代理连接
telepresence --docker-run [image] 通过 Docker 运行指定的镜像,并将流量路由到本地
telepresence --quit 退出当前的 telepresence 会话
telepresence --help 获取帮助信息,查看可用的命令和选项
其他
登录方式: 用户名 密码、公钥、证书
本地生成 pubKey privateKey , 公钥加密,私钥解密数据
私钥 -> 数据,公钥,身份信息 一起散列计算,生成签名
公钥 -> 上传到服务器,验证签名
保证签名可信,一般 ca 签发证书(包含公钥,持有者信息,持有者数字签名,机构签名)
windows
setx VARIABLE_NAME "variable_value" /m 配置系统环境变量立即生效
setx PATH "%PATH%;C:\new\path"
setx VARIABLE_NAME "" 删除环境变量
ren aa.txt aa.json 修改文件类型
reg add "HKCU\Control Panel\Desktop" /v LogPixels /t REG_DWORD /d 96 /f 设置系统字体大小
rmdir -r folder 删除文件夹
netstat -ano | findstr :12018 查看指定端口占用进程
taskkill /F /PID 停止进程
tasklist 运行的进程
ipconfig -all
ipconfig /flushdns 刷新dns
hostname -I | awk '{print $1}' 访问wsl服务地址
ssh
客户端
sudo apt install openssh-client # Debian/Ubuntu(通常已预装)
sudo yum install openssh-clients # CentOS/RHEL
ssh -p 22 root@192.168.1.1
密钥连接:
生成密钥对
ssh-keygen -m PEM -t rsa -b 4096 -f C:/Users/wulongmiao/Desktop/z
将公钥上传到服务端,或手动将公钥内容追加到服务端的 ~/.ssh/authorized_keys
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 username@server_ip
ssh -i ~/.ssh/id_ed25519 -p 2222 username@server_ip
编辑 ~/.ssh/config, 之后可直接用 ssh myserver 连接
Host myserver
HostName server_ip
Port 2222
User username
IdentityFile ~/.ssh/id_ed25519
客户端-端口转发
本地转发
ssh -L 1234:db.example.com:5432 user@ssh.example.com
-L 表示进行本地端口转发。
1234 是你本地机器上的端口号。
db.example.com:5432 是目标地址和端口,在这个例子中是数据库服务器及其监听端口。
user@ssh.example.com 是用来登录的SSH用户名和SSH服务器地址。
远程转发(内网穿透)
ssh -R 8080:localhost:80 user@ssh.example.com
-R 表示进行远程端口转发。
8080 是远程服务器上的端口号。
localhost:80 是本地机器上的目标地址和端口
user@ssh.example.com 是用来登录的SSH用户名和SSH服务器地址。
服务端
sudo apt update && sudo apt install openssh-server # Debian/Ubuntu
sudo yum install openssh-server # CentOS/RHEL
sudo dnf install openssh-server # Fedora
sudo systemctl start ssh # 启动服务
sudo systemctl enable ssh # 开机自启
sudo systemctl status ssh # 检查状态
配置文件路径:/etc/ssh/sshd_config
修改后需重启服务生效(sudo systemctl restart ssh)
Port 22 # 默认端口(建议改为非标准端口如 2222 以提高安全性)
ListenAddress 0.0.0.0 # 监听所有 IP(如需限制可改为特定 IP)
PermitRootLogin no # 禁止 root 直接登录(推荐)
PasswordAuthentication yes # 允许密码登录(设为 no 可强制仅密钥登录)
PubkeyAuthentication yes # 启用公钥认证
AllowUsers user1 user2 # 仅允许特定用户登录
DenyUsers baduser # 禁止特定用户登录
示例:限制端口并禁用 root 登录
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart ssh
防火墙放行 SSH 端口
sudo ufw allow 2222/tcp # Ubuntu (ufw)
sudo firewall-cmd --add-port=2222/tcp --permanent && sudo firewall-cmd --reload # CentOS (firewalld)
内网穿透
需要公网IP:
1.远程转发
2.反向代理
3.FRP
三方服务和工具
window远程端口转发(github认证)
ngrok ./ngrok http 3000