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"