《SSH 与文件传输:免密登录、scp 与常见坑》

《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 自动化的全部需求。

阅读 — · 全站 —
🎸 我的歌单 0 首