2012-10-11 10 views
18

Chciałbym sprawdzić, czy określony plik istnieje na zdalnym hoście. Próbowałem to:Sprawdź, czy plik istnieje na zdalnym hoście z ssh

$ if [ ssh [email protected] -p 19999 -e /home/reg/Dropbox/New_semiosNET/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") 
+0

Próbujesz wykonać ten plik ... –

+1

Ogólnie potrzebujesz "średnika" przed 'then':' if cmd; następnie cmd; else cmd; fi' –

Odpowiedz

23

Odpowiedzi na to pytanie są dostępne wszędzie. Oto proste podejście.

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

fi 
+0

Jak odwrócić, jeśli? 'jeśli [-n ...]'? – redolent

+0

Możesz odwrócić if, dodając wykrzyknik! – Ernestas

+10

Byłoby lepiej, gdyby użyłeś po prostu 'test' zamiast' stat'. 'test' to standard IEEE. 'stat' jest niestandardowe. 'test' nie wypisze komunikatów po awarii, po prostu zwraca standardowy status wyjścia. – kojiro

3

Brakuje ; s. Ogólna składnia jeśli umieścić je wszystkie w jednej linii byłoby:

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

thing może być prawie wszystko, co zwraca kod wyjścia. Oddział then jest brany, jeśli thing zwraca 0, else inaczej.

[ nie jest składnia, to program test (sprawdź ls /bin/[, to faktycznie istnieje, man test dla docs – chociaż może mieć również wbudowany w wersji z różnymi/dodatkowych funkcji.), Który służy do testowania różnych wspólne warunki dla plików i zmiennych. (Zauważ, że [[ z drugiej strony jest składnią i jest obsługiwane przez twoją powłokę, jeśli ją obsługuje).

W twoim przypadku nie chcesz bezpośrednio używać test, chcesz przetestować coś na zdalnym hoście. Wypróbuj coś takiego:

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

Nie powinno to być nawet 'if [', ale tylko 'jeśli ssh ...'. –

+0

Zupełnie słusznie, patrzyłem na dwa problemy bez łączenia ich razem. – Mat

30

Oprócz powyższych odpowiedzi nie jest skrótowym sposobem, aby to zrobić:

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

-q jest tryb cichy, będzie tłumić ostrzeżeń i komunikatów.

Jak wspomniano @Mat jedną zaletą testów, jak to jest, że można łatwo przełączać się z -f dla każdego operatora testowym odczuwalna: -nt, -d, -s etc ...

Operatorzy testowe:http://tldp.org/LDP/abs/html/fto.html

+4

+1, ale zakłada to, że host odbierający ma bash i że jest to domyślna powłoka użytkownika. – kojiro

+1

Naprawdę bardzo podoba mi się twoje rozwiązanie. I tylko dla niektórych pierwszaków takich jak ja, jeśli-else wersja: if ssh -q $ {HOST} [[-f $ {FILE_PATH}]]; następnie echo "Plik istnieje"; else "Nie znaleziono pliku"; fi – yatsa

1
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" 

Powyższe polecenie uruchomi komendę echo na komputerze, z którego uruchamiana jest komenda ssh. Aby serwer zdalny mógł uruchomić polecenie:

ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH" 
1

Możesz określić powłokę, która będzie używana lokalnie przez zdalnego hosta.

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

Zachowaj ostrożność, aby (jedno-) cytować zmienne, które chcesz rozszerzyć przez zdalny host; w przeciwnym razie zmienna ekspansja zostanie wykonana przez lokalną powłokę!

# 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 
} 

Tak więc, aby sprawdzić, czy dany plik istnieje na zdalnym komputerze można wykonać następujące czynności:

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 
17

Nie można uzyskać znacznie prostsze :)

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

Cóż, tak, możesz zamienić '[$? -eq 0] 'z poleceniem' ssh' :) – dimo414

+2

Właściwie uważam, że twoje rozwiązanie jest najlepsze spośród całej listy sugerowanych pomysłów! – GhostCat

4

jedna linia, właściwe cytowanie

ssh remote_host test -f "/path/to/file" && echo found || echo not found 
0

Chciałem również, aby sprawdzić, czy istnieje plik zdalny, ale z RSH. Próbowałem poprzednich rozwiązań, ale nie działały z RSH.

Wreszcie ja zrobiłem krótką funkcję, która działa prawidłowo:

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

Na maszynie CentOS, bash oneliner że pracował dla mnie brzmiało:

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

to potrzebne I/O przekierowania (jak górna odpowiedź), a także cytaty dotyczące polecenia do uruchomienia na zdalnym.

1

Sprawdza czy plik istnieje:

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

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

I odwrotnie, test, jeśli plik nie istnieje:

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

if ! ssh $HOST "test -e $FILE"; then 
    echo "File does not exist." 
else 
    echo "File exists." 
fi 
Powiązane problemy