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

使用 vcpkg 为OpenHarmony(鸿蒙PC)构建 OpenSSH 命令行工具

本文面向需要构建可运行在OpenHarmony或鸿蒙PCarm64-ohos 等 triplet上的openssh命令行工具的开发者。通过使用vcpkg的方式构建。同时说明OpenSSH 是什么、为何用 vcpkg构建、如何构建、产物在哪、以及本 port 在适配过程中处理过的典型问题。vcpkg (针对 C 库的包管理)虽然它最初是c/c的包管理器但它的 triplet 机制如当前的 arm64-ohos本质上也是一种轻量级的交叉编译配置框架。vcpkg鸿蒙仓地址https://gitcode.com/OpenHarmonyPCDeveloper/ohos_vcpkg关于vcpkg更详细的安装及使用参见博文《使用 vcpkg 为鸿蒙HarmonyOS / OHOS下载与安装三方库实践指南》1. OpenSSH 是什么OpenSSH是 OpenBSD 项目移植到多平台的SSH 协议套件提供安全远程登录、文件传输与密钥管理等功能。日常所说的「SSH 客户端」通常包括组件作用ssh远程 shell、端口转发、跳板scp/sftp基于 SSH 的文件复制与交互式文件传输ssh-keygen生成与管理主机密钥、用户密钥ssh-agent/ssh-add代理私钥减少重复输入口令ssh-keyscan批量采集主机公钥指纹sshdSSH 服务端守护进程sftp-serverSFTP 子系统常由sshd按需拉起Portable OpenSSHopenssh-portable是面向 Linux、BSD 及各类类 Unix 环境的源码发行版使用GNU Autotoolsconfiguremake与 Windows 上常见的 MSVC 工程形态不同。openSSH的github仓https://github.com/openssh/openssh-portableopenSSH主页地址https://www.openssh.org/2. 为什么在 OHOS 上用 vcpkg 构建 OpenSSH因为简单。vcpkg上本来就支持上千个开源库那么OpenSSH依赖的openssl和zlib库本来就有了。只需要新增加支持下OpenSSH的命令行即可。且移植符合通用的vcpkg的规范熟悉cmake语法的移植起来也很简单了。鸿蒙设备或 SDK 环境中常见需求包括在开发机多为 x86_64 Linux上交叉编译arm64 目标与OpenSSL、zlib等依赖版本与工程其它库对齐用同一套 vcpkg triplet / 工具链元数据管理依赖与产物路径。vcpkg 通过portvcpkg.jsonportfile.cmake描述下载、配置、安装步骤对 Autotools 项目通常走vcpkg_configure_make/vcpkg_install_make并与ports/vcpkg-make中的默认路径约定例如把可执行文件安装到tools/port/bin集成。3. 本仓库opensshport 概要仓库地址https://gitcode.com/qq8864/vcpkg项目说明上游版本OpenSSH9.9p2portable tarball清单版本字段使用version-string9.9p2含p非 semver主要依赖openssl、zlib可选 featurefido2libfido2平台表达式supports支持Linux/macOS/MinGW等并显式支持ohos构建系统Autotools无 CMake 顶层工程鸿蒙相关适配要点均在portfile.cmake与补丁中体现config.sub不认识linux-ohos通过补丁ohos-config-sub.patch在config.sub中增加对ohos/linux-ohos*的识别与 tripletaarch64-unknown-linux-ohos一类配置一致。交叉工具链需要显式--target在VCPKG_TARGET_IS_OHOS时通过vcpkg_cmake_get_vars读取VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET等并追加到VCPKG_C_FLAGS/VCPKG_CXX_FLAGS与openssl、libpng等 port 在 OHOS 上的思路一致。--sysconfdir须为绝对路径OpenSSH 的configure不接受相对--sysconfdir使用${CURRENT_PACKAGES_DIR}/etc/ssh。Shadow /getspnamOHOS 类环境可能出现有shadow头文件但无可用getspnam的情况对 OHOS 使用--without-shadow定义DISABLE_SHADOW。loginrec.c中utmpx笔误上游在#else分支误写ut应为utx补丁fix-loginrec-utmpx-typo.patch。安装阶段strip/check-config交叉编译时宿主strip无法处理目标 ELF默认make install会跑check-config执行sshd -t不适合交叉环境。采用install-nokeys跳过check-config/host-key并在VCPKG_CROSSCOMPILING时加--disable-strip。vcpkg_copy_tools路径Autotools 默认把二进制装到tools/openssh/bin与tools/openssh/sbin经 DESTDIR 整理后与vcpkg_copy_tools默认查找的packages/.../bin不一致port 中按实际目录vcpkg_copy_tool_dependencies必要时用SEARCH_DIR从扁平bin/迁出。仅工具、无头文件在portfile.cmake开头设置VCPKG_POLICY_EMPTY_INCLUDE_FOLDER避免 post-build 对空include误报。4. 环境准备4.1 必备条件已克隆并引导好的vcpkg能执行./vcpkg install。针对OHOS的CMake toolchain / triplet例如arm64-ohos且openssl、zlib等依赖能在同一 triplet 下成功安装。若使用 OHOS SDK 的 Clang通常需设置OHOS_SDK_ROOT等与 triplet、文档一致具体以你方工程为准。4.2 依赖端口由vcpkg.json声明openssl、zlib始终需要。vcpkg-cmake-get-varshost: trueplatform: ohos仅在配置 OHOS 目标时参与用于读取编译器--target等变量。4.3 移植步骤默认的vcpkg仓库中只有libssh或libssh2等相关的库并没有openssh。因为openssh是一组命令行工具ssh、scp、sftp等而vcpkg主要是用来构建库和提供c/c的包管理。但是它也可以用来构建二进制可执行程序。1.clone下来vcpkg的仓库后在ports文件夹下新建openssh的目录。2.开始编写移植openssh相关的文件vcpkg.json{name:openssh,version-string:9.9p2,description:OpenSSH suite: ssh(1), scp(1), sftp(1), ssh-keygen(1), ssh-agent(1), sshd(8), and related tools (portable release).,homepage:https://www.openssh.com/,license:null,supports:(!uwp !android !ios !emscripten (!windows | mingw)) | ohos,dependencies:[openssl,zlib,{name:vcpkg-cmake-get-vars,host:true,platform:ohos}],features:{fido2:{description:Link against libfido2 for built-in U2F/FIDO security key support in ssh/sftp tools.,dependencies:[libfido2]}}}portfile.cmake文件# Tools-only port; no public headers to install.set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled)vcpkg_download_distfile(ARCHIVE URLShttps://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${VERSION}.tar.gzhttps://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${VERSION}.tar.gzFILENAMEopenssh-${VERSION}.tar.gzSHA512 4c6d839aa3189cd5254c745f2bd51cd3f468b02f8e427b8d7a16b9ad017888a41178d2746dc51fb2d3fec5be00e54b9ab7c32c472ca7dec57a1dea4fc9840278)vcpkg_extract_source_archive(SOURCE_PATH ARCHIVE${ARCHIVE}PATCHES ohos-config-sub.patch fix-loginrec-utmpx-typo.patch)if(VCPKG_HOST_IS_WINDOWS)vcpkg_find_acquire_program(PERL)get_filename_component(PERL_EXE_PATH${PERL}DIRECTORY)vcpkg_add_to_path(${PERL_EXE_PATH})endif()vcpkg_find_acquire_program(PKGCONFIG)get_filename_component(PKGCONFIG_DIR${PKGCONFIG}DIRECTORY)vcpkg_add_to_path(${PKGCONFIG_DIR})# OHOS: OpenHarmony toolchains often require an explicit Clang --target so# configure-time compile/link probes resolve sysroot headers and libs# correctly (same approach as ports/openssl/unix and ports/libpng).if(VCPKG_TARGET_IS_OHOS)vcpkg_cmake_get_vars(cmake_vars_file)include(${cmake_vars_file})string(APPEND VCPKG_C_FLAGS --target${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET})string(APPEND VCPKG_CXX_FLAGS --target${VCPKG_DETECTED_CMAKE_CXX_COMPILER_TARGET})# OpenSSL 3.0 deprecations in upstream portable sources (noise only).string(APPEND VCPKG_C_FLAGS -Wno-deprecated-declarations)endif()# OpenSSHs configure rejects a relative --sysconfdir; it must be absolute.vcpkg_list(SET configure_opts--with-ssl-dir${CURRENT_INSTALLED_DIR}--with-zlib${CURRENT_INSTALLED_DIR}--without-openssl-header-check--sysconfdir${CURRENT_PACKAGES_DIR}/etc/ssh)# OpenHarmony sysroot may expose shadow-style headers without a usable getspnam;# --without-shadow defines DISABLE_SHADOW (see configure.ac).if(VCPKG_TARGET_IS_OHOS)vcpkg_list(APPEND configure_opts--without-shadow)endif()if(fido2IN_LIST FEATURES)vcpkg_list(APPEND configure_opts--with-security-key-builtinyes)endif()# Cross builds: GNU install -s invokes the host strip(1), which cannot handle# target ELFs (e.g. arm64-ohos built on x86_64 Linux).if(VCPKG_CROSSCOMPILING)vcpkg_list(APPEND configure_opts--disable-strip)endif()set(extra_make_opts)if(VCPKG_TARGET_IS_WINDOWS)list(APPEND extra_make_opts DETERMINE_BUILD_TRIPLET USE_WRAPPERS)endif()vcpkg_configure_make(SOURCE_PATH${SOURCE_PATH}${extra_make_opts}OPTIONS${configure_opts})# install-nokeys: install-files install-sysconf, but not host-key / check-config.# check-config runs $(DESTDIR)$(sbindir)/sshd -t under DESTDIR staging; that is# wrong for cross-compiles (host cannot execute the target sshd, and paths may# concatenate badly when bindir/sbindir are absolute).vcpkg_install_make(INSTALL_TARGET install-nokeys)# vcpkg_configure_make defaults bindir/sbindir to ${prefix}/tools/port/{bin,sbin}# (see ports/vcpkg-make/vcpkg_make_common.cmake). After DESTDIR flatten, binaries# are under tools/port/..., not packages/port/bin — vcpkg_copy_tools must use SEARCH_DIR.set(_openssh_bindir${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin)set(_openssh_sbindir${CURRENT_PACKAGES_DIR}/tools/${PORT}/sbin)if(NOT EXISTS${_openssh_bindir}/ssh${VCPKG_TARGET_EXECUTABLE_SUFFIX})set(_openssh_bindir${CURRENT_PACKAGES_DIR}/bin)set(_openssh_sbindir${CURRENT_PACKAGES_DIR}/sbin)endif()set(openssh_bin_toolssshscpsftpssh-add ssh-agent ssh-keygen ssh-keyscan ssh-pkcs11-helper ssh-sk-helper)set(openssh_sbin_tools sshd sshd-session)set(_openssh_dest_bin${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin)set(_openssh_dest_sbin${CURRENT_PACKAGES_DIR}/tools/${PORT}/sbin)if(${_openssh_bindir}STREQUAL${_openssh_dest_bin}AND${_openssh_sbindir}STREQUAL${_openssh_dest_sbin})# vcpkg autotools defaults already install into tools/port/{bin,sbin}.vcpkg_copy_tool_dependencies(${_openssh_dest_bin})vcpkg_copy_tool_dependencies(${_openssh_dest_sbin})else()vcpkg_copy_tools(TOOL_NAMES${openssh_bin_tools}SEARCH_DIR${_openssh_bindir}DESTINATION${_openssh_dest_bin}AUTO_CLEAN)vcpkg_copy_tools(TOOL_NAMES${openssh_sbin_tools}SEARCH_DIR${_openssh_sbindir}DESTINATION${_openssh_dest_sbin}AUTO_CLEAN)vcpkg_copy_tool_dependencies(${_openssh_dest_bin})vcpkg_copy_tool_dependencies(${_openssh_dest_sbin})endif()# ssh-keysign and sftp-server install to ${prefix}/libexec; already under the# package root after DESTDIR flatten — only pull in shared-library deps.if(EXISTS${CURRENT_PACKAGES_DIR}/libexec)vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/libexec)endif()file(REMOVE_RECURSE${CURRENT_PACKAGES_DIR}/debug/share${CURRENT_PACKAGES_DIR}/share/man${CURRENT_PACKAGES_DIR}/debug/share/man${CURRENT_PACKAGES_DIR}/lib${CURRENT_PACKAGES_DIR}/debug/lib${CURRENT_PACKAGES_DIR}/include${CURRENT_PACKAGES_DIR}/debug/include)vcpkg_copy_pdbs()file(INSTALL${CMAKE_CURRENT_LIST_DIR}/usageDESTINATION${CURRENT_PACKAGES_DIR}/share/${PORT})vcpkg_install_copyright(FILE_LIST${SOURCE_PATH}/LICENCE)5. 构建步骤在 vcpkg 根目录执行示例 triplet 为arm64-ohos./vcpkginstallopenssh:arm64-ohos可选功能若 triplet 上libfido2可用./vcpkginstallopenssh[fido2]:arm64-ohos首次或排错时可加--clean-after-build清理中间树。成功时日志末尾会出现类似All requested installations completed successfully如果要删除重新构建可以exportOHOS_SDK_ROOT/root/ohos-sdk/linux/rm-rf/root/vcpkg/buildtrees/openssh ./vcpkg remove openssh:arm64-ohos ./vcpkginstallopenssh:arm64-ohos6. 安装产物路径说明安装完成后在installed/triplet/下可重点关注路径内容tools/openssh/bin/ssh、scp、sftp、ssh-keygen、ssh-agent、ssh-add、ssh-keyscan、ssh-pkcs11-helper、ssh-sk-helper等tools/openssh/sbin/sshd、sshd-sessionlibexec/triplet 根下ssh-keysign、sftp-serverAutotools 默认libexecdiretc/ssh/若保留ssh_config、sshd_config、moduli等模板由install-nokeys中的install-sysconf安装说明install-nokeys不会在DESTDIR安装阶段执行ssh-keygen -A生成主机密钥部署到设备时需按运维规范自行生成/etc/ssh/ssh_host_*等。7. 与「完全成功」相关的校验信息安装成功以 vcpkg 输出All requested installations completed successfully为准。SPDX 提示若vcpkg.json未写 SPDXlicensevcpkg 可能提示查看各包的copyrightOpenSSH 使用上游LICENCE文件已通过vcpkg_install_copyright安装到share/openssh/copyright。空include警告工具型 port 无公共头文件属正常应使用VCPKG_POLICY_EMPTY_INCLUDE_FOLDER变量名须正确否则 post-build 仍会提示include为空。8. 常见问题FAQ8.1config.sub报错OS ohos not recognized已通过ohos-config-sub.patch扩展config.sub请确认vcpkg_extract_source_archive的PATCHES中包含该补丁且为最新 port。8.2getspnam/xcrypt.c编译失败在 OHOS 上使用--without-shadow若你自行去掉该选项需保证 sysroot 中shadow API 完整且与探测一致。8.3strip无法识别 ELF /install-files失败交叉编译时启用--disable-strip并避免使用默认make install中的check-config本 port 使用install-nokeys。8.4vcpkg_copy_tools找不到sshAutotools 在 vcpkg 下默认安装到tools/openssh/bin不是bin/port 已按实际路径处理vcpkg_copy_tool_dependencies与可选vcpkg_copy_tools。8.5 为何不用 MSVC 的x64-windows上游portable以Autotools POSIX为主x64-windowsMSVC通常不在本 port 的supports范围内在 Windows 上可考虑MinGW triplet或系统自带的 OpenSSH 分发渠道。9. 真机验证在鸿蒙PC的容器环境中验证方法低成本搭建鸿蒙PC运行环境基于 Docker 的 x86_64 服务器因为在我的测试阶段库so文件和程序bin都在同一个文件夹下为了使二进制可执行程序能够顺利找到库需要使用一下指令配置下临时环境exportLD_LIBRARY_PATH$(pwd)当运行 ssh 这种程序时它需要加载 libcrypto.soOpenSSL和 libz.sozlib库。如果系统里有就直接去系统里找了。默认只会去系统的固定的“公家仓库”如 /lib 或 /usr/lib找。 正式发布产品时通常不需要这么麻烦。如果鸿蒙PC环境已经有了OpenSSL的库是可以直接运行的。或者使用 RPATH嵌入式最常用在编译阶段直接把库的路径“刻”进程序里。做法在编译参数里加上 -Wl,-rpath,O R I G I N / . . / l i b ′ 。程序运行时会自己找身边的库。 ORIGIN/../lib。程序运行时会自己找身边的库。ORIGIN/../lib′。程序运行时会自己找身边的库。ORIGIN 就代表程序自己所在的目录不管你把程序装到哪它都能定位到附近的库。或者把 .so 文件放入系统标准目录直接拷贝到板子的 /usr/lib 或 /lib 下。这是最省事的系统启动时会自动扫描这些地方程序拿起来就能跑。使用SSH命令远程登录一下后台的服务器试试测试成功10. 小结OpenSSH是工业界事实标准的SSH 套件portable版本适合类 Unix / OHOS的Autotools构建链。使用vcpkg可在统一 triplet下安装openssh并与openssl、zlib等依赖版本对齐。最后欢迎加入开源鸿蒙开发者社区交流https://harmonypc.csdn.net/
http://www.rkmt.cn/news/1373510.html

相关文章:

  • 单硬盘 vs 双硬盘:为你的电脑量身定制Ubuntu 18.04双系统分区方案
  • 统信UOS自带的文本编辑器,比你想的强多了!手把手教你从双击到命令行的N种打开方式
  • 随记-关于当下大学生就业现状的个人感想
  • CAXA 基准代号
  • 5秒音频也能玩转AI?手把手教你用ESC-50数据集入门环境声音分类
  • CAXA 引出说明
  • ChatGPT iOS/Android双端深度对比:37项指标实测,谁才是真正的生产力神器?
  • git设置git bash命令行的默认打开位置
  • 从NASA电池的‘容量增生’说起:聊聊IC曲线分析前,数据清洗与滤波的那些事儿(附Python代码)
  • AOE 调优引擎原理与应用
  • 从Science顶刊到实战:手把手教你用10X单细胞数据做eQTL分析(附代码避坑)
  • 2026年至今,谁在引领PET瓶胚专用机的技术革新? - 2026年企业推荐榜
  • 002-AI客服-RAG优化分析
  • 麒麟服务器等保三级配置实战:从SSH双因子到kysec策略落地
  • UPS不间断电源不工作如何确定是否损坏
  • 扩散模型量化技术:AQUATIC-Diff方法解析与应用
  • 智能3D头像生成技术:模块化AI代理与多模态输入实践
  • QSqlTableModel结合Table View控件MYSQL数据增删操作
  • 保姆级教程:在Deepin V23 Beta3上彻底禁用Nouveau并安装指定版本NVIDIA驱动(附卸载残留清理指南)
  • C#零基础通关第五篇:吃透属性、继承与多态,彻底精通面向对象三大特性
  • 2026品牌认证ENF级生态板定制家居推荐指南:精材艺匠全屋定制、精材艺匠实木多层板、精材艺匠家具板、精材艺匠香杉双筋超平生态板选择指南 - 优质品牌商家
  • JavaScript——对象
  • Linux系统启动卡住了?手把手教你用systemd-analyze和dmesg诊断UEFI启动各阶段耗时
  • 2026烟台发电机出租:龙口发电机出租、威海发电机出租、日照发电机出租、枣庄发电机出租、柴油机发电机出租、泰安发电机出租选择指南 - 优质品牌商家
  • 从缺页异常看Linux内存管理精髓:写时复制、延迟分配与交换机制
  • 旧电脑别扔!用VMware虚拟机20分钟搞定FydeOS,秒变安卓/Linux双系统学习机
  • 告别跨平台烦恼:手把手教你将Mac上的APFS硬盘/U盘无损转回ExFAT(附磁盘工具分区方案详解)
  • 2026年Q2西南老小区电梯加装服务商排行:加装一台电梯多少钱、四川电梯加装、四川电梯安装公司、家用电梯加装、成都电梯加装费用选择指南 - 优质品牌商家
  • 2026年学术期刊与毕业论文AIGC检测标准差异深度解读:投稿标准比答辩标准更严吗免费完整分析
  • ARM SME指令集:非临时加载与查找表优化详解