SSH

ssh-keygen为ssh生成、管理和转换认证密钥,ssh-keygen命令用于为ssh生成、管理和转换认证…

ssh-keygen 命令详解

ssh-keygenssh生成、管理和转换认证密钥,ssh-keygen命令用于为ssh生成、管理和转换认证密钥,它支持RSADSA两种认证密,SSH 密钥默认保留在 ~/.ssh 目录中。 如果没有 ~/.ssh 目录,ssh-keygen命令会使用正确的权限创建一个。

bash
#命令语法
ssh-keygen [选项]
命令选项
-b:指定密钥长度;  
-e:读取openssh的私钥或者公钥文件
-C:添加注释,不指定,则comment内容默认为user@hostname
-f:指定用来保存密钥的文件名,不指定f参数,则默认存到~/.ssh/下,生成id_rsa和id_rsa.pub两个文件; 
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;  
-l:显示公钥文件的指纹数据;  
-N:提供一个新密语;  
-P:提供(旧)密语;  
-q:静默模式;  
-t:指定要创建的密钥类型。rsa
-m: 指定生成的密钥文件中所使用的格式。在这种情况下,`-m PEM` 指定了生成的密钥文件将采用 PEM 格式。 SSH 支持多种不同的密钥格式,包括 PEM、OpenSSH PKCS#8 等。

基本示例

bash
#以下 ssh-keygen 命令默认在 ~/.ssh 目录中生成 4096 位 SSH RSA 公钥和私钥文件。 如果当前位置存在 SSH 密钥对,这些文件将被覆盖。
ssh-keygen -m PEM -t rsa -b 4096
#使用ssh-kengen会在~/.ssh/目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是
#id_rsa  私钥文件
#id_rsa.pub  公钥文件
#指定秘钥文件路径

ssh-keygen -t rsa -C 'rumenz@qq.com' -f ~/.ssh/github_id_rsa
#或者,在指定存放文件时输入一个新的文件名
#> Enter file in which to save the key(/Users/rumenz/.ssh/id_rsa):id_rsa_gitlab
#多个SSH key的管理的情况就需要指定秘钥文件名。

ssh-keygen密钥是什么

密钥是一对由非对称加密方法生成的 公钥(public key)私钥(private key),且每次生成后的公钥和私钥都是以一一对应,每个公钥有且仅有一个私钥。

其中公钥是可以公开发送的,使用公钥加密的信息必须使用对应的私钥才可以解密

打开终端使用 ssh-keygen命令生成密钥,-t用于指定密钥的加密算法,一般可使用 DSARSA算法,-C用来指定标识邮箱

Enter file in which to save the key (/home/username/.ssh/id_dsa):这里是输入您所期望密钥对生成后的目录,默认情况下可以在 $HOME/.ssh目录下找到,需要注意点的是,root用户与其他用户目录稍稍有点不同,其他用户在 /home/$username/.ssh目录下,而root目录在 /root/.ssh/

Enter passphrase (empty for no passphrase):,输入加密的口令最短五个字符,这里我的理解就是随意输入一个加密的串,当然也可以不输入,默认空串

生成密钥以后,建议修改它们的权限,防止其他人读取。

$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub

chmod 是一个更改文件权限的命令,使用数字比较方便但不太好记,每位数字代表不同的域 第一位代表文件或目录所属用户、第二位代表文件或目录所属用户组、第三位代表其他所有用户

  • 可运行 +x 数字代表是 1
  • 可写 +w 数字代表是 2
  • 可读 +r 数字代表是4

因此 6=2+4 即为只能读写

使用密钥对免密登录的步骤
  1. 客户端使用 ssh-keygen生成密钥对,命令可以使用ssh-keygen -t rsa -C "youremail@doamin.com",输入指纹是可选的。
  2. 将公钥 id_rsa.pub复制到目标服务器(服务端)$HOME/.ssh目录下,并更名为 authorized_keys或者附加到 authorized_keys
  3. 重启目标服务器的ssh服务,这点很重要,可以使用 systemctl restart sshd
  4. 客户端再次发送 ssh username@hostname即可直接登录

ssh-keygen –t rsa –C "git仓库邮箱"

测试登录

ssh -T git@github.com

生成SSH

ssh-keygen -t rsa
ssh-keygen:生成SSH私钥和公钥
-t:指定生成的加密算法
-C:描述

配置config:

通常利用 ssh 连接远程服务器,一般都要输入以下类似命令:

ssh user@hostname -p port

  如果拥有多个 ssh 账号,特别是像我这种喜欢在终端里直接 ssh 登陆,又不用 PuTTYSecureCRT之类的 ssh 客户端的,要记住每个ssh 账号的参数,比较浪费精力、时间。   还好 ssh 提供一种优雅且灵活的方式来解决这个问题,就是利用 ssh 的用户配置文件 config 管理 ssh 会话。ssh 的用户配置文件是放在当前用户根目录下的 .ssh 文件夹里(~/.ssh/config,不存在则新创建一个),其配置写法如下:

Host 别名
HostName 主机名
Port 端口
User 用户名
IdentityFile 密钥文件的路径
IdentitiesOnly 只接受SSH key 登录
PreferredAuthentications 强制使用Public Key验证
  ProxyCommand "C:\\Program Files\\Git\\mingw64\\bin\\connect.exe" -S 127.0.0.1:10808 %h %p 使用代理转发ssh

进入相关的配置后,就可以这样用 ssh 登陆服务器了:

ssh 别名

~/.ssh/config 文件:

Host github
  HostName github.com
  User git
  IdentityFile C:\Users\maluyao\.ssh\github
  
# github
Host github.com 
    HostName github.com 
    PreferredAuthentications publickey 
    IdentityFile ~/.ssh/id_rsa.github
    
如果在Host字段设置为github,那就是能用别名登录,ssh git.com的时候不会主动使用别名github
如果设置为Host github.com ,那么ssh相应的GitHub.com就能自动匹配
就比如对于地址:git@github.com:maluyaotop/main.git
就需要:git clone git@github.com:maluyaotop/main.git
ssh://git@code.iflytek.com:30004/EDU_zhixue_pt/xq-parent/web-xq-parent/parent-register-h5.git
地址协议类型格式结构说明
git@github.com:maluyaotop/main.gitSSH (简写)user@host:path/to/repo.git常见于 GitHub,紧凑简洁
ssh://git@code.iflytek.com:30004/EDU_zhixue_pt/...SSH (完整 URI)ssh://user@host:port/path/to/repo.git
1. git@github.com:maluyaotop/main.git
使用了 SSH 简写格式

实际等价于:ssh://git@github.com/maluyaotop/main.git

没有显式指定端口,使用默认的 22 端口

适用于大多数托管平台(如 GitHub)

2. ssh://git@code.iflytek.com:30004/EDU_zhixue_pt/...
使用了 标准 SSH URI 格式

指定了自定义端口:30004

更适合企业内网、自建 GitLab/Git 服务器等

针对githubgitlab分别生成公钥和私钥 ssh user@hostname -p port ssh-keygen -t rsa -C "luohoufu@company.com" -f ~/.ssh/id_rsa.gitlab ssh-keygen -t rsa -C "luohoufu@163.com" -f ~/.ssh/id_rsa.github

添加私钥 ssh-add ~/.ssh/id_rsa.gitlab ssh-add ~/.ssh/id_rsa.github ssh-add -l

ssh-add 命令用于将 SSH 私钥添加到 ssh-agent 的高速缓存中,以便后续的 SSH 连接可以自动使用这些私钥进行身份验证。

基本语法如下: ssh-add [option] [keyfile] 一些常见的选项包括:

-l:列出当前在 ssh-agent 中缓存的私钥。 -d:从 ssh-agent 缓存中删除指定的私钥。 通过运行 ssh-add 命令,并提供私钥文件名作为参数,可以将私钥添加到 ssh-agent 缓存中,从而允许用户在不需要再次输入密钥密码的情况下进行 SSH 连接。

Linux配置SSH登录
如果无法登录,请检查权限:
.ssh目录:700
•.pub公钥文件:644
id_rsa私钥文件:600 
authorized_keys:600

ssh代理

你想通过 SSH 访问一个公司内网的主机(例如 ssh iflytek -T),但由于这是内网服务,你必须通过一个本地设置好的代理(端口为 10808)进行转发。

以下是你可以采用的方法,取决于你使用的代理类型(HTTP 代理 / SOCKS5 代理)。


✅ 情况一:你使用的是 SOCKS5 代理(最常见,很多内网穿透工具如 proxychainsv2ray, sshuttle 等都是 SOCKS5)

你可以使用 ProxyCommand 来配置 SSH,通过代理进行连接。

方法 1:使用命令行 + ncconnect-proxy 工具

安装必要的工具(任选其一):

  • nc(带 -X 5 支持 SOCKS5,部分版本如 netcat-openbsd 支持)
  • 或者:connect-proxy 工具

然后运行以下命令(以 SOCKS5 为例):

ssh -o "ProxyCommand=nc -x 127.0.0.1:10808 -X 5 %h %p" iflytek -T

或者使用 connect-proxy

ssh -o "ProxyCommand=connect-proxy -S 127.0.0.1:10808 %h %p" iflytek -T

✅ 情况二:你使用的是 HTTP 代理

可以通过 connect-proxy 工具来实现 HTTP 代理转发:

ssh -o "ProxyCommand=connect-proxy -H 127.0.0.1:10808 %h %p" iflytek -T

✅ 更优雅的方式:修改 ~/.ssh/config

为了不每次都输入复杂参数,你可以修改 SSH 配置文件:

nano ~/.ssh/config

添加以下内容:

Host iflytek
    HostName iflytek
    ProxyCommand nc -x 127.0.0.1:10808 -X 5 %h %p
    # 或者(如果是 HTTP 代理):
    # ProxyCommand connect-proxy -H 127.0.0.1:10808 %h %p

然后你只需要执行:

ssh iflytek -T

我们就选一个稳定、简单的 第三方工具 来实现 SOCKS5 代理下的 SSH,适用于 Windows。

下面是几个可行且常用的工具推荐:


✅ 推荐工具 1:connect.exe(超轻量 SOCKS5/HTTP 代理转发器)

🔹 特点:
  • 单个可执行文件(不到 100KB)
  • 无需安装
  • 支持 SOCKS5 和 HTTP 代理
  • 可直接配合 ssh 使用
  • 开源:源自 connect.c

Git 自带的 connect.exe(最轻量)

如果你已经安装了 Git for Windows,那么实际上你已经拥有 connect.exe,不需要额外下载:

  • 这个 connect.exe 位于 Git 安装目录下,例如:

    C:\Program Files\Git\mingw64\bin\connect.exe
  • 各类博客和教程都提到,Git 自带的 connect.exe 就可以直接用于 ProxyCommand 设置

  • Host iflytek
        HostName iflytek.company.internal
        ProxyCommand "C:\\Program Files\\Git\\mingw64\\bin\\connect.exe" -S 127.0.0.1:8868 %h %p
    

如果你的代理是 SOCKS5:

Host iflytek
    HostName iflytek
    ProxyCommand C:\Tools\connect.exe -S 127.0.0.1:8868 %h %p

如果你的代理是 HTTP:

Host iflytek
    HostName iflytek
    ProxyCommand C:\Tools\connect.exe -H 127.0.0.1:8868 %h %p

ssh-copy-id

将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利

ssh-copy-id -u eucalyptus -i ~eucalyptus/.ssh/id_rsa.pub ssh usrname@192.168.x.xxx

ssh-agent

将口令保存在内存中

这两个命令可能会陌生一些,但也是咱们使用非对称密钥传输的重要工具,通常是在**密钥对生成时私钥(private key)增加了口令,因此无论是 scp/sftp/ssh均需要在私钥解密前,输入对应的口令。

每次使用私钥均需要输入口令,那不又回到最初的原点了,ssh-agentssh-add就是来带你走出原点而设计的。

第一步,使用下面的命令新建一次命令行对话。

bash
ssh-agent bash

上面命令中,如果你使用的命令行环境不是 Bash,可以用其他的 Shell 命令代替。比如 zshfish

如果想在当前对话启用 ssh-agent,可以使用下面的命令。

bash
$ eval `ssh-agent`
Agent pid 8627

上面命令中,ssh-agent会先自动在后台运行,并将需要设置的环境变量输出在屏幕上,类似下面这样。

bash
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-8nNIF0cc0eJn/agent.8934; export SSH_AUTH_SOCK;
SSH_AGENT_PID=8935; export SSH_AGENT_PID;
echo Agent pid 8935;

eval命令的作用,就是运行上面的 ssh-agent命令的输出,设置环境变量。

第二步,在新建的 Shell 对话里面,使用 ssh-add命令添加默认的私钥(比如 ~/.ssh/id_rsa,或 ~/.ssh/id_dsa,或 ~/.ssh/id_ecdsa,或 ~/.ssh/id_ed25519)。

$ ssh-add
Enter passphrase for /home/you/.ssh/id_dsa: ********
Identity added: /home/you/.ssh/id_dsa (/home/you/.ssh/id_dsa)

上面例子中,添加私钥时,会要求输入密码。以后,在这个对话里面再使用密钥时,就不需要输入私钥的密码了,因为私钥已经加载到内存里面了。

第三步,使用 ssh 命令正常登录远程服务器。

bash
$ ssh username@remoteHost

上面命令中,remoteHost是远程服务器的地址,ssh 使用的是默认的私钥。这时如果私钥设有密码,ssh 将不再询问密码,而是直接取出内存里面的私钥。

如果要使用其他私钥登录服务器,需要使用 ssh 命令的 -i参数指定私钥文件。

bash
$ ssh –i OpenSSHPrivateKey remoteHost

最后,如果要退出 ssh-agent,可以直接退出子 Shell(按下 Ctrl + d),也可以使用下面的命令。

bash
$ ssh-agent -k

ssh-add对私钥口令的操作

如果添加的不是默认私钥,ssh-add命令需要显式指定私钥文件

$ ssh-add my-other-key-file

my-other-key-file就是用户指定的私钥文件。

  1. -d参数从内存中删除指定的私钥。
$ ssh-add -d name-of-key-file
  1. -D参数从内存中删除所有已经添加的私钥。
$ ssh-add -D
  1. -l参数列出所有已经添加的私钥。
$ ssh-add -l

为其他用户创建ssh密钥的步骤

bash
## 密钥对可通过 ssh-keygen -t rsa -C ‘comment’ -f filename 生成。该命令通常在 /usr/bin 下,生成 2 个文件:filename(私钥) 和 filename.pub(公钥)。
## 切换为目标用户
su - 用户名
#如果已经是该用户操作先回到家目录
cd ~
#查看是否以前设置过密钥,没有.ssh文件的没有设置过密钥,有可以删除重设
ll -a
#生成密钥,按提示操作
ssh-keygen
#成功后
chmod -R 700 .ssh/ #注意权限!
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 .ssh/authorized_keys #注意权限!
#然后私钥文件同在.ssh目录下id_rsa,下载到本地,登陆时设置下即可
sz id_rsa
#会弹出文件目录选择框,自己选好位置下载好把服务器的删除即可
rm -f  id_rsa

这里需要注意,如果 authorized_keys 文件、HOME/.ssh 目录 或 $HOME 目录让本用户拥有者之外的用户有写权限,那么 sshd 就会拒绝使用 ~/.ssh/authorized_keys 文件中的 key 来进行认证。所以也就无法成功使用私钥登录

npm设置代理

设置代理

#设置http代理
npm config set proxy http://proxy-server:port
#案例
npm config set proxy http://127.0.0.1:1080
#设置https代理
npm config set https-proxy https://proxy-server:port
#案例
npm config set proxy https://127.o.o.l:l080

删除代理

npm config delete proxy
npm config delete https-proxy

恢复官方 npm 源

npm config set registry https://registry.npmjs.org/

检查配置是否恢复成功

npm config list

评论

评论加载中……