sudo를 사용하여 원격 서버에 scp


65

서버 A에 파일이 있습니다 (NAT 뒤에 있으므로 직접 주소를 지정할 수 없습니다). 루트로 제한된 디렉토리에서 파일을 서버 B로 복사해야합니다. 서버 B에 sudo 권한이있는 계정이 있습니다. scp 명령의 구문은 무엇입니까?



질문자가 해당 질문의 소유권을 다시 얻지 못했기 때문에 이전 질문을이 질문의 복제본으로 닫았습니다.
— quck quixote

scp를 사용자 정의하여 sudo를 직접 수행하는 방법 에 대한 다른 게시물 에 답변했습니다 . 이것은 WinSCP와 유사합니다.
— YoYo

답변:


58

먼저 sudo없이 쓰기 권한이있는 곳에 파일을 복사해야합니다.

scp yourfile serverb:

그런 다음 sudo를 사용하여 파일을 이동하십시오.

ssh serverb sudo mv yourfile /path/to/the/destination

쓰기 가능한 장소가 없으면 사용자에게 쓰기 권한이있는 임시 디렉토리를 만드십시오.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp는 (보통) 모든 사용자가 액세스 할 수있는 임시 파일을 작성하기에 좋은 장소입니다.
— Doug Harris

3
@Doug : / tmp는 RAM 또는 마운트 지점에있을 수 있으며 반드시 큰 파일을 호스팅 할만큼 크지는 않습니다.
— Ravachol

2
당신이 무엇을하려고 chmod 777하던 간에, 보통 그것을하는 잘못된 방법입니다. 다른 사람이 로그인하여이 코드를 실행하려고한다는 것을 알고 있다면 어떤 일이 발생할 수 있는지 고려하십시오.
— tripleee

1
ssh sudo나를 위해 작동하지 않습니다-tty가없고 askpass 프로그램이 지정되지 않았다고 불평합니까?
— Ross Presser

1
@RossPresser 답변이 늦어 죄송하지만 비밀번호가없는 sudo를 설정 serverb하거나 ssh serverb별도로 sudo ...로그인 한 다음 로그인 한 후 실행 해야합니다 .
— Johan

49

SCP를 사용하면 두 단계를 거쳐야하지만 다음과 같이 rsync로 한 번에 수행 할 수 있습니다.

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

참고 : NOPASSWDsudo 구성 이 필요 합니다. sudo의 비밀번호를 입력해야하는 경우 2 단계가 필요합니다.

디렉토리를 복사하려면 -r매개 변수 를 추가해야합니다 . 그리고 -v자세한 출력을 위해.


자격 증명과 함께 위의 방법을 사용하려면 ~/.ssh/config파일에 해당 방법을 추가해야 합니다. 예 :

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
이것이 가장 간단한 방법입니다.
— 매트 화이트

에 sudo: sorry, you must have a tty to run sudo의해 수정 된 오류 -e "ssh -tt"입니다.
— mj41

@ mj41으로 -e "ssh -tt", 내가 얻을 protocol version mismatch -- is your shell clean?. 그 문제를 해결하는 방법에 대한 힌트가 있습니까?
— 도끼.

19

ssh 및 tar를 사용하여이 문제를 해결할 수 있습니다.

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

먼저 sudo 타임 스탬프를 업데이트하고 (필요한 경우 tty ( ssh -t) 가 필요한 비밀번호 요청 ) sudo를 사용하여 원격으로 타르볼을 생성하고 로컬로 추출합니다.

RedHat 5의 "tar"는 "xpsf-"명령 뒤에 "--preserve"옵션이 필요합니다.


참고 사항 :을 얻는 경우 tar: Invalid replacement string에서 제거 -s하면 문제를 해결하는 것 같습니다 ( s어쨌든 필요한 것이 확실하지 않음 ). 많은 감사합니다. 대단해.
— 재귀 적으로 Ironic

이것은 요구 tty_tickets, 올바른 비활성화?
— Jacob Budin

@JacobBudin 예.
— blueyed

4

예를 들어 sudo 명령과 함께 sftp를 사용할 수 있습니다.

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

이 방법과 rsync 방법은 아마도 한 단계에서 가장 직접적인 방법 일 것입니다. Ant의 scp 태스크가이를 지원하지 않는 것은 유감입니다. sftp를 사용하도록 설정할 수 있지만 원격 하위 프로그램을 수정할 수는 없습니다. 서브 프로그램은 서버 유형에 따라 다릅니다 (Solaris는 다를 수 있음).
— YoYo

0

sudo의 비밀번호를 매번 입력해야하는 경우 파일에 저장할 수 있습니다.

echo "Enter password: "; read -s password; echo $password > password_file

그런 다음 소스 파일과 함께 보내십시오.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

더 많은 유틸리티가 없다면 tee대신 사용할 수 있습니다 sponge.


0

먼저 sudo없이 쓰기 권한이있는 위치에 파일을 복사해야합니다. 다음 두 단계를 수행 할 수 있습니다.

1 단계: scp filename newserver

2 단계: ssh newserver sudo mv filename /path/to/the/destination

자세한 내용 은 scp 자습서를 읽으십시오


-1
current server $ sudo scp username@server:source/path/filename /tmp/

현재 서버에서 특정 파일을 소스에서 / tmp /로 복사합니다.


sudo를 로컬로 실행하여 원격으로 높은 권한을 부여하지 않습니다.
— YoYo

@Yoyo가 말한 것처럼 이것은 작동하지 않습니다.
— Mani

scp는 아마도 루트 키를 읽을 것이기 때문에 연결되지 않을 것입니다.
— Pierre-Olivier Vares
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.