用于 (命令行/服务器端) Swift 的 .netrc
解析器。
let netrc = SwiftNetrc()
let username = netrc['myserver.com'].username
let password = netrc['myserver.com'].password
let (username, password) = netrc.credentials('myserver.com')
SwiftNetrc 按照 GNU ftp
遵循的规则 解析 .netrc 文件。
该解析器足够智能,可以识别密码短语,但有一些注意事项(请参见下面的“解析器如何工作”和“已知问题”)。
如果输入文件可被用户以外的任何人读取,则会抛出 SwiftNetrc.SwiftNetrcError.fileGroupOrWorldWritableOrExecutable 错误。
全部在同一行 - 空格被忽略
machine mymachine login joe password mypass
多行也没问题。即使带有密码短语。
machine mymachine
login joe
password This is my Awesome p@ssw0rd!
密码短语可以在同一行
machine mymachine login joe password This is my Awesome p@ssw0rd!
或者(请参阅解析器如何工作),这是与上面的密码短语相同的短语(因为所有空格都被缩减为单个空格)
machine mymachine login joe password This is
my
Awesome
p@ssw0rd!
包含多个单词的值(机器名、登录名、密码)不能包含除自身之外的键令牌(machine、login、password、account 或 macdef),否则它将被解释为新令牌(解析器将抛出 noValueForToken 错误)。例如,由于最后的 "machine",这将失败并出现 noValueForToken 错误
machine mymachine login joe password This is my machine
但这可以工作,因为解析器足够智能,可以识别它已经在解析 "password"。
machine mymachine login joe password This is my password
然而,这将起作用,因为键令牌区分大小写("Machine" 不会被解释为新令牌)
machine mymachine login joe password This is my Machine
这也将起作用,因为令牌在空格处分割,因此“.”是令牌的一部分。
machine mymachine login joe password This is my machine.
解析器去除前导、尾随和多余的令牌间空格,然后按空格将单词拆分为“令牌”数组。因此,例如
machine mymachine login joe password mypass
将被分解为
["machine", "mymachine", "login", "joe", "password", "mypass"]
然后,解析器逐步查找键令牌“machine”、“login”、“password”、“account”和“macdef”。当它找到其中一个键令牌时,它会将下一个令牌分配为 SwiftNetrc 对象中该令牌属性的值。如果下一个令牌不是键令牌,它会被附加到前一个键令牌的值。
SPM
.package( "https://github.com/ggruen/SwiftNetrc.git", from: "1.0.0" )
密码短语不能包含 "machine"、"login"、"account" 或 "macdef"(小写)。
密码短语不能有前导、尾随或单词间多余的空格。
.netrc 文件不能包含注释(这是一个特性,以防止与令牌中的 #'s 混淆,例如密码中)
在构建时会构建一个命令行实用程序,但它目前只运行解析器,如果没有错误,则打印“.netrc 文件解析没有错误”,否则打印错误并退出 1。我想你可以用它来测试你的 .netrc 文件,如下所示
swift build
./.build/x86_64-apple-macosx10.10/debug/SwiftNetrc && ftp ftp.myserver.com
如果你真的想,你可以“安装”它
cp ./.build/x86_64-apple-macosx10.10/debug/SwiftNetrc /usr/local/bin/swiftnetrc
然后你可以只运行 "swiftnetrc" 来解析和报告你的 .netrc 文件。令人兴奋,我知道。
default
令牌当前被忽略。
account
和 macdef
被存储,但 SwiftNetrc 不会对 macdef
做任何处理(例如,运行宏),因为它不是 ftp 客户端。 :)
最简单的方法是在 Mac 上开发,然后构建 LinuxMain.swift 并在 Linux 上测试并修复任何问题。
获取代码
git clone https://github.com/ggruen/SwiftNetrc.git
cd SwiftNetrc
swift package update && swift package generate-xcodeproj
编辑文件
open -a Xcode.app SwiftNetrc.xcodeproj
测试(在 Xcode 中,或)
swift test
准备提交
sourcery # Download from https://github.com/krzysztofzablocki/Sourcery/releases/latest
git add -A
git commit
然后,在 Linux 上签出
git clone https://github.com/ggruen/SwiftNetrc.git
cd SwiftNetrc
swift package update
swift test
修复任何差异(在 Mac 上工作但在 Linux 上不工作的内容)。
vim -p SwiftNetrcTests/SwiftNetrcTests.swift SwiftNetrcCode/SwiftNetrc.swift
git add -A
git commit
git push