github推送代码由于网络原因经常失败的解决办法:ssh方式推送
github是全球最大的代码托管平台,但是由于墙的原因,在国内访问经常会有问题,虽然国内也有平替比如gitee,但是说实话比github还是差点意思。
最近发现github推送代码总是失败,查看错误日志一般都是由于网络的原因。
于是各种切换网络,使用各种梯子,但总是不能完美解决问题。
今天实在是忍不了,好好搜了一下解决方法。原来可以用ssh的方式解决这个问题。(原先我下载代码一般习惯用http的方式,这下发现它的弊端了。)下面介绍一下用ssh链接克隆以及推送代码的方法:
用ssh链接clone代码仓库
创建ssh密钥
- 新方式
github说明文档里给的创建ssh密钥方式:
1 | ssh-keygen -t ed25519 -C "公司电脑" |
-t 创建密钥的类型为ed25519
ed25519比下述的rsa方式是一种更新的方式。
-C 注释
- 创建ssh密钥(旧方式 可忽略)
1 | ssh-keygen -t rsa -C "公司电脑" |
-t 指定要创建的密钥类型为rsa
敲了该命令会出现 Enter file in which to save the key (/Users/用户名/.ssh/id_rsa):让输入密钥文件名的提示,可以直接回车,默认生成名为 id_rsa 及 id_rsa.pub 的私钥及公钥。
再次出现Enter passphrase (empty for no passphrase):让输入密码的提示,可以直接回车表示不设密码。
打开github新建ssh key
打开github,点击右上角头像 -> settings -> SSH and GPG keys -> New SSH keys
title随便填,key的输入框中填写上一步生成的公钥文件(id_rsa.pub)中的内容。
重新克隆仓库,复制ssh的链接
此后拉取以及推送代码就不会出现网络问题而导致失败了。
ssh登录远程服务器
命令
1 | ssh xxx@ip |
输完上述命令回车,会要求你输入密码
简化命令
每次输入ssh 用户名@ip比较繁琐,可以在.ssh目录下创建一个config文件,然后写入以下代码
1 | Host myserver # 这里写你的自定义别名 |
现在只需输入ssh myserver等同ssh claus@192.168.1.100 -p 22
ssh免密登录
使用SSH命令将本地生成的公钥(.ssh/id_rsa.pub)复制到远程服务器
1 | ssh-copy-id claus@192.168.1.100 |
或者,如果没有ssh-copy-id命令,可以手动将公钥内容追加到远程服务器的~/.ssh/authorized_keys文件中。以下是手动复制的方法:
1 | cat ~/.ssh/id_rsa.pub | ssh claus@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" |
这条命令会:
- 读取本地公钥内容
- 通过 SSH 登录到远程服务器(需要输入一次密码)
- 在服务器上创建 ~/.ssh 目录(如果不存在),并设置正确权限(700)
- 将公钥内容追加到 authorized_keys 文件中
- 设置 authorized_keys 文件权限为 600
现在,您应该能够通过SSH免密登录到远程服务器,而无需输入密码。
进阶与安全小贴士
使用 ssh-agent 管理密钥:如果为私钥设置了密码(passphrase),每次连接仍需输入,这时 ssh-agent 可以帮你“代劳”。
管理多个密钥:在 ~/.ssh/config 文件中,可以通过 IdentityFile 指令为不同的服务器指定不同的私钥。
配置“跳板机”:如果公司网络需要先登录一台“跳板机”(Jump Server)才能访问其他服务器,也可以在 config 文件中配置,实现“一步直达”。
禁用密码登录:为确保安全,在确认密钥登录配置成功后,建议在远程服务器的 /etc/ssh/sshd_config 文件中将 PasswordAuthentication 设置为 no,然后重启 SSH 服务。这样,只有拥有私钥的人才能登录,安全性大大提高。
scp上传文件或文件夹到远程服务器
1 | # 上传文件 |
linux常用命令
解压缩
1 | yum install -y unzip zip |
mv更名或移动
当第二个参数是文件名时更名,当第二个参数是目录时移动
1 | mv file1.txt file2.txt # 将 file1.txt 重命名为 file2.txt |
rm删除文件/文件夹
1 | rm index.html #删除文件 |
-r 代表向下递归,不管有多少级目录
-f 代表不提示
创建目录
1 | mkdir xxx |
后台跑服务(命令后加 &)
1 | xxx & |
查看正在运行的进程状态(process status)
1 | ps -ef |
yum
yum是 Linux 系统中一款基于 RPM 包管理的命令行软件包管理器。它主要用于 Red Hat 系的发行版,如 RHEL(红帽企业版)、CentOS 和 Fedora(较旧版本)
它的核心价值在于自动处理软件依赖关系。如果你手动用 rpm 命令安装一个软件,经常遇到“缺 A 依赖,装了 A 又缺 B”的依赖地狱;而 yum 会像贴心的管家一样,自动从软件源(Repository)里把所需的所有依赖包一起下载并安装好。
1 | yum install <包名> # 安装指定软件 |
现代替代品 dnf
如果你使用的是 RHEL 8/9、CentOS 8+ 或 Fedora 最新版,系统默认的包管理器已经换成了 dnf(Dandified YUM)
- 虽然为了兼容性,输入 yum 通常仍然生效(软链接到 dnf),但在这些新系统上,建议直接使用 dnf,因为它的依赖解析算法更先进,性能更好,且用 C++ 重写了内核。
- 好消息是:dnf 的命令用法和 yum 几乎 99% 相同,把上面的命令里的 yum 直接换成 dnf 即可无缝使用。
其他安装软件的方式
wget
wget 本身不是一种“安装方式”,而是一个“下载工具”。
1 | wget https://example.com/nginx.rpm # 下载 |
curl
万能数据传输。它不仅能下载,还能模拟浏览器发请求、调 API 接口、查看网页源码。它默认把内容打印在屏幕上
网络“管道”安装:curl ... | bash
这是网上教程最常见也最危险的“一行命令”:
1 | curl -fsSL https://example.com/install.sh | bash |
它本质上是从网上下载一个 Shell 脚本,并直接交给 Bash 解释执行。这个脚本里写什么,系统就执行什么(可能是在线安装、配置环境变量、甚至删除文件)
“即下即用”的单文件格式:AppImage
这是一种无需安装的格式。软件被打包成一个单独的 .AppImage 文件,下载后给它加上执行权限(chmod +x),双击就能运行,不用解压、不用安装、不用 root 权限。用完直接删掉文件,系统干干净净,不留任何痕迹。
内核级驱动安装:DKMS(动态内核模块支持)
这不是安装普通应用,而是安装内核驱动模块(如显卡驱动、VirtualBox 内核增强)。它会在你每次升级 Linux 内核时,自动重新编译驱动,确保驱动版本与最新内核匹配。如果你用 yum 装显卡驱动,底层往往调用的就是 DKMS 机制。
不可变系统的“原子更新”:rpm-ostree
这是 CentOS 8/9 中 CoreOS 或 Silverblue 变种使用的技术。它不直接修改根文件系统,而是把整个操作系统当成一个 Git 仓库来管理。你执行 rpm-ostree install nginx,它不会立刻改动当前系统,而是下载一个完整的系统镜像层,重启时直接切换到这个新镜像。
主流操作系统的包管理器
| 操作系统 | 包管理器 | 说明 |
|---|---|---|
| Red Hat 系 (CentOS/RHEL/Fedora) | yum / dnf | 后缀为 .rpm |
| Debian 系 (Ubuntu/Debian) | apt / apt-get | 同样自动解决依赖,后缀为 .deb(最流行的 Linux 桌面/服务器) |
| Arch 系 (Manjaro/Arch) | pacman | 滚动更新,软件包极新,深受极客喜爱 |
| macOS | brew (Homebrew) | Mac 上的包管理器,用来装命令行工具(如 wget、node)。注意:brew 在 Linux 上也能装,但一般不作为主力,Linux 还是优先用系统自带的 apt/yum |
| Windows | winget / choco | Windows 原生包管理器,还在发展中 |

