非Root用户启动SSH服务经验小结

各位看官,小子我先问个问题:是不是经常在容器里想开个SSH,却发现自己不是root,处处碰壁?这是常态。多数容器镜像精简到连SSH服务都没有,就算有,咱们普通用户也没权限启动它。

今天小子就介绍一下自己的小经验,以供各位看官参考:自己动手,编译运行 openssh-portable。这是OpenSSH官方提供的可移植版本,堪称神器。

当然,条条大路通罗马。您也可以用Go或Python写的SSH库,或者找现成的二进制包。但小子我认为,自己编译,最稳当,也最能掌控全局。

第一步:铸剑(编译 OpenSSH)

咱们得先有兵器。这个过程就像炼一把自己的剑,得心应手。

如果已经有了sshd及相关程序,但没有root用户权限,可以省去编译这个步骤。

1. 备料与取源
您得有gcc, make, zlibopenssl的开发库。在容器里缺啥就补啥。然后,去官网下载源码包并解压。

# 例如:下载并解压
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p2.tar.gz
tar -xzvf openssh-10.0p2.tar.gz
cd openssh-10.0p2
# 也可从github上克隆编译
git clone https://github.com/openssh/openssh-portable # or https://anongit.mindrot.org/openssh.git
cd openssh-portable
autoreconf

2. 开炉锻造(配置与编译)
这是最关键的一步!配置时,必须用--prefix指定一个我们自己的地盘,比如$HOME/my_openssh

常规锻造法(推荐):

./configure --prefix=$HOME/my_openssh --without-pam
make && make install
  • --prefix: 这是咱们的护身符,它保证了make install只会把文件安装到您指定的地方,绝对不会染指系统目录。
  • --without-pam: 明确禁用PAM。在容器里,我们通常用不到它,禁用可以减少不必要的依赖和潜在问题。

特殊锻造法(备用方案):
当您碰到一些没有openssl开发库的“老古董”环境时,这个参数能救命。

./configure --prefix=$HOME/my_openssh --without-pam --without-openssl
  • --without-openssl: 这个参数的代价是牺牲大量的现代加密算法。这是为了解决“有没有”问题的妥协方案,非万不得已,不要在生产环境使用。

3. 宝剑开锋(生成主机密钥)
用刚出炉的ssh-keygen生成服务器的身份密钥。

# 确保配置目录存在
mkdir -p $HOME/my_openssh/conf
# 生成密钥,-f 指定路径要和后面配置文件里的一致
$HOME/my_openssh/bin/ssh-keygen -t ed25519 -f $HOME/my_openssh/conf/ssh_host_key -N ""
第二步:心法(详解配置文件)

配置文件是sshd的灵魂。配置文件一般名称为/etc/ssh/sshd_config,当然也可以使用其它名称放到其它路径下。
小子我把整本《心法秘籍》的主要章节都给您念念。

第一章:监听与路径(安身立命之本)

Port 28022
# 必须是绝对路径,不能带环境变量(下同)
HostKey /home/appuser/my_openssh/conf/ssh_host_key
PidFile /tmp/sshd-custom.pid

第二章:认证(验明正身之法)

StrictModes no
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords yes
ChallengeResponseAuthentication no
UsePAM no
PermitRootLogin yes

第三章:会话与子系统(待客之道)

# 这是提供sftp服务的关键,路径指向我们编译出的 sftp-server
Subsystem sftp /home/appuser/my_openssh/sftp-server# --- 重点中的重点 ---
# 以下两个是小子我踩过坑才找到的宝贝。没有它们,客户端可能连不上!
# 它们指向编译时生成的辅助程序,用于处理会话和认证的内部流程。
# 路径同样是绝对路径
SshdSessionPath /home/appuser/my_openssh/sshd-session
SshdAuthPath /home/appuser/my_openssh/sshd-authX11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*

第四章:日志(明察秋毫之术)

# INFO, DEBUG1, 2, 3
LogLevel DEBUG3

第五章:权限(不可逾越的红线)
看官请务必记住:sshd 对权限极为敏感! 这是安全的基石,也是新手最容易出错的地方。

  • 服务器密钥: 存放HostKey的那个文件,权限必须是 600。这意味着只有您自己(运行sshd的用户)可读可写。
  • 用户公钥: 客户端的公钥文件 ~/.ssh/authorized_keys,权限必须是 600
  • .ssh目录: 存放authorized_keys.ssh目录,权限必须是 700

如果权限不对,sshd会直接拒绝使用这些文件,而且往往不会给出非常直白的错误信息,导致您百思不得其解。

第三步:点火(启动与运行)

万事俱备,只欠东风。创建一个启动脚本,如start-sshd.sh。

#!/bin/bash
MY_OPENSSH_HOME=$HOME/my_openssh# --- 重点:在启动前,确保所有密钥权限正确! ---
# 这是sshd的强制要求,权限不对,服务起不来或连不上
chmod 700 $HOME/.ssh
chmod 600 $HOME/.ssh/authorized_keys
chmod 600 $MY_OPENSSH_HOME/conf/*# 如果日志目录不存在,则创建
mkdir -p $MY_OPENSSH_HOME/logs# 启动命令,
$MY_OPENSSH_HOME/sshd \-f $MY_OPENSSH_HOME/conf/opensshd.conf \-E $MY_OPENSSH_HOME/logs/sshd.log
第四步:迎客(配置客户端公钥)

服务器跑起来了,怎么在客户端登录呢?

  • 使用密码登录
ssh appuser@ip -p 28022
# 输入密码
  • 使用密钥登录
    • 方法一:远程命令发送公钥
      如果您的客户端有ssh-copy-id命令,这是最简单稳妥的方式。它会自动完成所有操作,包括设置正确的权限,但这是个悖论,因为新安装的sshd还没有用户可以连接,一般会使用手工上传公钥的方式(见下文)

      # 在您的客户端机器上运行,它会把您的公钥(如~/.ssh/id_rsa.pub)上传到服务器
      # -p 28022 指定我们自定义的端口
      ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 28022 user@your_server_ip"
      
    • 方法二:手工上传
      如果没法用ssh-copy-id,就只能自己动手了。

      1. 首先,用密码登录到您的服务器上(或者其它办法)。
      2. 在服务器上,执行以下操作:
      # 确保.ssh目录存在,并设置正确权限 700(如果已经做过就不用重复执行)
      mkdir -p ~/.ssh
      chmod 700 ~/.ssh# 将您客户端的公钥内容,粘贴到 authorized_keys 文件中
      # 注意用 >> 追加,不要用 > 覆盖
      echo "ssh-rsa AAAA..." >> ~/.ssh/authorized_keys# --- 最后,也是最关键的一步:设置authorized_keys的权限为 600!---
      chmod 600 ~/.ssh/authorized_keys
      
    • 登录

      ssh -i your_pub_keyfile appuser@ip -p 28022
      

好了,各位看官,这回的终极宝典应该算是面面俱到了。从铸剑到心法,再到点火迎客,以及那些决定成败的权限细节,都已尽数奉上。希望小子我的这点经验,能为各位看官披荆斩棘。祝您折腾愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows开机自动启动中间件

WinSW(Windows Service Wrapper 是一个开源的 Windows 服务包装器,它可以帮助你将应用程序打包成系统服务,并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…

【CATIA的二次开发23】抽象对象Document涉及文档激活控制的方法

在CATIA VBA开发中,Document对象是最核心、最基础的对象之一。它代表了当前在CATIA会话中打开的一个文档(文件)。 几乎所有与文件操作、模型访问相关的操作都始于获取一个Document对象。Document对象包含多种方法和属性,以下介绍Document对象方法和属性 一、Document对象方…

基于多维视角的大模型提升认知医疗过程层次激励编程分析

系统架构设计 #mermaid-svg-k3W5lvie1sP3T956 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-k3W5lvie1sP3T956 .error-icon{fill:#552222;}#mermaid-svg-k3W5lvie1sP3T956 .error-text{fill:#552222;stroke:#55222…

【评测】Qwen3-Embedding模型初体验

回到目录 【评测】Qwen3-Embedding模型初体验 模型的介绍页面 0.6B运行配置:笔记本i5-8265U,16G内存,无GPU核显运行,win10操作系统 8B运行配置:AMD8700G,64G内存,4090D 24G显存,ub…

MPLAB X IDE ​软件安装与卸载

1、下载MPLAB X IDE V6.25 MPLAB X IDE | Microchip Technology 正常选Windows,点击Download,等待自动下载完成; MPLAB X IDE 一台电脑上可以安装多个版本; 2、安装MPLAB X IDE V6.25 右键以管理员运行;next; 勾选 I a…

PLC入门【2】PLC的接线

02 PLC的接线 PLC 的品牌介绍,PLC的接线 1、PLC 大体分为欧式和日式 2、只要学会三菱的,整个日式的也差不多会了。 3、PLC 分为晶体管输出和继电器输出。 4、PLC 接线都差不多的 我们主要是讲这个三菱的 PLC, 三菱和台达的 PLC,…

Hibernate Validator 数据验证

Hibernate Validator不仅可以用于Controller层的参数验证,还可以在Service层、Repository层或任何其他层中使用。 手动验证 在任何地方都可以通过Validator接口手动触发验证: public class ManualValidationExample {public void validateObject(Obje…

【深度学习】表示学习:深度学习的数据解构与重构艺术

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…

如何在PowerBI中使用Analyze in Excel

如何在PowerBI中使用Analyze in Excel 之前分享过如何使用DAXStudio将PowerBI与Excel连接 ,今天介绍另外一个工具,也可以实现同样的功能,Analyze in Excel。 使用Analyze in Excel 第一步: 首先准备好一个PBIX文件&#xff0c…

AI应用工程师面试

技术基础 简述人工智能、机器学习和深度学习之间的关系。 人工智能是一个广泛的概念,旨在让机器能够模拟人类的智能行为。机器学习是人工智能的一个子集,它专注于开发算法和模型,让计算机能够从数据中学习规律并进行预测。深度学习则是机器学习的一个分支,它利用深度神经网…

基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究

摘要:在数字化转型背景下,用户对首屏交互效率的诉求日益提升。本文以"定制开发开源AI智能名片S2B2C商城小程序"为技术载体,结合用户行为数据与认知心理学原理,提出首屏组件动态布局模型。通过分析搜索栏、扫码入口、个人…

day50 随机函数与广播机制

目录 一、随机张量的生成 1.1 torch.randn() 函数 1.2 其他随机函数 1.3 输出维度测试 二、广播机制 2.1 广播机制的规则 2.2 加法的广播机制 二维张量与一维向量相加 三维张量与二维张量相加 二维张量与标量相加 高维张量与低维张量相加 2.3 乘法的广播机制 批量…

Java持久层技术对比:Hibernate、MyBatis与JPA的选择与应用

目录 简介持久层技术概述Hibernate详解MyBatis详解JPA详解技术选型对比最佳实践与应用场景性能优化策略未来发展趋势总结与建议 简介 在Java企业级应用开发中,持久层(Persistence Layer)作为连接业务逻辑与数据存储的桥梁,其技…

【2025CVPR】模型融合新范式:PLeaS算法详解(基于排列与最小二乘的模型合并技术)

本文深入解析ICLR 2025顶会论文《PLeaS: Merging Models with Permutations and Least Squares》,揭示模型融合领域突破性进展. 一、问题背景:模型合并的核心挑战 随着开源模型的爆发式增长,如何高效合并多个专用模型成为关键挑战。传统方法存在三大痛点: ​初始化依赖​…

磁盘空间清道夫FolderSize 系列:可视化分析 + 重复文件识别,

各位电脑小能手们,今天来给大家唠唠Folder类软件!这玩意儿主要是为了文件夹管理、监控、安全还有优化这些需求设计的,不同工具的功能各有侧重。下面我就结合多个搜索结果,给大家分类介绍一下。 软件下载地址安装包 首先是文件夹空…

嵌入式全栈面试指南:TCP/IP、C 语言基础、STM32 外设与 RT‑Thread

作为嵌入式工程师,面试时往往不仅要展示基础编程能力,还要兼具网络协议、硬件驱动、实时操作系统(RTOS)等方面的知识深度。本文将从TCP/IP 协议、C 语言核心基础、STM32 IO 与外设驱动、RT‑Thread 及其多任务/IPC四大模块进行全面…

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…

软件功能测试报告都包含哪些内容?

软件功能测试报告是软件开发生命周期中的重要文档,主要涵盖以下关键内容:    1.测试概况:概述测试目标、范围和方法,确保读者对测试背景有清晰了解。 2.测试环境:详细描述测试所用的硬件、软件环境,确保…

OpenCV CUDA模块图像处理------双边滤波的GPU版本函数bilateralFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数在 GPU 上执行双边滤波操作,是一种非线性平滑滤波器,能够在 保留边缘的同时去除噪声。 函数原型 void cv::cuda:…

Perplexity AI:重塑你的信息探索之旅

在信息爆炸的时代,如何快速、精准地获取所需知识,并将其转化为行动力?答案或许就藏在 Perplexity AI 这款强大的智能工具中。它不仅仅是一个搜索引擎,更是一个能理解你、与你对话、为你深度解析信息的智能伙伴。告别繁琐的信息筛选…