8 Stimmen

Bash, stdout-Umleitung von Befehlen wie scp

Ich habe ein Bash-Skript mit einigen scp-Befehlen darin. Es funktioniert sehr gut, aber wenn ich versuche, mein stdout mit "" umzuleiten. ./myscript.sh >log ", werden nur meine expliziten Echos in der "Log"-Datei angezeigt. Die scp-Ausgabe fehlt.

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi

Ok, was soll ich jetzt tun? Dankeschön

8voto

scp verwendet ein interaktives Terminal, um den schicken Fortschrittsbalken zu drucken. Diese Ausgabe in eine Datei zu drucken, macht überhaupt keinen Sinn, also scp erkennt, wenn seine Ausgabe an einen anderen Ort als ein Terminal umgeleitet wird, und schaltet diese Ausgabe ab.

Es ist jedoch sinnvoll, die Fehlerausgabe in die Datei umzuleiten, falls es Fehler gibt. Wenn Sie möchten, können Sie die Standardausgabe deaktivieren.

Es gibt zwei Möglichkeiten, dies zu tun. Die erste ist, Ihr Skript mit Umleitung von stderr und stdout in die Protokolldatei aufzurufen:

./myscript.sh >log 2>&1

Zweitens können Sie die Bash anweisen, dies direkt in Ihrem Skript zu tun:

#!/bin/sh

exec 2>&1

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi

...

Wenn Sie nach Fehlern suchen müssen, überprüfen Sie einfach, dass $? es 0 nachdem der Befehl scp ausgeführt wurde:

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
   RET=$?
   if [ $RET -ne 0 ]; then
      echo SOS 2>&1
      exit $RET
   fi
fi

Eine weitere Möglichkeit ist die Durchführung set -e in Ihrem Skript, das das Bash-Skript anweist, einen Fehler zu melden, sobald einer der Befehle im Skript fehlschlägt:

#!/bin/bash

set -e

...

Ich hoffe, es hilft. Viel Glück!

5voto

Netzschrauber Punkte 101

Sie können Ihr tty einfach mit testen:

[ ~]#echo "hello" >/dev/tty
hello

Wenn das funktioniert, versuchen Sie es:

[ ~]# scp <user>@<host>:<source> /dev/tty 2>/dev/null

Das hat bei mir funktioniert...

2voto

Pada Punkte 646

Leider kann die Ausgabe von SCP nicht einfach nach stdout umgeleitet werden.

Ich wollte die durchschnittliche Übertragungsgeschwindigkeit meiner SCP-Übertragung ermitteln, und die einzige Möglichkeit, dies zu tun, bestand darin, stderr und stdout an eine Datei zu senden und die Datei dann wieder an stdout zu echoen.

Zum Beispiel:

#!/bin/sh
echo "Starting with upload test at `date`:"

scp -v -i /root/.ssh/upload_test_rsa /root/uploadtest.tar.gz speedtest@myhost:/home/speedtest/uploadtest.tar.gz > /tmp/scp.log 2>&1
grep -i bytes /tmp/scp.log
rm -f /tmp/scp.log

echo "Done with upload test at `date`."

Dies würde zu folgender Ausgabe führen:

Starting with upload test at Thu Sep 20 13:04:44 SAST 2012:
Transferred: sent 10191920, received 5016 bytes, in 15.7 seconds
Bytes per second: sent 650371.2, received 320.1
Done with upload test at Thu Sep 20 13:05:04 SAST 2012.

2voto

MatthewD Punkte 2389

Ich habe eine grobe Lösung für scp gefunden:

$ scp -qv $USER@$HOST:$SRC $DEST

Laut der scp-Manualseite, -q (quiet) deaktiviert die Fortschrittsanzeige und alle anderen Ausgaben. hinzufügen -v (verbose), erhalten Sie haufenweise Ausgaben... und die Fortschrittsanzeige ist immer noch deaktiviert! Wenn Sie die Fortschrittsanzeige deaktivieren, können Sie die Ausgabe in eine Datei umleiten.

Wenn Sie nicht die gesamte Debug-Ausgabe zur Authentifizierung benötigen, leiten Sie die Ausgabe nach stdout um und lassen Sie die Bits, die Sie nicht benötigen, auslesen:

$ scp -qv $USER@$HOST:$SRC $DEST 2>&1 | grep -v debug

Die endgültige Ausgabe sieht etwa so aus:

Executing: program /usr/bin/ssh host myhost, user (unspecified), command scp -v -f ~/file.txt
OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013
Warning: Permanently added 'myhost,10.0.0.1' (ECDSA) to the list of known hosts.
Authenticated to myhost ([10.0.0.1]:22).
Sending file modes: C0644 426 file.txt
Sink: C0644 426 file.txt
Transferred: sent 2744, received 2464 bytes, in 0.0 seconds
Bytes per second: sent 108772.7, received 97673.4

Außerdem kann dies in eine Datei umgeleitet werden:

$ scp -qv $USER@$HOST:$SRC $DEST 2>&1 | grep -v debug > scplog.txt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X