"ssh"를 사용하여 별표 문자("*")가 포함된 "mv" 명령을 실행합니다.

"ssh"를 사용하여 별표 문자("*")가 포함된 "mv" 명령을 실행합니다.

저는 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과 마찬가지로 , 및 로 분할 되며 리터럴의 합계는 분할되지 않습니다.)$hostmachine$IFSanadmin@machineadmin@mchieanadmin

당신은 그것을 원하지만 :

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")sshdexecute("sh", "-c", "echo foo;reboot #.txt")


/repo¹ 존재하거나 유형이 아닌 경우에 유의하십시오.목차(또는 디렉토리에 대한 심볼릭 링크) repo/environments/qa/*단 하나의 파일로 확장합니다.이름 바꾸기,이동하다(대이사 오다) /repo; /repo문제를 방지하고 /repo/디렉토리가 아닌 경우 오류를 보고하도록 변경되었습니다./repo

관련 정보