《SSH 与文件传输:免密登录、scp 与常见坑》
SSH 是远程管理与文件传输(scp)的基础。本文整理免密登录配置、远程执行命令、文件拷贝以及高频踩坑(known_hosts、私钥权限)。
1 免密登录
假定从本机 A 登录机器 B:
# 1) 在 A 生成密钥对
ssh-keygen -t rsa # 一路回车,默认 ~/.ssh/id_rsa
# 2) 把公钥传到 B 并追加到 authorized_keys
ssh-copy-id user@<b_host> # 最简单的方式
# 或手动追加:
scp ~/.ssh/id_rsa.pub user@<b_host>:/tmp
ssh user@<b_host> "mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys"
ssh user@<b_host> "cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
要点:
- server 端
~/.ssh权限 700、authorized_keys权限 600。 - 私钥权限必须是
600/400,否则 ssh 会拒绝使用(提示 permissions too open)。 - 用
-i <keyfile>指定密钥文件:ssh -i ~/.ssh/id_rsa_colo user@<host>。
2 远程执行命令
# 把本地脚本内容发送到远程执行,脚本参数会 $1 传入
ssh user@<host> 'bash -s' < 本地脚本.sh arg1
# 在远程直接执行一行命令
ssh user@<host> "echo hello >> /home/user/.ssh/authorized_keys"
3 scp 文件传输
# 远程 → 本地
scp -i ~/.ssh/id_rsa user@<host>:/tmp/xx.tar.gz .
# 本地 → 远程
scp server.csr user@<host>:/DoorGod/zx
# 指定端口(scp 用大写 -P)
scp -P 8091 ~/.ssh/id_rsa.pub user@<host>:/home/user/
建议先用 authorized_keys 配好免密,传输过程无需交互输入密码。
4 别名简化登录
在 ~/.bashrc 定义带参数的函数别名:
# source 后即可 sm <ip> 快速登录
alias sm='function _sm(){ ssh -i ~/.ssh/id_rsa user@$1; }; _sm'
5 常见问题
5.1 known_hosts 主机指纹校验
首次连接报 The authenticity of host '...' can't be established,可用 ssh-keyscan 预先把指纹写入 known_hosts(适合批量/自动化):
ssh-keyscan -t rsa -H -p 8091 your.server.com >> ~/.ssh/known_hosts
# IP 形式
ssh-keyscan -t rsa -H -p 22 192.168.1.1 >> ~/.ssh/known_hosts
5.2 私钥权限过放开
ssh 提示 UNPROTECTED PRIVATE KEY FILE 并拒绝使用私钥,因为私钥含敏感数据,仅 owner 应可读写:
chmod 400 ~/.ssh/id_rsa
5.3 Pseudo-terminal will not be allocated
在 ssh 进脚本里再执行 docker exec 时不要加 -it,否则报伪终端错误:
container_id=$(docker ps | grep redis-cc | awk '{print $1}')
# 正常执行
docker exec $container_id redis-cli -p 7004 config get repl-timeout
6 总结
免密三步(生成密钥 → 追加公钥 → 权限校验)+ 私钥权限 400,基本上能满足日常 SSH/scp 自动化的全部需求。
阅读 —
·
全站 —