Swiftpack.co -  xxlabaza/SshConfig as Swift Package
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
An SSH config parser library with a fancy API
.package(url: "https://github.com/xxlabaza/SshConfig.git", from: "1.0.0")

Platform GitHub license Build Status


The SshConfig makes it quick and easy to load, parse, and decode/encode the SSH configs. It also helps to resolve the properties by hostname and use them safely in your apps (thanks for Optional and static types in Swift).



  • Parsing a SSH config;
  • Encode/Decode your config in JSON or text format;
  • Resolve the SSH properties for a host by its alias;
  • The static type checking SSH properties (yeah...If, in the beginning, I knew that there would be almost 100 properties, I would not begin to describe them!).


Let's try to load, parse and decode an SSH config file and look at a base scenario of how to work with it.

~/.ssh/config file content:

Host gitlab.com github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa
  User xxlabaza

Host my*
  User admin
  Port 2021

Host *
  SetEnv POPA=3000

Code example:

import SshConfig

let config = ssh.Config.load(path: "~/.ssh/config")

let github = config.resolve(for: "github.com")
assert(github.preferredAuthentications == [.publickey])
assert(github.identityFile == ["~/.ssh/id_rsa"])
assert(github.user == "xxlabaza")
assert(github.setEnv == ["POPA": "3000"]) // from 'Host *'
assert(github.port == 22) // the default one

// github.com and gitlab.com resolve the same properties set
assert(github == config.resolve(for: "gitlab.com"))

let myserver = config.resolve(for: "myserver")
assert(myserver.user == "admin")
assert(myserver.port == 2021)
assert(myserver.setEnv == ["POPA": "3000"]) // from 'Host *'

let backend = config.resolve(for: "backend")
assert(backend.user == nil) // the default one
assert(backend.port == 22) // the default one
assert(backend.setEnv == ["POPA": "3000"]) // from 'Host *'

The same ssh.Config instance can be constructed programmatically, like this:

NOTE: I use variadic list of closures for setting needed properties for ssh.Properties instance, which creates inside the ssh.Host initializer. I found that approach more similar to the original ssh config file format, plus you can ignore the ssh.Properties's fields order.

import SshConfig

let config = ssh.Config(
  ssh.Host("gitlab.com github.com",
    { $0.preferredAuthentications = [.publickey] },
    { $0.identityFile = ["~/.ssh/id_rsa"] },
    { $0.user = "xxlabaza" }
    { $0.user = "admin" },
    { $0.port = 2021 }
    { $0.setEnv = ["POPA": "3000"] }


More code samples and examples are available in the tests (especially in UsageExample.swift file).



Swift 5.1+

iOS watchOS tvOS macOS
13+ 6+ 13+ 10.15+

Swift Package Manager

NOTE: the instructions below are for using SwiftPM without the Xcode UI. It's the easiest to go to your Project Settings -> Swift Packages and add SshConfig from there.

Swift Package Manager - is the recommended installation method. All you need is to add the following as a dependency to your Package.swift file:

.package(url: "https://github.com/xxlabaza/SshConfig.git", from: "1.0.0"),

So, your Package.swift may look like below:

// swift-tools-version:5.1

import PackageDescription

let package = Package(
  name: "MyPackage",
  products: [
    .library(name: "MyPackage", targets: ["MyPackage"]),
  dependencies: [
    .package(url: "https://github.com/xxlabaza/SshConfig.git", from: "1.0.0"),
  targets: [
    .target(name: "MyPackage", dependencies: ["SshConfig"])






To see what has changed in recent versions of the project, see the changelog file.


Please read contributing file for details on my code of conduct, and the process for submitting pull requests to me.


I use SemVer for versioning. For the versions available, see the tags on this repository.



This project is licensed under the Apache License 2.0 License - see the license file for details.


Stars: 6
Last commit: Yesterday

Ad: Job Offers

iOS Software Engineer @ Perry Street Software
Perry Street Software is Jack’d and SCRUFF. We are two of the world’s largest gay, bi, trans and queer social dating apps on iOS and Android. Our brands reach more than 20 million members worldwide so members can connect, meet and express themselves on a platform that prioritizes privacy and security. We invest heavily into SwiftUI and using Swift Packages to modularize the codebase.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API