一、以下是一些常用的 SSH 命令:
-
ssh
- 连接到远程服务器,例如:ssh user@host
。如果需要使用非默认的 SSH 密钥,则可以使用-i
参数指定私钥文件。 -
scp
- 在本地计算机和远程服务器之间复制文件,例如:scp file.txt user@host:/remote/folder/
。如果需要使用非默认的 SSH 密钥,则可以使用-i
参数指定私钥文件。 -
ssh-keygen
- 用于创建、管理和转换 SSH 密钥。 -
ssh-copy-id
- 将公钥添加到远程服务器的authorized_keys
文件中,以便使用 SSH 免密码登录。 -
ssh-agent
- 用于管理 SSH 密钥,以便在不用每次输入密码的情况下连接到多个远程服务器。 -
ssh-add
- 将 SSH 私钥添加到 SSH 代理中,以便在不用每次输入密码的情况下连接到远程服务器。 -
ssh-keyscan
- 用于扫描远程服务器的公钥,以便将其添加到本地计算机的known_hosts
文件中,从而防止 SSH 主机密钥更改攻击。
这些是 SSH 中一些常用的命令,还有其他一些命令可以帮助您管理 SSH 密钥和连接。您可以使用 man
命令来查看每个命令的详细信息和选项。例如:man ssh
或 man ssh-keygen
。
二、 ssh-keygen
命令的参数的简要说明:
-
-q
:静默模式,减少输出信息。 -
-a rounds
:指定 key derivation function 迭代的次数,默认是 16。 -
-b bits
:指定密钥的位数,默认是 2048 位。根据需要调整位数,例如 4096 位可以提供更高的安全性,但会增加处理时间。 -
-C comment
:指定一个注释,将注释添加到生成的密钥中。 -
-f output_keyfile
:指定输出的密钥文件名。 -
-m format
:指定输出的密钥文件格式,可以是PEM
,PKCS8
等。 -
-N new_passphrase
:指定新的密钥短语。 -
-O option
:指定一些特定的选项,例如sk-ecdsa-sha2-nistp256@openssh.com
选项启用 ECDSA SSH 密钥。 -
-t type
:指定要生成的密钥类型,可以是dsa
,ecdsa
,ecdsa-sk
,ed25519
,ed25519-sk
或rsa
。 -
-w provider
:指定加密密钥的软件实现。 -
-Z cipher
:指定加密算法,例如blowfish-cbc
或aes256-cbc
。
这些参数是 ssh-keygen
命令中的常见选项,可以根据需要进行调整和使用。您可以使用 man ssh-keygen
命令查看完整的选项列表和使用方法。
举例说明:
ssh-keygen -t rsa -b 4096 -C "My RSA key" -f ~/.ssh/my_rsa_key -N "my_password" -m PEM -O "no-port-forwarding" -Z aes256-cbc
这个命令将生成一个 4096 位的 RSA 密钥,注释为 "My RSA key",输出文件为 ~/.ssh/my_rsa_key
,新短语为 "my_password",格式为 PEM,禁用了端口转发,使用 aes256-cbc 算法进行加密。您可以根据需要调整这些参数,以生成适合您需要的 SSH 密钥。
三、如何在一台电脑上配置多个 SSH 密钥
比如新建一个shh key:
ssh-keygen -t rsa -b 4096 -C "my_email@example.com" -f ~/.ssh/my_ssh_key
shh密钥加入代理:
ssh-add ~/.ssh/my_ssh_key
请确保为每个密钥生成不同的名称,并将其添加到 SSH 代理中,以便在使用不同的 SSH 密钥时切换。
删除代理:
ssh-add -d ~/.ssh/my_ssh_key
查看代理:
ssh-add -l,若报错Could not open a connection to your authentication agent.说明SSH 代理尚未启动或无法连接到代理,可以执行:
ssh-agent -k
eval $(ssh-agent)
些命令会终止当前运行的 SSH 代理进程,并重新启动一个新的代理进程
四、不同的密钥用于不同的 Git 仓库
请在 ~/.ssh/config
文件中指定不同的主机别名和密钥文件路径。例如:
Host * ForwardAgent yes ServerAliveInterval 60 ControlMaster auto ControlPersist 10m Host github.com IdentityFile ~/.ssh/my_github_key Host gitlab.com IdentityFile ~/.ssh/my_gitlab_key Host myserver Hostname example.com User myusername IdentityFile ~/.ssh/myprivatekey Port 22 ProxyCommand ssh -q proxyserver nc %h %p ConnectTimeout 10 LocalForward 8080 localhost:80 Host myotherserver Hostname anotherexample.com User myusername IdentityFile ~/.ssh/myotherprivatekey Port 2222 ServerAliveInterval 120 Host gerrit HostName "192.168.108.54" User "shayishow" IdentityFile "~/.ssh/id_rsa" port 29418 Host * KexAlgorithms +diffie-hellman-group1-sha1 HostkeyAlgorithms +ssh-rsa PubkeyAcceptedKeyTypes +ssh-rsa
上面的Host *
是一个特殊的主机名,用于配置全局选项。
当 SSH 客户端连接到一个主机时,它会首先查找是否有与该主机名匹配的配置,如果没有,就会使用 Host *
中配置的选项。
这意味着,通过在 Host *
部分配置选项,可以让这些选项应用于所有的主机连接。例如,在上面的示例中,Host *
中配置了 ForwardAgent
、ServerAliveInterval
、ControlMaster
和 ControlPersist
等选项,这些选项将应用于所有的 SSH 连接。
如果某个主机的选项与全局选项冲突,那么主机配置中的选项将覆盖全局选项。这样,可以在全局选项的基础上对某个主机进行个性化的配置。