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" 를 검색하여 위 명령어를 확실히 이해하는 것도 좋다.
$ 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" 이런식으로 하면된다.
'학습자료(~2017) > 리눅스' 카테고리의 다른 글
[Linux] NTP local time server 설정 (0) | 2013.09.25 |
---|---|
[linux] 두 장비사이의 네트워크 속도 측정 유틸 iperf (0) | 2013.08.09 |
[linux] 패스워드 없이 sudo 실행하기 (0) | 2013.08.08 |
[linux] sudo 사용시 리다이렉션(>) 방법, 파일 전송 방법 (root 권한 폴더에) (0) | 2013.08.08 |
[linux] ubuntu 에서 p255p1 을 eth0로 바꾸기, udev rule eth0 (0) | 2013.08.07 |