파일 복사 및 기존 파일 덮어쓰기

파일 복사 및 기존 파일 덮어쓰기

내 서버의 동일한 폴더에 두 개의 이미지(image1.png 및 image2.png)가 있고 image2.png를 image1.png로 덮어쓰는 명령을 실행하고 싶습니다. 이미지를 삭제하고 다른 이미지로 바꾸는 것보다 이미지를 덮어쓰는 것을 선호합니다. SSH 명령줄을 통해 어떻게 이를 달성할 수 있나요?

답변1

ssh host "cd path/to/directory && cp image1.png image2.png"

예를 들어 오타로 인해 실패한 경우보다 안전 &&합니다. 이 경우 잘못된 파일을 복사하는 대신 실행이 발생하지 않습니다.;cdcp

답변2

sudo이 명령이 없으면 ssh server "cd path/to/directory && cp image1.png image2.png"특권적인 권한이 없습니다 chmod.

그러나 sudo이를 사용하고 나중에 실행하면 ssh원격 서버에서 비밀번호 입력을 얻지 못하므로 해결책은 다음과 같이 -S비밀번호를 사용하고 파이프하는 것입니다.sudo

ssh server " cd path/to/directory && echo sudo_password | sudo -S chmod 600 image2.png && cp image1.png image2.png"

편집하다:

그러나 @terdon이 표시되는 방식에서는 여기서 권한을 변경할 필요가 없지만 다음을 사용합니다.sudo cp , 그래서 우리는 다음을 얻습니다:

ssh server " cd path/to/directory && echo sudo_password | sudo -S cp image1.png image2.png"

또는 (비밀번호를 읽을 수 있다고 생각하는 경우)

ssh server -t " cd path/to/directory && sudo cp image1.png image2.png"

업데이트: @terdon도 나에게 경고했습니다. 가능한 구현을 강조하고 밑줄을 긋는 것이 중요하다고 생각하기 때문에 이것을 추가합니다.

-S를 사용하려면 이 제안을 제거하고 싶습니다. 필수는 아니며 매우 위험합니다(@mikserv의 의견 및 내 답변 참조). 이것도 무의미합니다. 언급한 유일한 "장점"은 파이프 기능입니다. 이는 극단적인 경우이며 대부분의 경우 서버에 직접 파이프할 수 있습니다. sshpass를 사용하거나 권장되는 대로 비밀번호 없는 sudo를 설정할 수도 있습니다. 서버 비밀번호를 일반 텍스트로 저장하지 않는 다양한 방법. – 테덴

한편으로 이것은 자동화에 좋으며, sudo비밀번호 프롬프트를 받을 필요가 없으며, 완전히 자동화된 코드/스크립트를 추가할 수 있습니다 sshpass -p password ssh....

그러나 서버에서는 ssh세션 중에 공개 텍스트로 제공되는 sudo 비밀번호를 다른 사람이 쉽게 읽을 수 있으므로 보안 측면에서 권장되지 않습니다. 그럼 꼭 갖고 sudo안전하게 ssh사용하세요ssh -t

ssh -t server "cd path/to/directory && sudo chmod 600 image2.png && cp image1.png image2.png"

예를 들어 -t파이핑은 불가능하지만 -S를 사용하고 비밀번호를 에코하는 것은 가능합니다.ssh "sudo command"| commandssh -t server "cd path/to/directory && sudo"|grep "text"ssh server 'echo password | sudo -S ls -l'| grep 'a'

답변3

SSH를 통해 서버에 연결하고 특정 명령을 실행하려면 SSH "command"만 있으면 됩니다.

귀하의 경우 파일(기본적으로 덮어쓰기됨)을 복사하려고 하므로 해당 cp명령이 필요합니다. 그것은 다음과 같이 작동합니다 cp /path/to/original /path/to/copy. 이제 댓글에서 이 작업을 시도하면 권한 거부 오류가 발생한다고 말씀하셨습니다. 이는 루트로 명령을 실행해야 함을 의미합니다. 이는 을 sudo사용하여 수행되므로 sudo cp /path/to/original /path/to/copy.

다음 문제는 ssh가 tty 없이 비대화형 쉘을 실행하므로 sudo비밀번호를 요청할 수 없다는 것입니다. -t이를 위해서는 ssh를 사용해야 합니다. 따라서 이 모든 것을 종합하면 다음과 같은 작업을 수행할 수 있습니다.

ssh -t user@server sudo cp /path/to/image2.png /path/to/image1.png

하다아니요sudo제안된 다른 답변에 따라 비밀번호를 에코하는 데 사용됩니다 . 이는 시스템에 연결된 모든 사용자에게 표시되고 기록 파일에 일반 텍스트로 저장되므로 매우 위험합니다. 즉, 제가 해야 할 일은 grep sudo ~youruser/.bash_history귀하의 비밀번호와 서버에 대한 전체 액세스 권한만 있으면 된다는 뜻입니다. 따라서 서버에 액세스할 수 있는 공격자는 이제 원하는 것은 무엇이든 할 수 있습니다.

관련 정보