2017-06-05 11 views
1

Ich versuche, mein Programm eine Verbindung zu einem anderen Computer mithilfe von SSH herzustellen. Es wäre generisch (der Benutzer würde den Hostnamen, die IP-Adresse und das Passwort angeben), sodass keine Schlüssel verwendet werden können. Dies ist der Code, den ich habe bisher:Finden, ob eine SSH-Verbindung erfolgreich war

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) 


} 

Mein Problem ist, dass ich nicht sehen kann, wenn die Verbindung erfolgreich war sshpass verwenden. Ich möchte, dass der Benutzer benachrichtigt wird, sobald die Verbindung erfolgreich war oder fehlgeschlagen ist. Außerdem scheint sshpass der einzige Befehl zu sein, den ich für SSH verwenden kann, da Terminal den Benutzer zwingt, das Passwort einzugeben. Ich weiß, dass dieser Code eine Verbindung herstellen kann, weil die system.log auf meinem Test-Zielcomputer es anzeigt. Vielen Dank.

Antwort

0

Erstens sollten Sie nicht sshpass und ein Nur-Text-Passwort verwenden, sondern private Schlüssel.

die Aufgaben Exit-Code zu erhalten, können Sie die folgende verwenden:

task.waitUntilExit() 
let status = task.terminationStatus 

Sie wissen jedoch, dass waitUntilExit die Rückkehr dieser Methode blockiert, bis die Sitzung beendet wurde.

Ob die Sitzung in 10 Minuten oder sofort aufgrund eines Fehlers endet, können Sie die terminationStatus auswerten, um zu sehen, wie das Programm beendet wurde.

Wenn der Rückkehrcode 0 ist, ging alles gut aus; Wenn ein Wert ungleich Null vorhanden ist, können Sie verschiedene Aktionen basierend auf dem Grund für den Fehler ausführen.

task.waitUntilExit() 

let status = task.terminationStatus 
if status == 0 { 

    print("Graceful exit.") 
} else { 

    print("Failed with code " + status) 
} 

Detecting und auf eine erfolgreiche Verbindung reagiert hier wird schwieriger, da der waitUntilExit Anruf so lange blockieren kann als die SSH-Sitzung geöffnet ist.

Sie können auch eine Schleife verwenden und task.isRunning überprüfen.

+0

Gibt es eine andere Möglichkeit, den Status sofort zu finden, ohne auf die Beendigung zu warten? –

+0

Tut mir leid, ich benutze Swift überhaupt nicht, daher kann ich hier keine solide Antwort geben. Sie können 'isRunning' für ein paar Sekunden abfragen, um zu sehen, ob die Verbindung fehlschlägt, aber jede Wartezeit blockiert den Upstream-Aufruf, es sei denn, Sie führen eine Thread-Verwaltung durch. –

Verwandte Themen