it-swarm.com.de

Überprüfen Sie mit ssh, ob die Datei auf dem Remote-Host vorhanden ist

Ich möchte überprüfen, ob auf dem Remote-Host eine bestimmte Datei vorhanden ist. Ich habe es versucht:

$ if [ ssh [email protected] -p 19999 -e /home/user/Dropbox/path/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi
-sh: syntax error: unexpected "else" (expecting "then") 
31
stdcerr

Hier ist ein einfacher Ansatz:

if ssh $Host stat $FILE_PATH \> /dev/null 2\>\&1
            then
                    echo "File exists"
            else
                    echo "File does not exist"

fi
37

Zusätzlich zu den obigen Antworten gibt es die Möglichkeit, dies in Kurzform zu tun:

ssh -q $Host [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist";

-q ist ein leiser Modus, der Warnungen und Meldungen unterdrückt.

Wie @Mat bereits erwähnte, besteht ein Vorteil solcher Tests darin, dass Sie die -f für jeden Testbetreiber, den Sie mögen: -nt, -d, -s etc...

Testoperatoren: http://tldp.org/LDP/abs/html/fto.html

40
JP Lew

Einfacher geht es nicht :)

ssh Host "test -e /path/to/file"
if [ $? -eq 0 ]; then
    # your file exists
fi
22
karni

eine Zeile, richtig zitiert

ssh remote_Host test -f "/path/to/file" && echo found || echo not found
9
estani

Du fehlst ;s. Die allgemeine Syntax wäre, wenn Sie alles in eine Zeile setzen:

if thing ; then ... ; else ... ; fi

Das thing kann so ziemlich alles sein, was einen Exit-Code zurückgibt. Der Zweig then wird verwendet, wenn dieser Zweig thing 0 zurückgibt, andernfalls der Zweig else.

[ ist keine Syntax, sondern das Programm test (check out ls /bin/[, es existiert tatsächlich, man test für die Dokumente - obwohl es auch eine integrierte Version mit verschiedenen/zusätzlichen Funktionen geben kann.), die zum Testen verschiedener allgemeiner Bedingungen für Dateien und Variablen verwendet wird. (Beachten Sie, dass [[ auf der anderen Seite ist Syntax und wird von Ihrer Shell gehandhabt, wenn es dies unterstützt).

In Ihrem Fall möchten Sie test nicht direkt verwenden, sondern etwas auf dem Remote-Host testen. Also versuche etwas wie:

if ssh [email protected] test -e "$file" ; then ... ; else ... ; fi
5
Mat

Testen Sie, ob eine Datei vorhanden ist:

Host="example.com"
FILE="/path/to/file"

if ssh $Host "test -e $FILE"; then
    echo "File exists."
else
    echo "File does not exist."
fi

Und im Gegenteil, testen Sie, ob eine Datei nicht existiert:

Host="example.com"
FILE="/path/to/file"

if ! ssh $Host "test -e $FILE"; then
    echo "File does not exist."
else
    echo "File exists."
fi
3
rouble
ssh -q $Host [[ -f $FILE_PATH ]] && echo "File exists"

Der obige Befehl führt den Echo-Befehl auf dem Computer aus, auf dem Sie den Befehl ssh ausführen. So veranlassen Sie den Remote-Server, den Befehl auszuführen:

ssh -q $Host "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
3
None

Sie können die Shell angeben, die vom Remote-Host lokal verwendet werden soll.

echo 'echo "Bash version: ${BASH_VERSION}"' | ssh -q localhost bash

Achten Sie darauf, die Variablen, die vom Remote-Host erweitert werden sollen, in (einfache) Anführungszeichen zu setzen. Andernfalls wird die variable Erweiterung von Ihrer lokalen Shell durchgeführt!

# example for local / remote variable expansion
{
echo "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" | 
    ssh -q localhost bash
echo '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' | 
    ssh -q localhost bash
}

So können Sie überprüfen, ob auf dem Remote-Host eine bestimmte Datei vorhanden ist:

Host='localhost'  # localhost as test case
file='~/.bash_history'
if `echo 'test -f '"${file}"' && exit 0 || exit 1' | ssh -q "${Host}" sh`; then
#if `echo '[[ -f '"${file}"' ]] && exit 0 || exit 1' | ssh -q "${Host}" bash`; then
   echo exists
else
   echo does not exist
fi
1
tarok

Auf der CentOS-Maschine war die Oneliner-Bash für mich:

if ssh <servername> "stat <filename> > /dev/null 2>&1"; then echo "file exists"; else echo "file doesnt exits"; fi

Für die Remote-Ausführung waren eine E/A-Umleitung (als Antwort oben) sowie Anführungszeichen für den Befehl erforderlich.

0
Abhimanu Kumar

Ich wollte auch überprüfen, ob eine entfernte Datei existiert, aber mit RSH. Ich habe die vorherigen Lösungen ausprobiert, aber sie funktionierten nicht mit RSH.

Zum Schluss habe ich noch eine kurze Funktion ausgeführt, die gut funktioniert:

function existRemoteFile ()
{
REMOTE=$1
FILE=$2
RESULT=$(rsh -l user $REMOTE  "test -e $FILE && echo \"0\" || echo \"1\"")
if [ $RESULT -eq 0 ]
then
    return 0
else
    return 1
fi
}
0
miguialberto