Ich habe versehentlich gerade eine wichtige gemeinsam genutzte Bibliothek entfernt und jetzt kann keine dynamisch verknüpfte ausführbare Datei mehr ausgeführt werden. Beispielsweise /bin/ls
zeigt sogar error while loading shared libraries: libunwind.so.8: cannot open shared object file: No such file or directory
…
Ich kann die gelöschte Datei nicht einmal zurückkopieren, weil SSH nicht mehr funktioniert ( scp
keine neue Verbindung herstellen kann). Und ich kann die Festplatte nicht aus dem Computer entfernen und die richtige Datei zurückschreiben: Es handelt sich um ein eingebettetes Gerät und es gibt keine Wechselfestplatte.
Das Einzige, was ich habe, ist eine noch bestehende Shell-Sitzung, die ich auf keinen Fall schließen sollte, da ich sonst keine neue Sitzung öffnen kann.
Wie kann ich eine Binärdatei (gemeinsam genutzte Bibliothek) von einem anderen System nur mithilfe integrierter Shell-Befehle (wie etwa echo, printf, read usw.) übertragen?
Antwort1
Sie könnten den in Bash integrierten /dev/tcp TCP-Bus ausprobieren:
http://fibrevillage.com/scripting/603-dev-tcp-examples-and-trouble-shooting
Damit solltest du eine HTTP-Anfrage formulieren können, um die Datei per HTTP einzubinden.
Antwort2
Wenn /dev/tcp nicht verfügbar ist, kann die alternative Lösung verwendet werden, wie unten beschrieben.
Geben Sie auf dem Zielcomputer den folgenden Befehl ein:
(while read -s l; do echo "$l"; done) > temp.txt
Führen Sie dann auf dem PC die folgenden Aktionen aus:
- installieren
x11-utils
(brauchenxwininfo
) undxdotool
; - Ermitteln Sie die Fenster-ID der Konsole, in der die SSH-Sitzung läuft: Verwenden Sie
xwininfo
sie dafür. - Geben Sie zum Übertragen der Daten folgenden Befehl ein:
od -An -v -tx1 file.bin | (while read l; do xdotool type --delay 0 --window 0xa0000d "$(echo -e \"$l\r\")"; sleep 0.02; echo -ne .; done)
Wenn übertragene Daten in SSH-Konsolen im Rohhexadezimalformat angezeigt werden, müssen Sie die Verzögerung erhöhen (die Empfangsseite ist nicht schnell genug).
- Nachdem das Senden abgeschlossen ist, drücken Sie
Enter
undCtrl-D
in der SSH-Konsole und geben Sie dann den folgenden Befehl ein, um die empfangene Datei von Hex in Binär zu konvertieren:
(while read -s l; do for c in $l; do printf "\x$c"; done; done) < temp.txt > file.bin
Überprüfen Sie die Dateilänge mit dem Befehl:
(x=0; IFS=""; while read -d '' -s -r -n 1 c; do x=$(($x+1)); done; echo $x) < file.bin
.Und wenn die Länge übereinstimmt (es gingen also keine Daten während der unzuverlässigen Übertragung verloren), können Sie die Datei an den gewünschten Ort kopieren:
(IFS=""; while read -d '' -s -r -n 1 c; do printf "%c" "$c"; done) < file.bin > destination