2017-06-05 86 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'幾秒鐘以查看連接是否失敗,但除非您執行一些線程管理,否則任何等待都會阻止上游呼叫。 –