내 서버의 동일한 폴더에 두 개의 이미지(image1.png 및 image2.png)가 있고 image2.png를 image1.png로 덮어쓰는 명령을 실행하고 싶습니다. 이미지를 삭제하고 다른 이미지로 바꾸는 것보다 이미지를 덮어쓰는 것을 선호합니다. SSH 명령줄을 통해 어떻게 이를 달성할 수 있나요?
답변1
ssh host "cd path/to/directory && cp image1.png image2.png"
예를 들어 오타로 인해 실패한 경우보다 안전 &&
합니다. 이 경우 잘못된 파일을 복사하는 대신 실행이 발생하지 않습니다.;
cd
cp
답변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"| command
ssh -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
귀하의 비밀번호와 서버에 대한 전체 액세스 권한만 있으면 된다는 뜻입니다. 따라서 서버에 액세스할 수 있는 공격자는 이제 원하는 것은 무엇이든 할 수 있습니다.