2017-06-30 4 views
0

akzeptieren würde Ich mag einen Server-Prozess mit Go zu schaffen, die an oder senden Sie Dateien via scp empfangen können, wie:Go SSH-Server Dateitransfer über SCP

scp -P 2200 -i ssh/tester_rsa [email protected]:/test output.txt 

oder

scp -P 2200 -i ssh/tester_rsa input.txt [email protected]:/test 

Mit Hilfe von this gist konnte mich bereits einen interaktiven sSH-Server erstellen, die Verbindungen accpet der Lage ist/Befehle über

ssh -i ssh/tester_rsa [email protected] -p 2200 'somecommand' 

und funktioniert gut.

Ich habe verstanden, dass die Nutzlast "scp -f/test" für die erste scp-Anfrage enthält. Ich bin fest, wie man tatsächlichen Inhalt vom Server zurückgibt, versuchte ich mit einer Zeichenfolge (wie mit einer normalen SSH-Antwort) zu antworten, aber ich bekomme keine Datei zurück.

Hier meine Ausgabe von scp -vv

... 
debug2: callback done 
debug2: channel 0: open confirm rwindow 2097152 rmax 32768 
debug2: channel_input_status_confirm: type 99 id 0 
debug2: exec request accepted on channel 0 
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 
debug2: channel 0: rcvd close 
debug2: channel 0: output open -> drain 
debug2: channel 0: close_read 
... 

Wenn ich mit einem Propper Server versuche ich erhalten folgende Zeilen

... 
debug2: exec request accepted on channel 0 
debug2: channel 0: rcvd ext data 43 
Sending file modes: C0644 98 output.txt 
debug2: channel 0: written 43 to efd 7 
Sink: C0644 98 output.txt 
output.txt   
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 
debug1: client_input_channel_req: channel 0 rtype [email protected]  reply 0 
debug2: channel 0: rcvd eow 
debug2: channel 0: close_read 
... 

Also ich denke, ich bin einige Protokoll/Flussparameter oder Befehle fehlt in Gehen.

Nur die Snippet Go-Code, als Projekt sehr groß ist und ist nicht einfach, hier zu kopieren und einzufügen:

func (a *Shell) handleExec(connection ssh.Channel, payload []byte) { 
... 
for _, c := range a.ExecCmds { 
    if matchCmds(str, c.Cmd) { 
     connection.Write([]byte("Here comes the file content") 
    } 
} 
... 

Ich weiß, dass der Code für scp ist nicht richtig, aber es funktioniert für normale ssh Fein . Ich weiß nicht, wie man mit der Verbindung umgeht und was genau zurückgegeben wird, damit eine korrekte Dateiübertragung erfolgt.

für eine Weile googeln führte mich zu this question on stack overflow, die fast die gleiche ist, aber nicht vollständig beantwortet habe, da ich genau bin für den Teil suchen

runYourCommand(msg.Command, ch) 

, die ich die Logik erraten enthält :)

Update: Ich suche nicht mehr nach externen Ressourcen, ich habe weitere Eingaben von this java snippet

Es sieht aus wie sie das Protokoll scp emulieren und ich wäre vollkommen in Ordnung, jemanden zu haben, der mir hilft zu übersetzen, es zu gehen:

StringBuilder params = new StringBuilder("C0").append(perms); 
    params.append(" ").append(data.length).append(" "); 
    params.append(remoteFileName).append("\n"); 

    out.write(params.toString().getBytes()); 
    out.flush(); 

    if (!waitForInputStream(logger, in)) { 
    cleanup(logger, out, channel); 
    logger.log(Level.SEVERE, "Error before writing SCP bytes"); 
    return UNKNOWN_ERROR;   /* TODO: Improve */ 
    } 

    out.write(data); 
    out.write(new byte[]{0}, 0, 1); 
    out.flush(); 

ich schon versucht, diese so weit, aber nicht helfen

o:="Some content of a faked file" 
connection.Write([]byte("C0644 "+string(len(o))+"test.txt\n")) 
connection.Write([]byte(o)) 
connection.Write([]byte{0,0,1}) 

Zur Klarstellung: Ich nicht, dann lieber eine Datei gehen möchte eine echte Datei dienen Simulieren Lieferung über scp (mit einem String als Inhalt der Datei).

Vielen Dank im Voraus!

+0

Ich finde diese Frage sowohl faszinierend als auch gut geschrieben, aber wie es ist, sollte es geschlossen werden, weil es als eine Anfrage für eine externe Ressource geschrieben ist, die nicht erlaubt ist DAMIT. Kann es vielleicht umgeschrieben werden [die Richtlinien zu erfüllen] (https://stackoverflow.com/help/on-topic)? – Adrian

+1

'scp' ist nicht Teil des ssh-Protokolls, sondern ein externes Programm. Der ssh-Server tut nichts speziell für "scp", er führt nur den vom Client gesendeten Befehl "scp" aus. – JimB

Antwort

0

Ok, ich fand die Lösung, klein, aber das machte den Code Arbeit:

prep := "C0644 " + strconv.Itoa(len(o)) + " test.txt\n" 
connection.Write([]byte(prep)) 
connection.Write([]byte(o)) 
connection.Write([]byte("\x00")) 

ich einen Platz in prep Variable nach Länge fehlt, wurde die Länge nicht korrekt umgesetzt und das abschließende „\ x00“ funktioniert auf diese Weise besser. Jetzt bin ich in der Lage, eine gefälschte Datei mit Inhalt zu erhalten :)