SSH 配置及使用Page Cover
SSH 配置及使用
April 5th 20258 min read1584 words

sshd Server

安装前检查ssh服务状态

sudo ps -e |grep ssh

如果显示只有 ssh-agent, 而没有 sshd 服务项,那么你的系统中 ssh 服务端程序便没有启动

# 安装 openssh-server sudo apt install openssh-server # 安装完成后,SSH服务默认自动启动,你可以通过以下命令校验服务运行状态: sudo systemctl status sshd # 如果你启用了防火墙,请确保防火墙打开了 SSH 端口,命令如下: sudo ufw allow ssh

网络连通性测试(Client 上)

nc -zv xxx.xxx.xxx.xxx 2222

如果提示 Connection refused 或 No route to host,就是网络问题或远程端口没开放。

防火墙放行 SSH 端口

UFW

# 如果你启用了防火墙,请确保防火墙打开了 SSH 端口 sudo ufw allow ssh

Fedora firewall

# 列出放行端口 sudo firewall-cmd --list-ports # 列出所有 firewall 信息 sudo firewall-cmd --list-all # --add-port=2222/tcp:开放 2222 的 TCP 连接, --permanent:把规则写入配置文件 sudo firewall-cmd --add-port=52239/tcp --permanent sudo firewall-cmd --reload

sshd 配置

sudo vim /etc/ssh/sshd_config Port 22 # 服务端口,务必修改 PubkeyAuthentication yes # 启用密钥配对认证方式 AuthorizedKeysFile .ssh/authorized_keys # 公钥存放文件路径 ~/.ssh PasswordAuthentication no # 禁用密码连接

sshd 管理

sudo systemctl start sshd sudo systemctl stop sshd sudo systemctl restart sshd # 跟随系统启动 sudo systemctl enable sshd # 禁止 SSH 跟随系统启动 sudo systemctl disable sshd

SSH 密钥

使用 ssh-keygen 生成密钥对

# 生成一个新的 4096 位 SSH 密钥对,并添加注释:"MacBook@user1" ssh-keygen -b 4096 -C MacBook@user1 -f /Users/username/.ssh/id_rsa # 修改 .ssh/id_rsa 密码 ssh-keygen -p -f /Users/username/.ssh/id_rsa

ssh-keygen常见参数:

-p: 修改已生成 key 密码 -t:指定生成密钥的类型,默认使用SSH2d的rsa -f:指定生成密钥的 path,默认 ~/.ssh/id_rsa(私钥id_rsa,公钥id_rsa.pub) -b:指定密钥长度(bits),RSA最小要求768位,默认是2048位;DSA密钥必须是1024位(FIPS 1862标准规定) -C:添加注释;服务端辨认公钥 -R hostname:从known_hosta(第一次连接时就会在家目录.ssh目录下生产该密钥文件)文件中删除所有属于hostname的密钥 -e:读取openssh的私钥或者公钥文件; -i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥; -l:显示公钥文件的指纹数据; -q:静默模式;

使用 ssh-agent 管理密钥对

ssh-agent

ssh-agent 是一个后台程序,用于管理 SSH 密钥对。当你使用 SSH 连接到远程服务器时,通常需要提供私钥来验证身份。ssh-agent 的作用是存储私钥并在需要时自动提供,避免每次连接时都手动输入私钥密码。

主要功能:

  • 保持 SSH 私钥在内存中,避免每次使用 SSH 时都需要输入密码。
  • 在一个会话中可以使用多个 SSH 密钥。

ssh-add

ssh-add 是用来向 ssh-agent 添加或移除密钥的命令。你可以通过它将私钥添加到 ssh-agent 中,这样就可以在后续的 SSH 会话中自动使用这些密钥。

添加到 agent 的密钥只在当前登录会话中有效,一旦你关闭终端、注销、重启,SSH Agent 进程就会结束,密钥就会被清除,用于在同一会话下的多次连接,避免重复输入私钥密码

ssh-add .ssh/id_rsa # 添加密钥,如果私钥设置了密码,第一次需要输入密码 ssh-add -d .ssh/id_rsa # 移除密钥 ssh-add -l # 列出密钥

SSH transfer files

以上传公钥为例

ssh-copy-id

# 将公钥文件 `~/.ssh/my_key.pub` 强制复制到远程主机 `user@hostname`,指定远程主机端口为 2222 ssh-copy-id -i ~/.ssh/my_key.pub -p 2222 -f user@hostname
  • -i [identity_file]: 指定要复制的公钥。默认 ~/.ssh/id_rsa.pub

  • -t [target_path]: 指定远程主机上目标路径,通常是 /home/username/.ssh/authorized_keys ,必须使用绝对路径,不要使用~

  • -p [port]: 指定远程主机的端口,默认是 22

  • -f: 强制模式。无论公钥是否已经存在,都会复制公钥到远程主机

  • -n: 演练模式(dry run)。不会实际复制公钥,仅显示会发生的操作

  • -s: 使用 sftp。如果远程主机只允许 SFTP 而不允许执行 SSH 命令

  • -x: 启用调试模式,等同于执行 ssh 时加上 -x 选项,会输出更多的调试信息

  • -F [alternative ssh_config file]: 使用自定义的 ssh_config 文件,默认使用 ~/.ssh/config

CAT

# cat cat ~/.ssh/id_rsa.pub | ssh -p 22 username@ip_address "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

SCP

# scp 文件名 远程用户名@IP:远程存放路径 scp -P 22 id_rsa.pub [email protected]:/home/geek0ne/Code #传输单个文件 chmod 400 /path/to/id_rsa # 先添加密钥的only accessible to you 权限 scp -P 22 -r -i path/to/id_rsa Demo [email protected]:/home/geek0ne/Code #密钥目录 scp -P 22 -r Demo [email protected]:/home/geek0ne/Code #传输目录

SFTP

交互式管理远程文件(例如浏览文件、创建目录、删除文件等),或者需要传输大量文件,SFTP 更加灵活和适用。

连接

# 使用指定端口连接 sftp -P 2222 user@hostname # 上传目录 sftp -r /local/directory user@hostname:/remote/directory # 启用压缩传输文件 ```bash sftp -C user@hostname # 指定私钥文件进行身份验证 sftp -i ~/.ssh/my_key user@hostname # 通过中间主机跳跃连接 sftp -J jump_host user@hostname

基本用法

  • ls:列出远程目录内容。
  • cd:切换远程目录。
  • lcd:切换本地目录。
  • put:上传文件。
  • get:下载文件。
  • mkdir:在远程主机创建目录。
  • rmdir:删除远程目录。
cd /remote/directory lcd /local/directory put localfile /remote/directory/ get /remote/file localfile exit

SSH Client

基本使用

#P 指定端口。 ssh -p 22 [email protected]

配置好公钥、私钥后免密连接

别名

# ~/.ssh/config 文件 Host shortName HostName 192.168.225.50 User user1 Port 60039 IdentityFIle ~/.ssh/id_rsa # 私钥

使用 ssh shortName 即可连接

Copy Paste

大部分终端都支持 OSC 52 协议

nvim 配置

vim.g.clipboard = { name = 'OSC 52', copy = { ['+'] = require('vim.ui.clipboard.osc52').copy('+'), ['*'] = require('vim.ui.clipboard.osc52').copy('*'), }, paste = { ['+'] = require('vim.ui.clipboard.osc52').paste('+'), ['*'] = require('vim.ui.clipboard.osc52').paste('*'), }, }

tmux

set-option -s set-clipboard on set-option -g allow-passthrough on

Shell Behavior

ssh 连接 server shell 不会加载 .bashrc,只会按顺序加载 .bash_profile .profile

通过 ssh 执行命令时会加载 .bashrc

# 会加载 .bashrc 里的内容 echo "Hello world" | ssh -p 60039 username@ip_address "cat >> ~/hello"

其他

SSH 命令的三种代理功能(-L/-R/-D)


end