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.