查找SSH连接是否成功

时间:2017-06-05 23:14:41

标签: swift macos shell ssh swift3

我正在尝试使用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显示它。谢谢。

1 个答案:

答案 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