当前位置: 首页 > news >正文

Linux运维实战:巧用文件操作实现SSH免密登录配置

背景介绍

在日常的Linux服务器运维工作中,配置SSH免密登录是提高工作效率的必备技能。通常我们会使用ssh-copy-id命令来快速实现这一功能,但在某些最小化安装的Linux系统中,这个命令可能并不存在。今天我就遇到了这样一个实际案例,并找到了一个简单有效的替代方案。

问题场景

需要在机器1上配置到机器2的SSH免密登录,执行标准命令时遇到了问题:

# 标准做法(但在此环境中失败)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.100

系统提示:

-bash: ssh-copy-id: command not found

解决方案

传统方法回顾

正常情况下,ssh-copy-id命令的工作原理是:

  1. 将本地的公钥文件内容复制
  2. 通过SSH连接到目标机器
  3. 将公钥追加到目标机器的~/.ssh/authorized_keys文件中

替代方案:手动文件操作

既然ssh-copy-id不可用,我们可以手动实现这一过程。以下是详细步骤:

步骤1:在机器1上查看公钥内容

# 查看生成的公钥文件内容
cat ~/.ssh/id_rsa.pub# 或者使用更清晰的显示方式
echo "机器1的公钥内容:"
cat ~/.ssh/id_rsa.pub

典型的RSA公钥内容格式如下:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8...(省略后续内容)... root@machine1

步骤2:在机器2上手动添加公钥

# 方法1:直接使用echo命令(适用于单行内容)
# 注意:这里需要将机器1的公钥内容复制过来
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8..." >> ~/.ssh/authorized_keys# 方法2:更好的做法是先确保目录和文件存在
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

步骤3:完整的手动流程脚本

为了方便操作,可以创建一个脚本:

#!/bin/bash
# 文件名:manual_ssh_copy.shREMOTE_USER="root"
REMOTE_IP="192.168.1.100"
PUB_KEY_FILE="$HOME/.ssh/id_rsa.pub"# 检查本地公钥文件是否存在
if [ ! -f "$PUB_KEY_FILE" ]; thenecho "错误:公钥文件不存在,请先生成SSH密钥"echo "运行:ssh-keygen -t rsa -b 2048"exit 1
fi# 显示公钥内容
echo "=========================================="
echo "请将以下公钥内容复制到远程机器的authorized_keys文件中:"
echo "=========================================="
cat "$PUB_KEY_FILE"
echo "=========================================="# 提供手动操作指南
echo ""
echo "手动操作步骤:"
echo "1. 登录到目标机器:ssh ${REMOTE_USER}@${REMOTE_IP}"
echo "2. 执行以下命令:"
echo "   mkdir -p ~/.ssh"
echo "   chmod 700 ~/.ssh"
echo "   echo '$(cat "$PUB_KEY_FILE")' >> ~/.ssh/authorized_keys"
echo "   chmod 600 ~/.ssh/authorized_keys"
echo "3. 验证配置:ssh ${REMOTE_USER}@${REMOTE_IP} 'hostname'"

更优雅的解决方案

方法1:使用ssh命令直接追加

如果机器2已经可以通过密码登录,可以使用单行命令:

# 使用ssh命令直接将公钥追加到远程文件
cat ~/.ssh/id_rsa.pub | ssh root@192.168.1.100 \
"mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

方法2:创建自己的ssh-copy-id函数

可以将以下代码添加到~/.bashrc文件中,实现自定义的ssh-copy-id功能:

# 自定义ssh-copy-id函数
my_ssh_copy_id() {if [ -z "$1" ]; thenecho "使用方法: my_ssh_copy_id user@hostname"return 1fiKEY_FILE="$HOME/.ssh/id_rsa.pub"if [ ! -f "$KEY_FILE" ]; thenecho "错误:公钥文件不存在"return 1ficat "$KEY_FILE" | ssh "$1" \"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \cat >> ~/.ssh/authorized_keys && \chmod 600 ~/.ssh/authorized_keys"echo "公钥已成功添加到 $1"
}# 使用示例
# my_ssh_copy_id root@192.168.1.100

配置验证与测试

配置完成后,需要进行验证:

# 测试免密登录
ssh -o ConnectTimeout=5 root@192.168.1.100 "echo 'SSH免密登录配置成功!'"# 检查authorized_keys文件权限(重要!)
ssh root@192.168.1.100 "ls -la ~/.ssh/authorized_keys"
# 正确的权限应该是 -rw------- 或 600

常见问题排查

问题1:权限不正确

# 如果权限不对,在目标机器上执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

问题2:SELinux限制

# 检查SELinux状态
sestatus# 如果是Enforcing模式,可能需要调整上下文
restorecon -Rv ~/.ssh

问题3:SSH配置限制

检查/etc/ssh/sshd_config中的相关配置:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

安全建议

  1. 使用更安全的密钥类型

    ssh-keygen -t ed25519 -C "your_email@example.com"
    
  2. 限制访问来源
    authorized_keys文件中添加命令限制:

    command="/bin/bash",from="192.168.1.*" ssh-ed25519 AAAAC3Nza...
    
  3. 定期清理
    定期检查authorized_keys文件,删除不再需要的公钥。

http://www.jsqmd.com/news/201235/

相关文章:

  • 1小时验证创意:用AI插件快速构建MVP
  • 悉尼科技大学重磅突破:让AI学会“看-想-编辑“的视频编辑新方法
  • java家校联系合作平台vue3
  • 救命神器!专科生10个AI论文网站测评TOP10
  • 复旦大学重磅突破:让AI更聪明的“想象力“秘密武器
  • 告别媒体查询:AutoFit.js让响应式开发效率提升300%
  • 应对大数据领域数据共享的网络挑战
  • 北京通用人工智能研究院突破:让AI像人类大脑一样并行思考推理
  • 注解开发管理第三方bean
  • SecureCRT高手技巧:比传统方式快10倍的操作方法
  • 康奈尔大学揭示:SAM3模型迭代颠覆计算机视觉经验
  • 2025年10款AI写小说工具 测评:AI自动生成小说神器,新手也能日更万字
  • 极速验证:30秒创建一个Git配置测试环境
  • 1小时搭建CH340数据采集原型系统
  • python --yolo混合文件xml和img整理
  • AI如何优化你的VS Code Git工作流?
  • 掌握这 4 个关键点!!保证RabbitMQ 消息不丢失和不重复消费!!
  • VMware 17与AI结合:自动化虚拟环境管理新方案
  • platform-tools_r28.0.1-windows(应该是最后一个Win7原版可用的版本).zip
  • 零基础教程:如何使用清华源安装Python包
  • 云端AI绘画工作台:麦橘模型+Flux控制台的高效组合方案
  • Vue-springboot小商品购物商场的设计与实现
  • 2026年TikTok广告代理商推荐:高返点与资金周转效率的综合评估 - 智造出海
  • 快速构建PKIX错误解决方案原型
  • Vue-springboot兔喜快递柜子超市库存管理系统已转
  • AI如何帮你快速配置Maven项目?
  • AI如何帮你解决Python模块导入错误?
  • 传统AOP开发 vs AI生成:效率对比实测
  • 传统开发vsAI生成:RESTful API效率对比
  • (新卷,100分)- 整数对最小和(Java JS Python C)