SSH 및 if 문을 사용하여 파일이 원격 서버에 체크인되었는지 테스트하는 방법

SSH 및 if 문을 사용하여 파일이 원격 서버에 체크인되었는지 테스트하는 방법

파일이 있는지 테스트하려고합니다 $SSHPATH/$ID.*. sshpass비밀번호를 입력하지 않아도 되도록 비밀번호를 제공하는 데 사용합니다 .

파일이 존재하지 않으면 코드를 실행하고 싶습니다

if [ "sshpass -p $SSHPASS ssh root@$SSHHOST test ! -f $SSHPATH/$ID.*" ]; then

파일이 원격 서버에 존재하더라도 true를 반환하는 것 같습니다. 왜?

중복은 아닌거 같은데명령이 성공하거나 실패할 경우 조건부로 작업을 수행하는 방법이것도 작동하지 않기 때문에 파일이 존재하지 않으면 실행되지 않습니다.

if sshpass -p "$SSHPASS" ssh "root@$SSHHOST" test ! -f "$SSHPATH/$ID.*"; then

답변1

pLumo가 설명하듯이, 테스트는 항상 성공합니다.

당신이 원하는 것은 당신의 패턴이 $SSHPATH/$ID.*어떤 것으로 확장될 수 있는지 테스트하는 것입니다. 패턴이 여러 이름으로 확장될 수 있고 테스트는 단일 경로 이름에만 적용될 수 있으므로 이는 -f일반 파일에 대한 테스트와 다릅니다 .-f

로컬에서는 다음 명령을 사용하여 이 작업을 수행할 수 있습니다.

set -- "$SSHPATH/$ID".*
if [ -e "$1" ]; then ...; fi

이는 위치 매개변수( 등)를 주어진 패턴과 일치하는 이름 $1으로 설정합니다 . 그런 다음 이러한 문은 첫 번째 일치 항목이 기존 이름인지 테스트합니다(패턴이 일치하는 항목이 없으면 대부분의 셸에서 확장되지 않은 상태로 유지됩니다).$2setif

이것을 실행하려면 ssh:

ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"

불안정한 기준은 이를 보장하고 $SSHPATH확장 $ID됩니다.현지의쉘 및 "$1"원격 확장.

ssh패턴이 기존 이름과 일치하면 종료 상태는 0("성공")이고, 일치하지 않거나 어떤 방식으로든 실패하면 종료 상태는 0이 아닙니다("실패").

if다음과 같은 선언에서 사용할 수 있습니다.

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"; then
   # do something for success
else
   # do something for failure
fi

시험아니요- 존재, 음성 테스트:

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ ! -e \"\$1\" ]"; then
   # do something for failure
else
   # do something for success
fi

나는 당신의 사용을 간과했지만 sshpass아마도 ssh 질문에서했던 것처럼 접두사를 붙일 수 있습니다.

답변2

첫 번째 명령은 동일합니다

if [ "some string" ]; then ... fi

이것은 항상 사실입니다.

두 번째 명령은 거의 정확하지만 내부 따옴표를 추가하거나 이스케이프해야 합니다. !그렇지 않으면 쉘에서 해석됩니다.

경로의 특수 문자 문제를 방지하려면 전체 명령을 큰따옴표로 묶고 경로를 작은따옴표로 묶으십시오. *작은따옴표 밖에 다음이 있는지 확인하세요 .

if sshpass -p "$SSHPASS" ssh root@$SSHHOST "test ! -f '$SSHPATH/$ID.'*"; then ... fi

패턴이 여러 파일과 일치하는 경우테스트는 실패할 것이다.

관련 정보