2012-10-11 82 views
18

我想檢查遠程主機上是否存在某個文件。 我嘗試這樣做:用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

你試圖執行該文件... –

+1

一般情況下, 'then'前面需要一個分號:'if cmd;然後cmd;其他cmd; fi' –

回答

23

這個問題的答案無處不在。以下是一個簡單的方法。

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

fi 
+0

如何反轉if? '如果[-n ...]'? – redolent

+0

你可以通過添加感嘆號來反轉if! – Ernestas

+10

如果你只是使用'test'而不是'stat',這會更好。 'test'是IEEE標準。 'stat'是非標準的。 'test'在失敗時不會輸出消息,它只是返回一個標準的退出狀態。 – kojiro

3

你錯過;秒。如果你把它們都放在一個行的一般語法是:

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

thing可以幾乎任何返回退出代碼。如果thing返回0,則採用then分支,否則採用else分支。

[沒有語法,它的test程序(看看ls /bin/[,它確實存在,man test的文檔–雖然也可以有一個內置的版本有不同的/附加功能。)這是用來測試各種文件和變量的常見條件。 (注意另一方面語法,並由您的shell處理,如果它支持它)。

對於你的情況,你不想直接使用test,你想在遠程主機上測試一些東西。所以試試這樣的:

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

它甚至不應該是'if [',而只是'如果ssh ...'。 –

+0

相當正確的是,沒有將它們連接在一起看着這兩個問題。 – Mat

30

除了上述問題的答案,有速記的方式來做到這一點:

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

-q是安靜模式,它可以抑制警告和消息。

正如@Mat提到的,這樣測試的一個好處是,你可以很容易地換出-f爲你喜歡的任何測試操作:-nt-d-s等等

測試操作:http://tldp.org/LDP/abs/html/fto.html

+4

+1,但是這假定接收主機有bash,並且它是用戶的默認shell。 – kojiro

+1

我真的很喜歡你的解決方案。只是像我這樣的一些新生if-else version:if ssh -q $ {HOST} [[-f $ {FILE_PATH}]];然後回顯「文件存在」;否則「找不到文件」; fi – yatsa

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

以上將在您運行ssh命令的計算機上運行echo命令。要讓遠程服務器運行命令:

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

您可以指定遠程主機在本地使用的shell。

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

並小心(單)引用您希望由遠程主機擴展的變量;否則可變擴展將由您的本地shell完成!

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

因此,要檢查是否有特定的文件在遠程主機上存在,你可以做到以下幾點:

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

無法獲得簡單得多比這個:)

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

嗯,是的,你可以換出'[$? -eq 0]''ssh'命令本身:) – dimo414

+2

其實我發現你的解決方案是所有建議想法中最好的一個! – GhostCat

4

一條線,適當引用

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

我想還要檢查遠程文件是否存在,但使用RSH。我已經嘗試了以前的解決方案,但他們不適用於RSH。

最後,我做我的短功能的正常工作:

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

在CentOS機器,爲我工作的oneliner的bash:

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

它需要的I/O重定向(如頂部答案)以及圍繞命令在遠程運行的引號。如果文件存在

1

測試:

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

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

而相反,測試如果文件不存在:

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

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