학습자료(~2017)/리눅스

sudo 사용하는 환경에서 원격지에 파일 보내기 (sudo , scp)

단세포소년 2013. 8. 8. 21:20
반응형

sudo 를 사용하는 환경에서 원격지에 파일 보내기



파일을 보낼때 우리는 흔히 scp 를 이용한다. 이때 sudo 환경이라면 아래와 같이 실행할 것이다.

 $ sudo scp {sourcefile} {hostname}:/targetfile

위의 명령어의 경우 ubuntu와 같이 {hostname}의 장비가 root 를 사용하지 못하고 sudo 를 통해 권한을 이양받아 실행하는 환경이고 targetfile root 소유라면 이 명령어는 실패한다. (물론 targetfile 에 쓰기권한이 있다면 scp 써도 문제 없다.)

sudo scp {sourcefile} root:{hostname}:/targetfile 이렇게 실행하면 안되냐는 말이 있을것이다. ubuntu 의 경우 정책상 root의 비밀번호가 없다. 즉 root로 로그인이 불가능하다.(물론 sudo passwd 명령어도 root 패스워드 만들어주면 되지만 sudo를 쓰는 이유가 훼손된다.)


이때는 아래와 같이 하자.

 $ ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}"


tee 명령어를 사용한 이유는 리다이렉션은 쉘내장명령어라 sudo의 영향을 받지 않기 때문이다.

위의 명령어도 하나의 문제가 발생한다. ssh 를 통해 단일 명령어 실행시 sudo 와 같이 입력이 발생하는 경우 no tty ~~~~ 에러가 발생한다. 

이때는 패스워드 없이 sudo 사용하기 라고 구글링하거나 http://onecellboy.tistory.com/292 이 링크를 참고해라. sudo 실행시 패스워드를 묻지 않게 하는 방법이다.


간단하게 예를 들어 sourcefile의 내용이 "hello linux" 라면
ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}" 는
ssh {hostname} "echo 'hello linux' | sudo tee {targetfile}" 로 바뀌어 명령이 호출된다.


내가 위의 내용들을 정리해본 이유는 ubuntu 에서 미리 시스템 설정파일을 만들고 원격지에 /etc/network/interface와 같이 시스템설정 파일을 대체하려고 했는데 시스템설장 파일이 root 소유라 scp 로는 되지 않아서이다.


참고로 ssh {hostname} "echo '`cat {sourcefile}`' | sudo tee {targetfile}" 명령어는 백쿼트(backquote) 와 명령어 중첩, 리다이렉션 대신 tee를 활용한 명령이다.

구글링으로 "backquote shell script", "쉘 백쿼트" , "명령어 중첩", "tee" 를 검색하여 위 명령어를 확실히 이해하는 것도 좋다.





방법이 하나 더 있다.

그냥 원격지 장비의 /tmp 에 파일을 scp 한후 mv 명령으로 옮기는 것이다. (/tmp 디렉토리는 누구나 쓸수 있다.)

 $ scp {sourcefile} {hostname}:/tmp/

 $ ssh {hostname} "sudo mv /tmp/{sourcefile} {targetfilepath}" 


예를 들어

내 장비의 testfile 을 원격지(1.1.1.1) 장비의 /etc/target 으로 보내고 싶다.

scp testfile 1.1.1.1:/tmp

ssh 1.1.1.1 "sudo mv /tmp/testfile /etc/target"  이런식으로 하면된다.


반응형