2012-10-11 30 views
18

Tôi muốn kiểm tra xem một tệp nhất định có tồn tại trên máy chủ từ xa hay không. Tôi đã thử điều này:kiểm tra xem tệp có tồn tại trên máy chủ từ xa với 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

Bạn đang cố gắng để thực hiện tập tin đó ... –

+1

Nói chung, bạn cần một dấu chấm phẩy trước 'sau đó':' nếu cmd; sau đó cmd; khác cmd; fi' –

Trả lời

23

Câu trả lời cho câu hỏi này ở khắp mọi nơi. Sau đây là một cách tiếp cận đơn giản.

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

fi 
+0

Làm cách nào để đảo ngược nếu? 'if [-n ...]'? – redolent

+0

Bạn có thể đảo ngược nếu bằng cách thêm dấu chấm than! – Ernestas

+10

Điều này sẽ tốt hơn nếu bạn chỉ sử dụng 'test' thay cho' stat'. 'test' là một chuẩn IEEE. 'stat' không chuẩn. 'test' sẽ không xuất ra thông báo lỗi, nó chỉ trả về trạng thái thoát chuẩn. – kojiro

3

Bạn đang thiếu ; s. Cú pháp chung nếu bạn đặt nó tất cả trong một dòng sẽ là:

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

các thing có thể được khá nhiều bất cứ điều gì mà trả về một mã thoát. Chi nhánh then được lấy nếu số thing trả về 0, chi nhánh else nếu không.

[ không phải là cú pháp, đó là chương trình test (kiểm tra ls /bin/[, nó thực sự tồn tại, man test cho các tài liệu – mặc dù cũng có thể có một built-in phiên bản với các tính năng khác nhau/bổ sung.) Được sử dụng để kiểm tra khác nhau điều kiện chung trên các tệp và biến. (Lưu ý rằng [[ mặt khác, là cú pháp và được xử lý bởi trình bao của bạn, nếu nó hỗ trợ nó).

Đối với trường hợp của bạn, bạn không muốn sử dụng trực tiếp test, bạn muốn kiểm tra điều gì đó trên máy chủ từ xa. Vì vậy, hãy thử một cái gì đó như:

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

Nó thậm chí không nên là 'if [', nhưng chỉ là 'nếu ssh ...'. –

+0

Khá đúng, đang xem xét hai vấn đề mà không liên kết chúng với nhau. – Mat

30

Ngoài các câu trả lời ở trên, có là cách viết tắt để làm điều đó:

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

-q là chế độ im lặng, nó sẽ ngăn chặn cảnh báo và tin nhắn.

Như @Mat đề cập, một trong những lợi thế của xét nghiệm như thế này là bạn có thể dễ dàng trao đổi trên các -f đối với bất kỳ nhà điều hành kiểm tra bạn thích: -nt, -d, -s vv ...

nhà khai thác thử nghiệm:http://tldp.org/LDP/abs/html/fto.html

+4

+1, nhưng điều này giả định rằng máy chủ nhận có bash và đó là vỏ mặc định của người dùng. – kojiro

+1

Tôi thực sự thực sự thích giải pháp của bạn. Và chỉ cho một số freshmen như tôi nếu phiên bản khác: nếu ssh -q $ {HOST} [[-f $ {FILE_PATH}]]; sau đó echo "File tồn tại"; không tìm thấy "File not found"; fi – yatsa

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

Ở trên sẽ chạy lệnh echo trên máy bạn đang chạy lệnh ssh. Để máy chủ từ xa chạy lệnh:

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

Bạn có thể chỉ định trình bao để máy chủ từ xa sử dụng cục bộ.

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

Và cẩn thận (đơn) báo giá các biến mà bạn muốn được mở rộng bởi máy chủ từ xa; nếu không mở rộng biến sẽ được thực hiện bởi trình bao địa phương của bạn!

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

Vì vậy, để kiểm tra xem một tập tin nhất định tồn tại trên máy chủ từ xa bạn có thể làm như sau:

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

Không thể có được đơn giản hơn nhiều hơn thế này :)

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

Vâng, có thể, bạn có thể hoán đổi '[$? -eq 0] 'với lệnh' ssh' :) – dimo414

+2

Thực ra tôi tìm ra giải pháp của bạn là giải pháp tốt nhất trong toàn bộ danh sách các ý tưởng được đề xuất! – GhostCat

4

một dòng, trích dẫn thích hợp

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

Tôi muốn cũng để kiểm tra xem một tập tin từ xa tồn tại nhưng với RSH. Tôi đã thử các giải pháp trước nhưng chúng không hoạt động với RSH.

Cuối cùng, tôi đã làm tôi chức năng ngắn mà hoạt động tốt:

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

Trên máy CentOS, bash oneliner mà làm việc đối với tôi là:

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

Nó cần thiết I/O chuyển hướng (như câu trả lời hàng đầu) cũng như dấu ngoặc kép xung quanh lệnh được chạy trên điều khiển từ xa.

1

Kiểm tra xem một tập tin tồn tại:

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

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

Và ngược lại, kiểm tra nếu một tập tin không tồn tại:

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

if ! ssh $HOST "test -e $FILE"; then 
    echo "File does not exist." 
else 
    echo "File exists." 
fi 
Các vấn đề liên quan