2017-06-05 50 views
1

我想让我的程序使用SSH连接到另一台计算机。这将是通用的(用户将提供主机名,IP和密码),所以不能使用密钥。这是我到目前为止的代码:查找SSH连接是否成功

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的唯一命令,因为Terminal强制用户输入密码。我知道这段代码能够建立连接,因为我的测试目标计算机上的system.log显示它。谢谢。

回答

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) 
} 

检测和响应一个成功的连接将更加困难在这里,作为waitUntilExit调用可能会阻止,只要SSH会话打开。

您也可以选择使用循环,并检查task.isRunning

+0

是否有任何其他方式可以立即找到状态而无需等待终止? –

+0

对不起,我根本不使用Swift,所以我不能在这里给出一个可靠的答案。您可以轮询'isRunning'几秒钟以查看连接是否失败,但除非您执行一些线程管理,否则任何等待都会阻止上游呼叫。 –