나는 이런 일을하고 싶다 :
scp local_file remote_server:/some_directory
하지만 /some_directory에 대한 권한을 얻으려면 를 호출해야 합니다 sudo
. 비슷한 질문이 여기에서 여러 번 요청되었다는 것을 알고 있지만 대부분의 답변은 sudo
비밀번호 캐싱을 이용하거나(어떤 이유로 두 번의 연속 호출에서는 작동하지 않는 것 같습니다 ssh
) 우리가 루트라는 사실입니다(그래서 우리는 비밀번호를 설정하지 않거나 sudo
SSH를 루트로 허용할 수 있습니다).
후자의 경우 두 솔루션 모두 안전해 보이지 않으므로 루트가 되기 위한 요구 사항이 없으므로 sudo
시스템을 재구성할 수 없다고 가정하겠습니다. 이 경우 단순히 파일을 복사하려면 어떻게 해야 합니까?
지금까지 시도한 내용은 다음과 같습니다.
(
read -s -p 'Enter password: ' pass;
echo $pass ;
tar cf - local_file ) | ssh -t -t remote_server 'sudo tar -C /some_directory' )
더 좋은 방법이 있나요?
답변1
나는 이 문제를 해결하는 우아한 방법을 찾았습니다명명된 파이프. 아이디어는 원격 측에서 tar 명령을 실행하여 이를 수행하는 것입니다.선입선출일반 사용자가 소켓을 읽을 수 있도록 만드세요.
여기에 예가 있습니다. 원격 측에서는 먼저 소켓을 만듭니다.
remote$ sudo -s
remote# mkfifo -m 600 /home/anarcat/tmpfifo
remote# chown anarcat /home/anarcat/tmpfifo
로컬 측에서는 이미 소켓에서 읽기를 시작할 수 있습니다.
local$ ssh example.net "cat tmpfifo" | pv -s 2G | tar xfz -
(이 pv -s 2G |
부분은 멋진 진행률 표시줄을 얻기 위한 완전히 선택 사항입니다.파이프 뷰어.)
그런 다음 원격 측에서 쓰기를 시작할 수 있습니다.
remote# tar cfz /home/anarcat/tmpfifo files
이는 files
SSH 연결을 통해 복제됩니다. 물론 원격 서버에서 직접 tarball을 생성하여 사용자가 액세스할 수 있도록 할 수도 있지만 이렇게 하려면 아카이브의 모든 공간이 필요하므로 사용하지 못할 수도 있습니다.
이 작업을 완료한 후에는 fifo
간단한 파일로 삭제할 수 있습니다.
remote$ rm /home/anarcat/tmpfifo