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!
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
'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