我正在尝试使用SSH将程序连接到另一台计算机。它是通用的(用户会提供主机名,IP和密码),因此不能使用密钥。这是我到目前为止的代码:
func terminalSSH(host:String, password:String, IP:String) {
let pipe = Pipe()
let args = ["-p", password, "ssh", "\(host)@\(IP)"]
let task = Process()
task.launchPath = "/usr/local/bin/sshpass"
task.arguments = args
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
print(output)
}
我的问题是我无法使用sshpass查看连接是否成功。我希望在连接成功或失败时通知用户。此外,似乎sshpass是我可用于SSH的唯一命令,因为终端强制用户输入密码。我知道这段代码可以建立连接,因为我的测试目标计算机上的system.log显示它。谢谢。
答案 0 :(得分:0)
首先,您不应该使用sshpass和纯文本密码,而应使用私钥。
要获取任务退出代码,您可以使用以下内容:
task.waitUntilExit()
let status = task.terminationStatus
请注意,waitUntilExit
会阻止此方法的返回,直到会话结束。
会话是在10分钟内结束,还是由于错误而立即结束,您可以评估terminationStatus
以查看程序是如何退出的。
如果返回代码是0
,那么一切都很顺利;如果存在非零值,则可以根据失败原因采取不同的操作。
task.waitUntilExit()
let status = task.terminationStatus
if status == 0 {
print("Graceful exit.")
} else {
print("Failed with code " + status)
}
此处检测并响应成功连接将更加困难,因为只要ssh会话处于打开状态,waitUntilExit
调用就可能会阻塞。
您还可以选择使用循环,并选中task.isRunning
。