저는 Linux에 대한 경험이 없지만 매일 배우고 있습니다.
나에게는 이 명령이 있습니다.
ssh admin@$host mv repo/environments/qa/* /repo
이 *
문자는 environments/qa
디렉터리의 모든 항목이 해당 /repo
디렉터리에 저장된다는 의미입니까? 이미 존재하는 경우 대체됩니까?
죄송합니다. 저는 쉘 명령에 대한 경험이 없습니다. 그냥 확인하고 싶었어요.
답변1
다른 언어로 번역됨:
ssh admin@$host mv repo/environments/qa/* /repo
쉘 명령(sh 또는 bash와 같은 POSIX 쉘을 가정)은 다음과 같습니다.
execute("ssh", glob(split("admin@" + $host)), "mv", glob("repo/environments/qa/*"), "/repo");
(문자를 기준으로 분할 $IFS
하지만 확장 부분만 기준으로 합니다 . is 및 포함 $host
과 마찬가지로 , 및 로 분할 되며 리터럴의 합계는 분할되지 않습니다.)$host
machine
$IFS
an
admin@machine
admin@m
chi
e
a
n
admin
당신은 그것을 원하지만 :
execute("ssh", "admin@" + $host, "mv repo/environments/qa/* /repo")
셸의 구문은 다음과 같습니다.
ssh admin@"$host" 'mv repo/environments/qa/* /repo'
ssh
문자열은 원격 서버 mv repo/environment/qa/* /repo
로 전달되므로 sshd
해석을 위해 원격 사용자의 로그인 셸로 전달될 수 있습니다. 일반적으로 다음과 같습니다.
execute("that-shell", "-c", "mv repo/environments/qa/* /repo")
대부분의 셸에서 이는 다음과 같습니다.
execute("mv", glob("repo/environments/qa/*"), "/repo")
mv
숨겨지지 않은 모든 파일(다음을 포함한 모든 유형)을 이동하도록 지시합니다 .목차) (자체는 사용자의 홈 디렉토리로 초기화되어야 하는 repo/environments/qa
쉘 프로세스의 현재 작업 디렉토리에 대한 상대 경로 )를 1로 설정합니다.sshd
/repo
이로부터 몇 가지 결론을 도출할 수 있습니다.
위와 같은 매개변수 확장은
$host
분할+글로브를 방지하기 위해 거의 항상 인용되어야 합니다.원격 시스템의 쉘이 glob을 확장하기를 원하므로
*
문자 그대로 전달되어야 합니다.ssh
쉘 코드를 원격으로 해석하면 간단한 명령이 실행되지 않는다는 점을 기억하는 것이 중요합니다 . 여러 인수를 전달하는 경우 공백으로 연결하여 원격 셸에 전달할 코드를 형성하지만 간단한 명령이 아닌 셸 코드라는 점을 기억하려면 코드 인수만 전달하는 것이 좋습니다. 및 원격 쉘 구문의 모든 특수 문자는 이와 같이 처리됩니다.ssh host echo *.txt
예를 들어, 이 작업은*.txt
로컬 셸에 의해 확장되어 완료foo;reboot #.txt
되므로 수행하지 마세요 . 호출 중인 현재 작업 디렉터리에 파일이 있으면 실행 하고 다시 시작하세요.execute("ssh", "host", "echo", "foo;reboot #.txt")
sshd
execute("sh", "-c", "echo foo;reboot #.txt")
/repo
¹ 존재하거나 유형이 아닌 경우에 유의하십시오.목차(또는 디렉토리에 대한 심볼릭 링크) repo/environments/qa/*
단 하나의 파일로 확장합니다.이름 바꾸기,이동하다(대이사 오다) /repo
; /repo
문제를 방지하고 /repo/
디렉토리가 아닌 경우 오류를 보고하도록 변경되었습니다./repo