2017-06-05 8 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に使用できる唯一のコマンドだと思われます。私はこのコードは、私のテストターゲットコンピュータの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

申し訳ありませんが、スウィフトはまったく使用していませんので、ここで確かな答えを出すことはできません。 'isRunning'を数秒間ポーリングして接続が失敗したかどうかを調べることができますが、何らかのスレッド管理をしない限り、待ち時間はアップストリーム呼び出しをブロックします。 –

関連する問題